五. 对象的构造及初始化
1.如何初始化对象
在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。
如果是对象:
需要调用之前写的SetName和SetAge方法才可以将具体的学生设置到对象中。
通过上述例子发现两个问题:
1. 每次对象创建好后调用SetName和SetAge方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用
2.构造方法
1.概念
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次。
小tips /构造方法:
名字与类名相同,没有返回值类型,设置为void也不行
一般情况下使用public修饰
在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间
2.特点:
1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法
上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载
5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。
一旦用户定义,编译器则不再生成。
6. 构造方法中,可以通过this调用其他构造方法来简化代码
this(...)(方法)必须是构造方法中第一条语句
不能形成环
3 默认初始化
在上文中提出的第二个问题:为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题 比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
4. 初始化所分配的空间 即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,
5.调用构造方法,给对象中各个成员赋值
4. 就地初始化
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
六、封装
1.封装的概念
面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说 就是套壳屏蔽细节。
比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用 户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户 只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳 子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
2.访问限定符
public :全部都可以使用
protected :同一个包或者不同包的子类可以使用,用于继承
default :默认的访问限定符,同一个包可以使用
private :只有在同一个类可以使用,封装常用
因为age用的是private所以不能直接引用需要调用方法
小tips:一般情况下成员变量设置为private,成员方法设置为public。