關於方法的覆寫和實例變量的覆蓋

package test;
class A{
	public String field1 = "A.field1";
	protected String field2 = "A.field2";
	String field3 = "A.field3";
	private String field4 = "A.field4";
	
	public String toString(){
		return "public field : " + field1 + " protected field : " + field2
		+" default field : " + field3 + " private String field : " + field4 ;
	}
	
    void toSay(){
	   System.out.println("I am a default method in A!");
   }
    
/*    public void toSay(){
 	   System.out.println("I am a public method in A!");    	
    }*///父類方法的訪問的權限不得高於子類的覆寫的方法的訪問權限 
}


/**
 * 在這裏我可以做出一個結論 ,所謂的繼承其實就是子類對象擁有父類的對象的一個引用,也就是super關鍵在,在調用
 * 子類繼承了父類的方法的時候如果沒有該方法沒有被覆寫,那麼就是用父類對象的引用去調用相應的方法。
 * 如果方法被覆寫那麼就會調用子類中覆寫後的方法,哪怕就是我們不知道真實的子類對象的類型,那麼在運行的時候通過保存在
 * 子類對象中的類型信息,也能動態的調用子類的對象覆寫後的方法。但是在子類中覆寫父類的方法的方法的訪問權限不得低於父類
 * 的方法訪問的權限,否則編譯器出錯。 見方法 toSay
 * 不同的是對於子類對象中的實例變量和父類中的實例變量,因爲子類的實例變量是對象的組成,因此分佈在堆中不同的內存空間中,
 * 也就是擁有不同的內存的地址。因此只要在子類中定義了與父類相同名稱的實例變量,那麼父類的實例變量就會被覆蓋(不管雙方的訪問權限,不管覆蓋的變量的類型),除非我們
 * 通過super(子類對象中保存的父類對象的引用)來調用父類實例變量。當然對於實例變量的調用是不可以多態的,只要子類對象被提升未父類對象,
 * 那麼我們就只可以調用父類對象的實例變量,究其原因是因爲實例變量的調用關係是在編譯的時候確定的,而不像方法的調用是在運行時動態確定的。
 * 
 * @author vagasnail
 *
   2009-4-17   下午02:33:56
 */
class AA extends A{
	public String field1 = "AA.field1";
	   void toSay(){
		   System.out.println("I am a default method in AA!");
	   }
/*	   void toSay(){
		   System.out.println("I am a default method in AA!");
	   } // Error here : Cannot reduce the visibility(可見度) of the inherited(繼承的方法) method from A
*/
}
public class TestOverrideAttr {

	public static void main(String[] args) {

		A a = new A();
		a.toSay();   //output : I am a default method in A!
		System.out.println(a.field1);
//		System.out.println(a);
		A aa1 = new AA();
		aa1.toSay(); //output : I am a default method in AA!
		System.out.println(aa1.field1);
		//System.out.println(aa1);
		AA aa2 = new AA();
		aa2.toSay();//output : I am a default method in AA!
		System.out.println(aa2.field1);
		/* System.out.println(aa2);
		 * output:由於在子類中沒有覆寫基類中的toString()方法,因此這裏還是用基類的引用調用的基類的toString()方法。
		 * public field : A.field1 protected field : A.field2 default field : A.field3 private String field : A.field4
		 */
	}


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章