求教各位。看一下一个有趣的问题,此乃神马原理???
时间:2011-09-25
来源:互联网
public class Test {
public static void main(String[] args) {
new SubClassTwo();
//new Base();
}
}
class Base{
public void print(){
System.out.println("Base print()");
}
public Base(){
System.out.println("base before");
print();//即使是this.print(),所述情况同样出现
System.out.println("base after");
}
}
class SubClass extends Base{
private int id ;
@Override
public void print(){
System.out.println("SubClass print() , id = " + id);
printTwo();
}
public void printTwo(){
System.out.println("public void printTwo");
}
public SubClass(){
System.out.println("subclass constructor");
}
}
class SubClassTwo extends Base{
private int id ;
@Override
public void print(){
System.out.println("SubClassTwo print() , id = " + id);
printTwo();
}
public void printTwo(){
System.out.println("public void printTwo");
}
public SubClassTwo(){
System.out.println("SubClassTwo constructor");
}
}
//输出结果为:
/*
base before
SubClassTwo print() , id = 0
public void printTwo
base after
SubClassTwo constructor
*/
作者: chenbo150928 发布时间: 2011-09-25
为了这个问题。我从自习室跑回来了寝室发这个帖子求教各位大哥大姐。嗯。。。现在去自习室了。晚上回来再说。喵呜。
作者: chenbo150928 发布时间: 2011-09-25
很正常啊。。不知道你的问题何在?
作者: pl3121605999 发布时间: 2011-09-25
子类对象在实例化前会先默认调用父类的构造方法,子类的构造方法隐含了super()的语法。父类方法被覆写以后就掉用子类的方法。
作者: bin746176737 发布时间: 2011-09-25
因为在new子类对象的时候 在构造方法的第一行会有一句隐式的super()他 会去调用父类的空构造函数
所以打印 base before
然后print() 你不写默认前面就是this. ,因为你new的是SubClassTwo 这个对象 他用的自己的方法
所以 打印
SubClassTwo print() , id = 0
public void printTwo
剩下的不用我说了吧
所以打印 base before
然后print() 你不写默认前面就是this. ,因为你new的是SubClassTwo 这个对象 他用的自己的方法
所以 打印
SubClassTwo print() , id = 0
public void printTwo
剩下的不用我说了吧
作者: a1318463979 发布时间: 2011-09-25
构造器调用顺序问题,也涉及到书初始化问题。
1 调用基类的构造器,这个步骤一直递归下去,首先是构造这种层次结构的跟,然后下一层导出类,直到最低层的导出类
2 按声明顺序调用成员的初始状体
3 调用导出类(本身类)的构造器的主题
这种情况是父类有无参的构造函数,如果父类没写无参的构造函数,写了一个有参的构造函数则要显示的调用,不然编译出错。
所以你这个用第一条就可以解释了,
print();//即使是this.print(),所述情况同样出现
这个是子类覆盖父类的方法,所以调用的是本身的类的方法也就是子类的方法,实际上执行到这里,你写this,这里的this是子类,也就是调用它的应用,而不是父类。
1 调用基类的构造器,这个步骤一直递归下去,首先是构造这种层次结构的跟,然后下一层导出类,直到最低层的导出类
2 按声明顺序调用成员的初始状体
3 调用导出类(本身类)的构造器的主题
这种情况是父类有无参的构造函数,如果父类没写无参的构造函数,写了一个有参的构造函数则要显示的调用,不然编译出错。
所以你这个用第一条就可以解释了,
print();//即使是this.print(),所述情况同样出现
这个是子类覆盖父类的方法,所以调用的是本身的类的方法也就是子类的方法,实际上执行到这里,你写this,这里的this是子类,也就是调用它的应用,而不是父类。
作者: jike316 发布时间: 2011-09-25
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28