iT邦幫忙

0

為何測試的第一個getB()取不到值?

各位大大好,小弟學Java剛滿4個月
書看完了再次複習時發現,基礎還是很弱QAQ
想了查了翻書...過了一天還是想不透~
麻煩各位大大了~
//----------------------------------
父 類別

package tw.com.lccnet.demo02;

public class Gtest {
	
	private String a;
	private String b="asd :"+a;
	
	public Gtest(String a) {
		this.a=a;
		
	}
	public String getB() {
		return b;
	}

//----------------------------------
子 類別

package tw.com.lccnet.demo02;

public class Gtest02 extends Gtest {

	public Gtest02(String a) {

		super(a);
	}
}

//----------------------------------
main測試

package tw.com.lccnet.demo02;

public class DemoTest3 {

	public static void main(String[] args) {
		
		Gtest02 g2=new Gtest02("132546");
		System.out.println(g2.getB());
        
	}
	
}

1.結果:
https://ithelp.ithome.com.tw/upload/images/20200306/20125076bv4pCK99Zl.png

//----------------------------------
註掉private String b改成getB回傳,成功!!
2.結果:

https://ithelp.ithome.com.tw/upload/images/20200306/201250767723GLPyAC.png

//-----新手訓練期間不能進行 回應 !所以只好用編輯~-----

謝謝fysh711426 大大

但我還有疑問~

請問:

private String a;

private String b="asd :"+a;
的上方

建構式
public Gtest(String a) {
this.a=a;
}
給a賦值後
private String a;
會比 private String b="asd :"+a; 優先嗎??

還是賦值後的順序就會變??

謝謝~~~

//---20/3/9 更新--新手訓練期間不能進行 回應 !所以只好用編輯~-----
感謝
fillano
fysh711426
Luke
大大們~
已解決~~~ :D

欄位賦值優先於建構式

private String b="asd :"+a;

優先於

public Gtest(String a) {
this.a=a;
}
fillano iT邦超人 1 級 ‧ 2020-03-06 14:59:05 檢舉
欄位宣告並賦值的時候,建構式還沒執行,建構式是要等到new Gtest('ttt')才會跑,所以在宣告並賦值的時候,a是null阿。宣告是在定義這個類別,建構式是在產生類別實例時執行,不可能在定義類別之前執行建構式的,這應該很直覺。
建構式的 this.a=a; 不會影響 private String a;

執行順序是
private String a;

private String b="asd :"+a;

public Gtest(String a) {
this.a=a;
}

欄位賦值優先於建構式
這個順序是固定的,不會因為程式內容而改變
╰( ̄▽ ̄)╭
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

我要發表回答

立即登入回答