亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

子類重寫屬性,調用.people時為什么仍為父類屬性?(課后練習問題)

public?class?Traffic?{
	public?int?people;
	public?String?location;
	@Override
	public?String?toString()?{
		return?"Traffic?[people="?+?people?+?",?location="?+?location?+?"]";
	}
}

public?class?Bus?extends?Traffic?{
	public?int?people?=?40;????????????
	public?String?location?=?"陸地";???????????????//重寫屬性
	@Override
	public?String?toString()?{
		return?"Bus?[people="?+?people?+?",?location="?+?location?+?"]";
	}
}

public?class?Initial?{
	public?static?void?main(String[]?args)?{
		Traffic?tra1?=?new?Bus();
		System.out.println(tra1);???????//輸出Bus?[people=40,?location=陸地]
		
		System.out.println(tra1.people);//輸出0,為什么不是40?成員變量不能重載?
	}
}


正在回答

2 回答

這么跟你解釋,父類和子類中同名的兩個屬性是完全不同的兩個屬性,它們其實毫無關系,只是你定義得同名而已,所以也不存在什么屬性重寫的概念,它們只是對各自的屬性初始化而已,即使你把他們賦相同的初值,它們也是兩個完全不同的屬性,從本質上他們的內存地址就不一樣。

System.out.println(tra1.people);你的這句話,是用父類的對象訪問父類的屬性people,由于你在父類中沒有初始化,所以系統默認為0. ?這是我的理解,希望能幫到你,最后記住,不存在屬性的重寫,他們根本沒關系,只是同名而已。

1 回復 有任何疑惑可以回復我~

Java的多態性

面向對象編程有三個特征,即封裝、繼承和多態。

? ?封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了數據。

? ?繼承是為了重用父類代碼,同時為實現多態性作準備。那么什么是多態呢?

? ?方法的重寫、重載與動態連接構成多態性。Java之所以引入多態的概念,原因之一是它在類的繼承問題上和C++不同,后者允許多繼承,這確實給其帶來的非常強大的功能,但是復雜的繼承關系也給C++開發者帶來了更大的麻煩,為了規避風險,Java只允許單繼承,派生類與基類間有IS-A的關系(即“貓”is a “動物”)。這樣做雖然保證了繼承關系的簡單明了,但是勢必在功能上有很大的限制,所以,Java引入了多態性的概念以彌補這點的不足,此外,抽象類和接口也是解決單繼承規定限制的重要手段。同時,多態也是面向對象編程的精髓所在。

? ?要理解多態性,首先要知道什么是“向上轉型”。

? ?我定義了一個子類Cat,它繼承了Animal類,那么后者就是前者是父類。我可以通過

Cat c = new Cat();
實例化一個Cat的對象,這個不難理解。但當我這樣定義時:

Animal a = new Cat();
這代表什么意思呢?

? ?很簡單,它表示我定義了一個Animal類型的引用,指向新建的Cat類型的對象。由于Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對象的。那么這樣做有什么意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,

定義一個父類類型的引用指向一個子類的對象既可以使用子類強大的功能,又可以抽取父類的共性。

所以,父類類型的引用可以調用父類中定義的所有屬性和方法,而對于子類中定義而父類中沒有的方法,它是無可奈何的;

同時,父類中的一個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類類型的引用調用;

對于父類中定義的方法,如果子類中重寫了該方法,那么父類類型的引用將會調用子類中的這個方法,這就是動態連接。

看下面這段程序:

class Father{
? ?public void func1(){
? ? ? ?func2();
? ?}
? ?//這是父類中的func2()方法,因為下面的子類中重寫了該方法
? ?//所以在父類類型的引用中調用時,這個方法將不再有效
? ?//取而代之的是將調用子類中重寫的func2()方法
? ?public void func2(){
? ? ? ?System.out.println("AAA");
? ?}
}
?
class Child extends Father{
? ?//func1(int i)是對func1()方法的一個重載
? ?//由于在父類中沒有定義這個方法,所以它不能被父類類型的引用調用
? ?//所以在下面的main方法中child.func1(68)是不對的
? ?public void func1(int i){
? ? ? ?System.out.println("BBB");
? ?}
? ?//func2()重寫了父類Father中的func2()方法
? ?//如果父類類型的引用中調用了func2()方法,那么必然是子類中重寫的這個方法
? ?public void func2(){
? ? ? ?System.out.println("CCC");
? ?}
}
?
public class PolymorphismTest {
? ?public static void main(String[] args) {
? ? ? ?Father child = new Child();
? ? ? ?child.func1();//打印結果將會是什么? ? ?
? ?}
}
? ?上面的程序是個很典型的多態的例子。子類Child繼承了父類Father,并重載了父類的func1()方法,重寫了父類的func2()方法。重載后的func1(int i)和func1()不再是同一個方法,由于父類中沒有func1(int i),那么,父類類型的引用child就不能調用func1(int i)方法。而子類重寫了func2()方法,那么父類類型的引用child在調用該方法時將會調用子類中重寫的func2()。

? ?那么該程序將會打印出什么樣的結果呢?

? ?很顯然,應該是“CCC”。

? ?對于多態,可以總結它為:

一、使用父類類型的引用指向子類的對象;

? ?二、該引用只能調用父類中定義的方法和變量;

? ?三、如果子類中重寫了父類中的一個方法,那么在調用這個方法的時候,將會調用子類中的這個方法;(動態連接、動態調用)

? ?四、變量不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變量,那么在編譯時會報錯。

3 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

子類重寫屬性,調用.people時為什么仍為父類屬性?(課后練習問題)

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號