一.构造方法
1.与以前的不同
我们在没学构造方法之前,若要给我们的一个对象的属性赋值之类的,只能在实例化对象之后才能通过方法等途径去进行复制,但这种形式可以说是一种间接的对于对象属性的描述。 通过构造方法我们可以在创建之初就直接给我们的对象属性赋值。
2.作用
在建立之初便给对象赋值,更相当于一种出厂设置,当然我们是可以修改的
3.一些基础知识
每一个类,不管你是抽象类,还是普通类,final类型的类都是必须拥有自己的构造方法的,这是必须的,若是我们不手动写,则系统会自动给我们添加构造方法,不过只是一个空参数的构造方法。
格式 : 权限 方法名(参数列表){
注意方法名一定要与类名一模一样
}
二.构造方法的重载
构造方法在某些地方是与普通方法很像的,比如说可以重载
这种重载是通过参数列表的不同来进行的
三.this关键字(必须写在构造方法第一行)
在构造方法中最为重要的便是两个关键字的使用与理解
1.在前面的总结中我们已经说到this关键字是可以存储本类中的地址,然后通过指针进行一些同名数据的赋值等操作
public Person(String name,int age) { this.name=name; this.age=age; }
从我们上面的代码可看出,这种特性仍然没有丢失。
2.this()
这是直接通过this引用在本类中的另一个构造方法,因为我们的方法名与类名相同,所以这便涉及到了方法的重载
至于为什么要在一个类中引用自己的构造方法呐?
当我们存在多个构造方法时可能会出现功能相同的构造方法,如果我们要测试的话,就要在测试类中实例化两个对象,很麻烦,并且这些功能相同的方法在某种程度上更像是一种程序的赘余,很不好。
具体使用细节如下:
package cn.itcast.demo4; public class Person { private String name; private int num; //出于安全性考虑此处为私有定义 public Person() { this("刘宇剑",2); //this存的是有参构造方法2地址 //指向有参构造方法2,相当于是调用了2 System.out.println("我是一个空参构造方法"); } public Person(String name,int num) { this.name=name; this.num=num; } //这是构造方法2 public String getName() { //以下均为对私有类型的处理 return name; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } } package cn.itcast.demo4; /* * 测试类 */ public class Test { public static void main(String[] args) { Person pe=new Person(); //此处我们仅仅使用一个空参便可以 System.out.println(pe.getName()+pe.getNum()); } }
四.super关键字(必须写在构造方法第一行)
关于super关键字我们至少知道的是该关键字指向父类中的属性
1.父与子
其实无论在何种情况下,父类与子类之间最重要的便是继承,在我看来super的存在是为了完成对父类中构造方法的继承(这个就是个人理解了。。。)。 我们要首先清楚在子类继承中的一些知识:
类和类之间存在继承关系后,系统所自动添加的构造方法会有一个隐式代码super(),这个代码中的super存储了父类构造方法的地址,可以指向父类构造方法,进而继承父类构造方法中的属性
2.无论如何子类都要间接或者直接调用父类的构造方法
直接super()
间接:以this()作为中间桥梁代码如下:
package cn.itcast.demo6; public abstract class Person { private String name; private int age; public Person(String name,int age) { this.name=name; this.age=age; } //我下面把get,set方法删了,有点多。。 } package cn.itcast.demo6; public class Worker extends Person{ public Worker(String name,int age) //这里为了继承所以要参数一样 { super(name,age); //继承父类方法中的内容 } public Worker() { this("1234",33); //通过参数指向第一个构造方法 } }
五.构造方法内存过程
1.一般构造方法的内存过程
class文件先进入方法区,然后main方法进入栈内存中,当我们开始实例化对象时,第一个对象便进入了堆内存完成初始化(系统自动初始化)同时构造方法进入了栈内存中运行,完成其功能后死亡
2.继承中的构造方法内存过程
父类class文件先进入方法区,然后子类class再进去,然后main方法进入栈内存中,当我们开始实例化对象时,第一个对象便进入了堆内存完成初始化(系统自动初始化),此时堆内存中有两个内存区域,一个是父类的,另一个是子类的,实例化对象便存在于子类的存储区域,同时子类与父类的构造方进入了栈内存中运行,此时先运行子类的构造方法,通过super找到父类的构造方法。
六.总结
这块卡住我的就是super,this的指向问题,其实总体并没有太多信息量,所以只要相同指向问题这个知识点基本就算过了。