29 下列的 Java 語言程式執行後輸出為何?
import java.lang.*;
class A
{
public static int value=0;
public A(){ value++; }
public void fun(){ value++; };
}
class B extends A
{
public B(){ super(); value--;}
public void fun(){ value--; };
}
class test
{
public static void main (String[] argv)
{
B b=new B(); fun(b);
System.out.println(b.value);
}
public static void fun(A x)
{
x.fun();
}
{
(A)0
(B)1
(C)-1
(D)-2
答案:登入後查看
統計: A(74), B(77), C(154), D(36), E(0) #852262
統計: A(74), B(77), C(154), D(36), E(0) #852262
詳解 (共 8 筆)
#1304294
B b=new B(); fun(b);
先看這一行
以 B 類別,宣告一個 b 的物件
把 b 帶入fun這個函式之中
public static void fun(A x)
{
x.fun();
}
剛剛帶入的 b 跑到了這裡
因此x.fun(); = b.fun();
b.fun(); 代表 要執行上方B類別中的fun函式:
class B extends A
{
public B(){ super(); value--;}
public void fun(){ value--; };
}
不管執行哪個函式
都一定要先執行該類別的建構元
照順序來
public B(){ super(); value--;}
↑這行先執行
super();代表呼叫父類別的建構元
也就是public A(){ value++; }
value=0+1=1
之後value--;
value=1-1=0
執行完子類別的建構元後
接著就執行主角 fun函式
public void fun(){ value--; }; //子類別fun函式
value=0-1=-1
System.out.println(b.value);
最後他要印出value的值
就是上方最後面的 -1
答案:-1
先看這一行
以 B 類別,宣告一個 b 的物件
把 b 帶入fun這個函式之中
public static void fun(A x)
{
x.fun();
}
剛剛帶入的 b 跑到了這裡
因此x.fun(); = b.fun();
b.fun(); 代表 要執行上方B類別中的fun函式:
class B extends A
{
public B(){ super(); value--;}
public void fun(){ value--; };
}
不管執行哪個函式
都一定要先執行該類別的建構元
照順序來
public B(){ super(); value--;}
↑這行先執行
super();代表呼叫父類別的建構元
也就是public A(){ value++; }
value=0+1=1
之後value--;
value=1-1=0
執行完子類別的建構元後
接著就執行主角 fun函式
public void fun(){ value--; }; //子類別fun函式
value=0-1=-1
System.out.println(b.value);
最後他要印出value的值
就是上方最後面的 -1
答案:-1
25
1
#1217878
當main在新增物件B時,B的建構子內去呼叫父類別的建構子,所以B建構子初始值value + 1 => 0 + 1 = 1而後再value - 1 => 1 - 1 = 0,而之後的呼叫fun則是進入到test內的fun然後去呼叫B內的fun,所以value - 1 => 0 - 1 = -1。之後顯示為 b.value的值為 -1。
10
0
#5622641

這個出題者括號打錯,縮排也沒做好看了頭很痛
1
0
#1105440
import java.lang.*;
class A
{
public static int value=0;
public A(){ value++; }
public void fun(){ value++; };
}
class B extends A
{
public B(){ super(); value--;}
public void fun(){ value--; };
}
class test
{
public static void main (String[] argv)
{
B b=new B(); fun(b);
System.out.println(b.value);
}
public static void fun(A x)
{
x.fun();
}
}
0
1
#4653110
附帶說明
當主程式執行fun(b);時,會執行底下程式
public static void fun(A x){
x.fun();
}
這裡的A,是B的父類。雖然如此,但是丟入b,而b指向B,就會執行B.fun(),而不會是A.fun()
如果今天反過來,主程式裡是
A a = new A();
fun(a);
然後fun( B x),這樣編譯就會失敗,因為子類參考不能指向父類
0
0
#1103162
不懂?
0
0
#1207177
不懂~ 有高手嗎
0
0
#1117344
我覺得是B耶
0
1