对象是真正存在的实体,是具体的事物
类是对实体的一种抽象,也可以看做是一种模板,对象则是使用模板制造的多个实物

我们如果把人看做是一个类(Person)
那么人有他自己的名字,年龄,性别等,这些是人的属性
但是人也可以吃饭,睡觉,玩游戏等,有许多动作,这些是所谓的方法

那么我们如何来定义一个类?

class Person{private String name;private int age;private String sex;}

这里我们定义了个类(Person),人有名字,年龄,性别,所以我们在这里定义了他的这些属性
为什么要在定义前加上private呢?
是因为为了保证我们代码的安全性,完整性,让这些属性私有化,不让外界的任何人可以进行访问
当然我们除了属性外,还有一些行为,我们在这里称之为方法,像我们人可以吃喝玩,所以我们可以向其中添加这些方法

class Person{private String name;private int age;private String sex;  public void eat(){System.out.println("Person eat!!");}public void sleep(){System.out.println("Person sleep!!!");}
}

像上面的代码中吃和睡都是人的一种行为,但是我们将其称为实例成员的方法或者函数
那么我们也可以在类中写一个静态的方法,显然也是可以的

public static void drink(){System.out.println("Person  drink");}public void show(){System.out.println("name: "+name+"age: "+age+"sex"+sex);}

当我们创建好了一个类,就需要实例化一个对象

public static void main(String[] args) {Person p1 = new Person();}

这里的p1就是引用变量对象,那么所创建的p1和我们的属性是怎么存储的呢?

如果我们没有给类中的名字,年龄这些属性赋值的话,那么会输出什么呢?
我在之前代码中写了一个show()函数,那么我们如果想要调用该函数/方法,我们需要通过对象名.方法这种方式来进行访问

public static void main(String[] args) {Person p1 = new Person();p1.show();}

输出结果为

name: null age: 0  sex: null

可以看出是其类型相对应的默认值
那么boolean的默认值为false
char类型的默认值为\u0000

值得注意的是,当我们想要访问drink()方法时,我们知道它定义的是一个静态的方法,我们输入p1.drink();进行访问时会出现警告,但是可以进行访问,那么我们如何来消除此警告呢?
我们需要通过类名.方法进行访问即可消除警告
Person.drink();

那么我们如何给class中定义的年龄这些赋值呢?
可以直接通过对象来赋值

public static void main(String[] args) {Person p1 = new Person();p1.show();System.out.println("======赋值后========");p1.drink();p1.age = 21;p1.name = ("Jack");p1.sex = ("男");p1.show();}

输出结果为

name: null age: 0  sex: null
======赋值后========
Person  drink
name: Jack age: 21  sex: 男

需要注意的是当我们定义时name是private String name 此时我们通过对象.方法是无法进行赋值的,会报错是因为其是私有的。

初始化还有一种方式是通过提供一系列的get和set方法来进行初始化

 public String getName(){return name;}public void setName(String name){this.name = name;}

我们利用这个方法也可以访问类中的数据,如访问name

public static void main(String[] args) {Person p1 = new Person();p1.show();System.out.println("======赋值后========");p1.getName();p1.setName("Jenny");p1.show();}

输出为:

name: null age: 0  sex: null
======赋值后========
name: Jenny age: 0  sex: null

可以看到名字改成了“Jenny”;那么如何快速的建立get和set方法呢?
我们可以在代码空白处点击鼠标右键中找到该按键

可以自动创建set和get方法

p1.getName();//获取对象p1中name的值
p1.setName("Jenny");//将Jenny赋值给p1对象中的name

我们也可以通过构造方法来实现初始化
现在我在calss Person{}中创建了两个新的构造函数

 public Person(){this.name = "Mary";this.age = 18;this.sex = "女";}public Person(String name,int age,String sex){this.name = name;this.age = age;this.sex = sex;}

值得注意一点的是我们两个方法用的都是类名Person()
但是没有报错是因为什么呢?
构造方法的重载
什么是构造方法的重载?
需要满足三个条件:
1.方法名相同
2.返回值相同
3.参数列表不同

那么我们在访问的时候如果访问第一个默认构造函数和第二个有参数的构造函数有什么不同呢?

public static void main(String[] args) {Person p1 = new Person();p1.show();System.out.println("======赋值后========");Person p2 = new Person("Lucy",19,"女");p2.show();}

输出为:

name: Mary age: 18  sex: 女
======赋值后========
name: Lucy age: 19  sex: 女

其中this引用:指向当前对象的内存并不是调用该方法的对象

若我们写下如下的代码

 public Person(){this("Mike",25,"男");System.out.println("Peroson init");     }public Person(String name,int age,String sex){this.name = name;this.age = age;this.sex = sex;System.out.println("Peroson(String,int,String)");}

当我们运行时会发现结果是这样的:

Peroson(String,int,String)
Peroson init
name: Mike age: 25  sex: 男

所以呢,可以看出是调用了带有三个参数的构造函数
如果有显示的构造函数,就不会调用默认的构造函数
this(“Mike”,25,”男”); 必须放在第一行的位置上,否则会报错,如

