[英]Passed parameter into void method (integer or object)
我試圖找出以下代碼的輸出,除了兩行外,我幾乎都正確了。 3號線和7號線
預期的輸出將是:
1 : 10
2 : 20
3 : 20
4 : 15
5 : 40
6 : 75
7 : 35
8 : 75
9 : 20
正如我提到的,除了3和7外,我一切都正確。對於我來說,第3行是25,而第7行是40。請您解釋一下為什么第3行:20和第7行:35? 我曾嘗試過查找它,但找不到很好的解釋。
這不是功課!
public class Alpha {
protected int x;
public Alpha() { this(10); }
public Alpha(int x) { this.x = x; }
public void f() { x = 20; }
public void f(int x) { x = 25; }
public void g(Object a) { x = 30; }
public void h(Object a) { x = 50; }
public void h(Integer a) { x = 55; }
}
public class Beta extends Alpha {
public Beta() { super(15); }
public void g(Object a) { x = 35; }
public void g(Integer a) { x = 40; }
public void h(Object b) { x = 70; }
public void h(Integer b) { x = 75; }
public static void main(String[] args) {
Alpha a = new Alpha();
System.out.println("1 : " + a.x);
a.f();
System.out.println("2 : " + a.x);
a.f(100);
System.out.println("3 : " + a.x);
Beta b = new Beta();
System.out.println("4 : " + b.x);
b.g(200);
System.out.println("5 : " + b.x);
b.h(300);
System.out.println("6 : " + b.x);
Alpha c = b;
c.g(400);
System.out.println("7 : " + c.x);
c.h(500);
System.out.println("8 : " + c.x);
c.f();
System.out.println("9 : " + b.x);
}
}
對於問題3,變量a
是Alpha
。 在調用af(100)
之前,將調用af()
,它將x
設置為20
。 在調用af(100)
, 局部變量x
在方法f(int x)
設置為25
,而不是實例變量 x
。 實例變量仍為20
。
對於問題7,將變量b
(即Beta
)分配給Alpha
引用c
。 調用cg(400)
,編譯器必須調用g(Object)
,因為這是Alpha
中g
唯一可用的重載。 在運行時,多態決定,由於對象是Beta
,的重寫g(Object)
在Beta
被選擇,它設置x
至35
。 這是因為編譯器選擇方法重載,而在運行時使用多態選擇方法重寫。
第3行之所以是20,是因為您要更改傳遞到方法中的'x'的值,而不是類級別變量'x'。 將您的代碼更改為以下內容。 如果您閱讀可變范圍的書,您也會得到更好的理解。
public class Alpha {
protected int x;
public Alpha() { this(10); }
public Alpha(int x) { this.x = x; }
public void f() { x = 20; }
public void f(int x) { this.x = 25; }
public void g(Object a) { x = 30; }
public void h(Object a) { x = 50; }
public void h(Integer a) { x = 55; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.