有兩個(gè)方面的問題:
1,當(dāng)一個(gè)類B繼承一個(gè)類C,而類B的一個(gè)實(shí)例又是類C的一個(gè)靜態(tài)成員變量的時(shí)候,為什么不會報(bào)StackOverflowError,我知道類B的一個(gè)實(shí)例是類C的一個(gè)非靜態(tài)成員變量的時(shí)候會報(bào)這個(gè)錯(cuò)誤。雖然靜態(tài)的只有一個(gè)實(shí)例,但引用還是是無限循環(huán)的?。??
2.當(dāng)一個(gè)類B繼承一個(gè)類C、一個(gè)接口A,類C中和接口A中都有一個(gè)相同的成員變量b的時(shí)候,分別因該怎么引用?(其中類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貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
你想調(diào)用接口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); } }

忽然笑
TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
public B(String s){ super(); //默認(rèn)調(diào)用的 System.out.println("class B's constractor,s="+s);
創(chuàng)建B的對象會調(diào)用C的構(gòu)造方法
調(diào)用C的構(gòu)造方法之前先要加載C ,創(chuàng)建靜態(tài)對象B
創(chuàng)建對象B 又調(diào)用C的構(gòu)造方法,靜態(tài)對象創(chuàng)建一次就可以了
所以,C構(gòu)造方法,B構(gòu)造方法(靜態(tài)對象B)然后C構(gòu)造方法,B構(gòu)造方法(main函數(shù)B)
結(jié)束。
添加回答
舉報(bào)
0/150
提交
取消