工作久了,很多基础性的知识也就忘了,Object-C如此,java也是。
关于java构造方法的几个注意点如下:
1.构造方法不能被继承 , 不多做解释,试试便知
2.如果自己实现了构造方法,JVM将不会为你默认添加无参构造方法
经反编译得知,程序编译时,会默认添加一个无参构造器。但是如果父类自己实现了重载的构造方法,那么将不会默认创建无参构造器。
故子类构造方法会报错,因为子类构造器中默认第一行会被默认添加super()调用父类构造方法,而此时父类已经没了无参构造方法。
所以如果父类没有无参构造方法,子类构造方法只能调用父类自己实现的构造方法了,如下图子类构造方法可以自己调用super("实参名");
3.最重要的一点,构造方法真的是用于初始化对象的吗?
我们修改一下第2点中的代码,初始化一个对象Student,Student类继承自Person类
Student stu = new Student();
事实上,Student实例在调用构造方法之前,就已经初始化了。理由如下:
a)下图this在构造方法的super()时已经存在值,而此时子类成员变量stuNum和父类成员变量name都为默认值0和null。
b)子类构造方法执行完super()后,子类成员变量stuNum和继承父类的name成员变量都有了值。
故,对象在堆中开辟内存初始化,在构造方法之前就已完成,构造方法中的super()作用在于给父类的私有成员变量进行显示初始化,包括构造代码块的内容,这也是为什么自己写super()必须得放在第一行,我们的指定赋值必须在super()之后,否则就报错的原因。