【Java入門學習筆記】——第十天 對象的上轉型對象,繼承與多態,abstract類和abstract方法

一、對象的上轉型對象

1.對象的上轉型對象的實體是由子類負責創建的,但是上轉型對象會失去原對象的一些屬性和功能(上轉型對象相當於子類對象的一個“簡化”對象),上轉型對象具有的屬性和功能如下:

(1)上轉型對象不能操作子類新增的成員變量(失掉了這部分屬性)和成員方法(失掉了這部分行爲)。

(2)上轉型對象可以操作子類繼承或者隱藏的成員變量,也可以調用子類繼承的實例方法或子類重寫的實例方法。上轉型對象操作子類繼承或者隱藏的成員變量或子類重寫的實例方法,其作用等價於子類對象去調用這些方法

 關於對象的上轉型對象,有以下四個注意事項

給出一個對象的上轉型對象實例:

class LeiRenYuan{
	void Speak(String str) {
		System.out.println(str);
	}
}
class People extends LeiRenYuan{
	void Speak(String str) {
		System.out.println("***"+str+"***");
	}
	void Cry(String str) {
		System.out.println("+++"+str+"+++");
	}
}
public class Test1 {
	public static void main(String[] args) {
		LeiRenYuan a=new LeiRenYuan();
		People sun = new People();
        a.Speak("hahaha");
		a=sun;//將子類的引用放到父類對象中,這時就稱a爲sun的上轉型對象
		a.Speak("hahaha");//***hahaha*** 等同於 sun.speak("hahaha");
		a.Cry("hahaha");//編譯通不過,上轉型對象不能操作子類新增的成員
		People p = (People) a;
		p.Cry("hohoho");
		
	}
}

運行結果:

hahaha//這時a還不是一個上轉型對象,調用的Speak是LeiRenYuan類的Speak
***hahaha***//這時a成了一個上轉型對象,調用Speak是People類的Speak
+++hohoho+++//將a強制轉換成爲People類的一個對象,這時就可以調用People類中新增的方法Cry
可以看到,上轉型對象調用子類重寫的方法等同於子類對象調用這些方法,而且上轉型對象不能操作子類新增的對象

二、繼承與多態 

多態性就是指父類的方法被某個子類重寫的時候,可以各自產生自己的功能行爲

三、abstract類和abstract方法(重在理解)

對於abstract方法,只允許聲明,不允許實現(沒有用方法體),而且不允許使用final和abstract同時修飾一個方法或類,也不允許使用static修飾abstract方法,即abstract方法必須是實例方法

1.abstract類中可以有abstract方法,也可以有非abstract方法

   非abstract類中不可以有abstract方法

2.abstract類不能用new運算符創建對象。如果一個非抽象類是某個抽象類的子類,那麼它必須重寫父類的抽象方法,給出方法體,這就是爲什麼不允許使用final和abstract同時修飾一個方法或者類的原因:必須能夠重寫

3.abstract類的子類

非abstract類是abstract類的子類,它必須重寫父類的abstract方法,即去掉abstract方法的abstract修飾並給出具體的方法體。

abstract類是abstract類的子類,它可以重寫父類的abstract方法,也可以繼承父類的abstract方法。

4.abstract類的對象作爲上轉型對象

可以用abstract類聲明對象,儘管不能使用new運算符創建該對象,但該對象可以成爲其子類的上轉型對象,那麼該對象就可以調用子類重寫的方法。

5.理解abstract類

理解抽象類意義是最爲重要的:

(1)抽象類可以抽象出重要的行爲標準,該行爲標準用抽象方法來表示。即抽象類封裝了子類必須要有的行爲標準

(2)抽象類聲明的對象可以成爲其子類的對象的上轉型對象,調用子類重寫的方法,即體現子類根據抽象類裏的行爲標準,給出具體的行爲。

抽象類的具體實例:

abstract class Girl{
	abstract void speak() ;
	abstract void cook();
}
class ChineseGirl extends Girl{
	void speak() {
		System.out.println("你真棒!");
	}
	void cook() {
		System.out.println("麪條!");
	}
}
class Boy{
	Girl girl;
	void setGirlrfiend(Girl girl) {
		this.girl=girl;
	}
	void showGirlfriend() {
		girl.speak();
		girl.cook();
	}
}
class AmericanGirl extends Girl{
	void speak() {
		System.out.println("You are good!");
	}
	void cook() {
		System.out.println("noodle!");
	}
}
public class Test1{
	public static void main(String[] args) {
		Boy b = new Boy();
		Girl g=new ChineseGirl();
		b.setGirlrfiend(g);
		b.showGirlfriend();
		g=new AmericanGirl();
		b.setGirlrfiend(g);
		b.showGirlfriend();
	}
}

你真棒!
麪條!
You are good!
noodle!

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