今晚师弟问了问题,关于子类和父类构造器的问题,做个分析总结:
运行代码:
package 左旋转字符串; public class A { public void testabstract(){ System.out.print("父类方法 "); System.out.println("i = "+i); } A(){ System.out.println("palace 1"); testabstract(); } public static void main(String[] args) { cc cc = new cc(); System.out.println("palace 2"); cc.testabstract(); } } class cc extends A{ private int i = 1; public void testabstract(){ System.out.print("子类方法 "); System.out.println("i = "+i); } cc(){ } }
结果:
palace 1 子类方法 i = 0 palace 2 子类方法 i = 1
cc cc = new cc();
这段代码,是实例化cc这个类的对象,会调用到cc的构造器
执行cc构造器是这样一个过程:
1.最开始会隐式调用父类的构造器,对父类的非静态域进行初始化,执行父类A的构造器的时候,也会调用父类的构造器也就是Object类的构造器(这里会一层层往上级调用其构造器,知道最顶层的Object后才一层层返回到cc的构造器中来)。
2.在父类A的构造器中调用到testabstract();方法,这个方法是父类的还是子类的?这里涉及到多台,testabstract() 是等价于 this.testabstract(); this代表当前对象,虽然该方法是在父类构造器中调用的,但是父类构造器是被子类调用,所以归根结底,this代表的是cc的当前对象,而不是父类对象,所以父类中调用的testabstract()是子类的重写后的方法,运行结果证明了这点。
为什么同样调用了子类的testabstract()方法 在place1 和 place2 打印出来的结果不同呢?
这点关系到构造器对变量初始化问题,在执行构造器前系统已经为整个对象申请了内存了,对象的成员变量已经申请到内存,但是还诶初始化,所以系统是赋默认值 int 的为 0,进入构造器的时候,第一件事是调用父类的构造器,此时i还没被赋值,其值仍然是0,父类构造器中调用到子类的方法,故输出的值是 0;
而在place2 再去执行testabstract() 则能输入想要的结果1.因为初始化已经全部完毕了
相关推荐
NULL 博文链接:https://2528.iteye.com/blog/1523901
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
父类赋值给子类的一个小方法,仅供学习参考...
有关子类和父类。A是子类,Teacher是父类。A是Teacher 的一种(子类)会继承父类李非私
Java的子类调用父类的构造方法.pdf
论JAVA继承机制中父类与子类的关系
java多态性详解——父类引用子类对象
java定义父类和子类.doc
java,定义父类和子类.pdf
父类引用子类对象,父类对象和子类对象之间的引用关系和区别
利用C#反射将子类舍弃多余的属性转换为父类,用途比较少。
程序中描述了子类对象构建调用父类的构造方法,以及类变量和实例变量创建的不同过程
java训练题目 编写程序实现子类对父类构造方法的引用?
在本文里我们给大家分享一篇关于Python 子类继承父类构造函数的相关知识点内容,需要的朋友们跟着学习下。
java反射获取所有属性,获取所有get方法,包括子类父类,以及包括List集合类
主要介绍了Java中父类和子类之间的转换操作,结合实例形式分析了Java中父类和子类之间的转换相关原理、操作技巧与使用注意事项,需要的朋友可以参考下
【java】父类声明子类实例化.mhtml
java代码-使用java解决父类与子类的声明应用的源代码 ——学习参考资料:仅用于个人学习使用!