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

詳解 (共 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
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

私人筆記 (共 1 筆)

私人筆記#3549033
未解鎖
用A類別接b使用的會是b的函數
(共 15 字,隱藏中)
前往觀看
0
0