父类是抽象类的初始化过程的


问题:

1. 当子类的父类为抽象类时,构造方法如何追溯?抽象类作为父类也会创建实例么?

2. 抽象类中的构造方法是怎么回事?为什么有构造方法却不能实例化?


解决:

1、子类在创建实例后,类初始化方法会调用父类的初始化方法(除了java.lang.Object类,因为java.lang.Object类没有父类),而这种调用会逐级追溯,直到java.lang.Object的初始化方法。


初始化方法是由java源程序的三个部分组成的:


一个部分是成员字段后的直接的初始化语句,例private int i=0;private Date date=new Date();等等。


第二个部分是由初始化块组成,例如:

Java code

publicclass Test{privateint i=0;//初始化第一部分 //以下大括号内为初始化第二部分{this.i=4; \\dosomething......}}


第三个部分就是java源代码中的构造方法中的代码,java源代码中有几个构造方法,那么class文件中就有几个初始化方法,编译器会把第一部分与第二部分分别复制到每个初始化方法的前端,然后把初始化方法对应参数的构造方法的代码复制到相应初始化方法中。


那么说初始化方法如何追溯其父类的,这关系到初始化方法的结构,初始化方法的执行顺序以及结构就如上所说,但是如果初始化方法的第一个执行指令就是调用另外一个初始化方法,这个初始化方法可能是自身类某个初始化方法,例如构造函数中第一句有类似this(...)这种语句,那么初始化方法就会调用自身类的指定构造方法;如果你的构造方法中没有指定构造方法调用,那么初始化方法会默认调用父类无参数初始化方法,如果你的构造方法的第一句为super(....), 那么初始化方法会调用父类的指定初始化方法。这种调用过程会递归进行调用,直到这个类是java.lang.Object类。


调用初始化方法并不代表会生成对象,java代码中出现new关键字加上构造方法的调用,只会生成一个对象其父类对象不会生成,所以调用父类为抽象类的构造方法完全是合理的。而且初始化方法对于虚拟机来说只是一个名称叫做"<init>"的普通方法,区别只是生成对象以后调用而已。


2、抽象类中的构造方法其实是用来给继承的子类来用的,因为构造方法相当于初始化方法,当子类调用构造方法时必须调用父类构造方法,所以可以在子类产生对象时抽象类中按需求初始化抽象类中的字段以及执行一些初始化代码。其实并不是一定要生成某个类的实例才调用构造方法,子类也需要调用父类构造方法。而生成实例也并不一定会调用构造方法,在某些特殊实现中或者特殊情况下,生成实例不会调用构造方法。而调用了构造方法也不一定就生成了一个实例,但是那一定是一个实例调用的,就像一个普通的实例方法一样。


阅读更多
个人分类: 自学积累
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