文章目录
- 前言
- 创建对象
- new关键字的作用
- 构造方法
- 什么是初始化
- 构造方法的作用
- 构造方法的两种形式
- 参考引用
前言
这是我学习过程中做的总结,如有不对见谅。
创建对象
我们用Demo类来创建一个对象。
Demo demo=new Demo();
这一条语句,其实包括了四个动作:
1)右边的“new Demo”,是以Demo类为模板,在堆空间里创建一个Demo对象。
2)末尾的()意味着,在对象创建后,立即调用Demo类的构造函数,对刚生成的对象进行初始化。
3)左边的“Demo demo”创建了一个Demo类引用变量,它存放在栈空间中。也就是用来指向Demo对象的对象引用。
4)“=”操作符使对象引用指向刚创建的那个Demo对象。
形象说明:
如生产汽车,类只是汽车设计图,new可以理解为制造或生产,new car()可以看成是以car这个设计图默认的属性生产了一辆车,现在这个车就是实际存在的对象,它创建对象时构造函数使用设计图默认定义的车的形状、重量、油箱的容积等参数造的这辆车。而使用new car (shape,hight,tank_volume)传递参数来修改设计图的部分属性,然后再以修改后的图纸生产汽车。
实例:
1.首先创建一个类,我这里创建的是一个学生类,里面有学生的姓名、年龄。
//1.首先创建一个类,我这里创建的是一个学生类,里面有学生的姓名、年龄。
public class Student {
String name; //姓名
int age; //年龄
/*2.类是抽象的,需要实例化为具体的对象,也就是创建一个对象,实例化后会返回一个对象,我们就像这样new 一个对象,这里的lihua,lihong就是Student类的具体实例。代码如下*/
Student lihua = new Student();
Student lihong = new Student();
//3.对象初始化:接着需要对对象进行初始化,如果不初始化,输出的数据将会是默认值,代码如下
lihua.name="李华";
lihua.age=19;
lihong.name="李红";
lihong.age=18;
输出结果:
System.out.println(lihua.name);
System.out.println(lihua.age);
System.out.println(lihong.name);
System.out.println(lihong.age);
李华
19
李红
18
如果不初始化,我们来看一下运行结果 :
null
0
null
0
new关键字的作用
- new运算符实例化一个类对象的过程,通过给这个对象分配内存给实例变量赋默认值(半初始化)并返回一个指向该内存的引用。
- new运算符也调用了对象的构造函数。
- new运算符返回的引用可以不需要被赋值给变量,所以它也可以直接使用在一个表达式中。
例如: int height = new Rectangle().height; - 注意:
将成员变量赋默认值的是new而不是构造方法。 - 构造方法
Java提供了为类的成员变量赋初值的专门方法,其功能主要是完成对象的初始化。
什么是初始化
对象的创建过程主要分成三步,如下图展示的汇编码所示,主要是0,4,7这三步。
0 这步是为新创建的对象申请内存,但是此时对象中的成员变量的值是默认的值(半初始化),即下图a 的值此时是0;
4 初始化对象,在这步才把10赋给成员变量a
7 建立关联,把testDemo引用和new 出来的TestDemo对象建立关联
从这里我们可以看出初始化可以认为是显示赋值,其实是将对应类型的隐式赋值用显示赋值覆盖的过程。,把10赋给原先半初始化的a,此时的a=0,赋值之后a=10。初始化对象的属性,准确的说是为对象的属性显示赋值。
public class TestDemo {
private int a = 10;
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
// 0 new #2 <company/syncronized/TestDemo> 申请内存,半初始化,此时a的值是0(当对象刚new出来的时候会给里面的成员变量设置默认初始值,int类型的初始值是0)
// 3 dup 复制
// 4 invokespecial #3 <company/syncronized/TestDemo.<init>> 初始化,在这步把10赋给a,此时a的值是10
// 7 astore_1 testDemo和new TestDemo()建立关联
// 8 return
}
}
构造方法的作用
构造方法是类的一种特殊的方法,主要体现在下面几个方面:
- 构造方法的名字和类名完全相同
- 构造方法有返回值(返回值是一个已经初始化的对象),没有返回值的类型。不能在构造器里调用return;
- 如果定义一个类的时候没有定义构造方法,系统会自动生成一个无参构造方法,如果定义了一个有参构造方法,想要使用无参构造方法就需要重新定义无参构造方法。
- 构造方法只能用在 new 创建类的对象时由系统调用。
构造方法的两种形式
编写构造方法的目的是向对象传递参数(一般有参),以及对成员变量进行初始化(一般无参)。
参考引用
为什么——要实例化对象? - 山外已有山
(38条消息) 子类一定会调用父类的构造器吗?如果会,那么子类为什么要调用父类的构造器?benbenniaono1的博客-
子类一定会调用父类的构造器吗?如果会,那么子类为什么要调用父类的构造器?_benbenniaono1的博客