返回信息流在 http://www.blogjava.net/ldwblog/archive/2013/10/31/405857.html 看到这样一到面试题
public class A extends B {
public int a = 100;
public A() {
super();
System.out.println(a);
a = 200;
}
static {
System.out.println("static A");
}
public static void main(String[] args) {
new A();
}
}
class B {
public B() {
System.out.println(((A) this).a);
}
}
输出结果是
....... static A
0
100
B的构造方法为啥输出的是0呢?感觉((A) this).a这里挺乱,求大神分析
这是一条镜像帖。来源:北邮人论坛 / java / #34018同步于 2014/8/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
一道java面试题,有关继承
ylewxh
2014/8/25镜像同步31 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我印象中当时看Thinking in Java继承那块的时候,里面有个地方说过,在某种情况下,基类的构造方法先执行的时候,派生类中的变量还没初始化好,就输出0.我感觉这个case可以用这个来解释。具体的一些不太记得了
【 在 ylewxh 的大作中提到: 】
: 在 http://www.blogjava.net/ldwblog/archive/2013/10/31/405857.html 看到这样一到面试题
: public class A extends B {
: public int a = 100;
: ...................
父类实例化时,子类中域初始化赋值还没执行,为int默认值
在加载A.class文件后,立马就执行static模块,后面再执行main方法,碰到A的构造函数的时候,由于A是继承B,先初始化B的属性,再执行B的构造函数,执行的时候,此时A的属性都是默认值,执行完B的构造函数后,初始化A的属性,再执行super下面的代码,这里的super其实可以直接省略的
花式点赞!
【 在 modispy 的大作中提到: 】
: 在加载A.class文件后,立马就执行static模块,后面再执行main方法,碰到A的构造函数的时候,由于A是继承B,先初始化B的属性,再执行B的构造函数,执行的时候,此时A的属性都是默认值,执行完B的构造函数后,初始化A的属性,再执行super下面的代码,这里的super其实可以直接省略的
点赞~
【 在 modispy 的大作中提到: 】
: 在加载A.class文件后,立马就执行static模块,后面再执行main方法,碰到A的构造函数的时候,由于A是继承B,先初始化B的属性,再执行B的构造函数,执行的时候,此时A的属性都是默认值,执行完B的构造函数后,初始化A的属性,再执行super下面的代码,这里的super其实可以直接省略的
【 在 modispy 的大作中提到: 】
: 在加载A.class文件后,立马就执行static模块,后面再执行main方法,碰到A的构造函数的时候,由于A是继承B,先初始化B的属性,再执行B的构造函数,执行的时候,此时A的属性都是默认值,执行完B的构造函数后,初始化A的属性,再执行super下面的代码,这里的super其实可以直接省略的
懂了
进来学习,但是不太懂,那个“0”是执行B的构造函数的时候输出的还是,执行super的时候输出的?
【 在 modispy 的大作中提到: 】
: 在加载A.class文件后,立马就执行static模块,后面再执行main方法,碰到A的构造函数的时候,由于A是继承B,先初始化B的属性,再执行B的构造函数,执行的时候,此时A的属性都是默认值,执行完B的构造函数后,初始化A的属性,再执行super下面的代码,这里的super其实可以直接省略的
【 在 shan10211865 的大作中提到: 】
: 进来学习,但是不太懂,那个“0”是执行B的构造函数的时候输出的还是,执行super的时候输出的?
会判断会不会有super~super一般多用于有输入参数的构造函数,此处有super就进入B构造函数,没有也会进入...