public Person(){System.out.println("Peroson init"); this("Mike",25,"男");//error}

对象的创建我们分为两步:
1.为对象分配内存
2.调用合适的构造函数

我们也可以采用实例代码块进行初始化,直接在Person类中加入实例代码块

class Person{String name;int age;String sex;{name = "Faker";age = 18;sex = "男";}

运行结果如下:

name: Faker age: 18  sex: 男

当然我们也可以使用静态代码块来进行初始化
静态变量是被所有实例共享的
类被加载时,静态代码块会执行,由于类只加载一次,因静态代码块只加载一次

static{System.out.println("静态代码块初始化");data = data2 +10;}

且static修饰的会在类实例化之前全部进行初始化

那么我们的初始化程序的顺序是什么呢?

class Person{String name;int age;String sex;public static int data = 10;public static final int data2 = 20;static{System.out.println("静态代码块初始化");data = data2 +10;}{System.out.println("实例代码块初始化");}public void eat(){int data1 = 10;int data3;data3 = data1 + 10;System.out.println(data3);System.out.println("Person eat!!");}public void show(){System.out.println("name: "+name+" age: "+age+"  sex: "+sex+" data: "+data);}public Person(){this("Mike",25,"男");System.out.println("Peroson init");     }public Person(String name,int age,String sex){this.name = name;this.age = age;this.sex = sex;System.out.println("Peroson(String,int,String)");}
}
public class TestDemo1 {public static void main(String[] args) {Person p1 = new Person();p1.show();   }
}

输出为:

静态代码块初始化
实例代码块初始化
Peroson(String,int,String)
Peroson init
name: Mike age: 25  sex: 男 data: 30

可以看出静态代码块初始化>实例代码块初始化>构造函数

类和对象定义以及四种初始化方式相关推荐

  1. Java面试题:final修饰的对象,有几种初始化方式

    final修饰的对象初始化时分两种情况: 第一种:修饰成员对象时有3种初始化方式: 1,在定义变量时直接赋值 2,声明完变量后在构造方法中为其赋值 3,声明完变量后在构造代码块中为其赋值 第二种:修饰 ...

  2. 数组的四种初始化方式

    第一种: 对数组的每一个成员都进行初始化 demo1: int age[8] = {23,23,21,45,3,23,34,12}; age[0] = {23}; age[1] = {23}; age ...

  3. oauth2四种授权方式小结

    序 本文主要小结一下oauth2的四种模式的特点和适用场景. 四种授权方式 OAuth 2.0定义了四种授权方式. 密码模式(resource owner password credentials) ...

  4. 单例模式的四种实现方式(饿汉模式、懒汉模式、静态内部类、枚举类)

    首先,设计模式是我们程序员在软件开发过程中面临的一般问题的解决方案,通过学习设计模式可以使我们在编程时更加有条理性,同时培养我们写代码的思维能力,从而提高我们的工作效率.接下来就跟着博主的脚步往下走吧 ...

  5. 第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移

    一. 四种初始化策略 EF的CodeFirst模式下数据库的初始化有四种策略: 1. CreateDatabaseIfNotExists:EF的默认策略,数据库不存在,生成数据库:一旦model发生变 ...

  6. 简述css属性选择器的几种定义方式_css的四种使用方式 css规则按选择器类型分为那四种...

    HTML中嵌入CSS的四种方式及优先级,如何选择 1. 行内样式行内样式就是把 CSS 样式直接放在代码行内的标签中,一般都是放入标签的style属性中,由于行内样式直接插入标签中,故是最直接的一种方 ...

  7. tp5类的属性不存在_thinkPHP5.1框架中Request类四种调用方式示例

    本文实例讲述了thinkPHP5.1框架中Request类四种调用方式.分享给大家供大家参考,具体如下: 1. 传统调用 访问方式:http://127.0.0.1/demo/demo3/test?n ...

  8. PHP:类和对象定义及使用

    类和对象定义及使用 <?php // 类 class Person{// 属性public $name;public $age;// 构造方法public function __construc ...

  9. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider...

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  10. Android数据的四种存储方式

    很清晰的思路,转自Android数据的四种存储方式 作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQL ...

最新文章

  1. 软件测试面试题-如何测试复制粘贴功能
  2. python爬取下拉列表数据_Python怎么爬取下拉式的网页?
  3. input type=range标签用法实例代码
  4. 利用链表实现可合并堆(算法导论第三版思考题10-2)
  5. 从尾到头打印单链表(C语言)
  6. python方法测试怀孕_在Python中测试私有方法(例外)
  7. shiny datatable child row:shiny表格二级子行的展开与折叠
  8. C#实现Excel导出
  9. 捷联惯导matlab算法,捷联惯导算法与组合导航原理讲义(20170220).pdf
  10. session过期时间
  11. html5字幕提取软件,VideoSubFinder(提取视频字幕软件)
  12. 此beta版已额满_《魔域口袋版》福利狂欢:现金红包天天送 魔石神器免费拿
  13. 为什么程序员要会linux
  14. 怎么取消工作组计算机,windows10系统如何退出workgroup工作组 windows10系统退出workgroup工作组的操作方法...
  15. 联想笔记本连不上手机热点_笔记本电脑连接不上手机热点该怎么解决?
  16. 转贴: 傅立叶级数(Fourier Series) 推导
  17. 【简书交友】阿群1986: 一个专注于修电脑做系统的青岛小哥
  18. jQuery 实现五星好评
  19. Logger日志文件记录
  20. STM32 Cube ADC 测量土壤湿度

热门文章

  1. 基于若依框架项目点击登录时出现TypeError: Cannot read properties of undefined (reading ‘user‘)
  2. Elesticsearch(es)聚合搜索(入门到精通)4
  3. mysql实现周月表_按天周月统计数据
  4. excel 2007 冻结单元格
  5. python读取文件名包含某字符的文件_Python 在当前和子目录中查找文件名中包含指定字符串的文件...
  6. Java技术--单点登录统一认证系统的实现
  7. android studio 扣费白屏,详解一次Vue低版本安卓白屏问题的解决过程
  8. ppt怎么把图片做成翻书效果_怎么把在PPT中插入的图片效果弄成翻书的样子啊?...
  9. Chia 云P图 全套解决方案
  10. 使用PPT保存300dpi或者指定dpi的高质量图片