为了账号安全,请及时绑定邮箱和手机立即绑定

继承的类的静态成员变量是自身的时候为啥不爆StackOverflowError

继承的类的静态成员变量是自身的时候为啥不爆StackOverflowError

蝴蝶不菲 2018-12-07 03:09:20
有两个方面的问题: 1,当一个类B继承一个类C,而类B的一个实例又是类C的一个静态成员变量的时候,为什么不会报StackOverflowError,我知道类B的一个实例是类C的一个非静态成员变量的时候会报这个错误。虽然静态的只有一个实例,但引用还是是无限循环的啊?   2.当一个类B继承一个类C、一个接口A,类C中和接口A中都有一个相同的成员变量b的时候,分别因该怎么引用?(其中类C中的b是static的)   可能没有说的太清楚,我把代码贴出来了,求解答,困惑我很久了。。 public class InterfaceVariable { public static void main(String[] args) { B b = new B("class B"); // System.out.println(b); // System.out.println(b.b); // System.out.println(B.b.b); } } interface A{ B b = new B("interface A"); } class C{ static B b = new B("class C"); } class B extends C implements A{ public B(String s){ System.out.println("class B's constractor,s="+s); } }      
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

你想调用接口A的变量b吗?以下是代码:

package headfirst.command.simpleremote;

public class InterfaceVariable {
    public static void main(String[] args) {
        B b = new B("class B");
        // System.out.println(b);
        // System.out.println(b.b);
        // System.out.println(B.b.b);
    }
}

interface A {
    B b = new B("interface A");
}

class C {
    static B b = new B("class C");
}

class B extends C implements A {
    public B(String s) {
        System.out.println("class B's constractor,s=" + s);
        System.out.println("interface A'b= " + A.b);
    }
}
查看完整回答
反对 回复 2018-12-16
?
忽然笑

TA贡献1806条经验 获得超5个赞

public B(String s){
        super();  //默认调用的
        System.out.println("class B's constractor,s="+s);
创建B的对象会调用C的构造方法
调用C的构造方法之前先要加载C ,创建静态对象B
创建对象B 又调用C的构造方法,静态对象创建一次就可以了
所以,C构造方法,B构造方法(静态对象B)然后C构造方法,B构造方法(main函数B)
结束。


查看完整回答
反对 回复 2018-12-16
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

索噶,明白了,多谢,

查看完整回答
反对 回复 2018-12-16
  • 3 回答
  • 0 关注
  • 634 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信