java多态的两种形式_java核心(八):继承与方法重写、final、多态性的两种描述形式...
一、繼承的作用
子類繼承父類的屬性和方法,實(shí)現(xiàn)代碼的復(fù)用;
子類擴(kuò)充自己的標(biāo)準(zhǔn),實(shí)現(xiàn)精細(xì)化的類型定義。
二、子類構(gòu)造方法的限制
子類在實(shí)例化的時(shí)候,默認(rèn)先實(shí)例化父類對(duì)象,然后再實(shí)例化本類對(duì)象;
子類構(gòu)造方法默認(rèn)調(diào)用父類的無(wú)參構(gòu)造方法;
如果父類沒(méi)有無(wú)參構(gòu)造方法,子類的構(gòu)造方法需要明確指定調(diào)用的父類構(gòu)造方法。
三、方法的重寫(xiě)
子類重寫(xiě)方法限制:方法名、參數(shù)類型、參數(shù)個(gè)數(shù),必須和父類方法完全一致;
被子類重寫(xiě)的方法不能擁有比父類更為嚴(yán)格的訪問(wèn)控制權(quán)限(如父類方法為public,則子類重寫(xiě)方法也必須為public;如父類方法為protected,則子類重寫(xiě)方法只能為public或protected);
重寫(xiě)方法的返回值類型,可以是父類原方法的返回類型的子類(比如,父類方法返回Object,子類重寫(xiě)方法可以返回String)(但是,建議不要修改方法的返回值類型);
四、final關(guān)鍵字的約束限制
使用final修飾的類,不能被繼承;
使用final修飾的方法,不能被子類重寫(xiě)(為保護(hù)父類關(guān)鍵代碼,不被子類修改);
public static final修飾的屬性,屬于全局常量,全局常量在內(nèi)存中存儲(chǔ)在公共區(qū);
final修飾的屬性,一般使用全大寫(xiě),單詞間可通過(guò)下劃線區(qū)分;
final修飾的屬性,在定義時(shí)必須設(shè)置初始值,而且值賦值后不能再被改變。
五、多態(tài)性的兩種描述形式
1、方法的多態(tài)性
方法的重載:同一個(gè)類中,相同方法名稱,根據(jù)傳入?yún)?shù)類型、參數(shù)個(gè)數(shù)不同,來(lái)實(shí)現(xiàn)不同的邏輯處理;
方法的重寫(xiě):繼承關(guān)系中,子類重寫(xiě)父類的方法,根據(jù)子類的不同,實(shí)現(xiàn)不同的邏輯處理;
2、對(duì)象的多態(tài)性
向上轉(zhuǎn)型(自動(dòng)完成):父類 ?父類對(duì)象 = 子類實(shí)例;
向下轉(zhuǎn)型(強(qiáng)制完成):子類 ?子類對(duì)象 = (子類)父類實(shí)例;
六、分析:向上轉(zhuǎn)型、向下轉(zhuǎn)型
1、對(duì)于對(duì)象的轉(zhuǎn)型,給出以下的經(jīng)驗(yàn)總結(jié)
80%的情況下,只會(huì)使用向上轉(zhuǎn)型。因?yàn)榭梢缘玫絽?shù)類型的統(tǒng)一,方便進(jìn)行傳參和數(shù)據(jù)處理;
5%的情況下,會(huì)使用向下轉(zhuǎn)型。目的是向下轉(zhuǎn)型后,調(diào)用子類的特殊方法;
15的情況下,不實(shí)用轉(zhuǎn)型,直接使用本類對(duì)象進(jìn)行操作。
個(gè)性化的操作在一個(gè)標(biāo)準(zhǔn)的開(kāi)發(fā)之中應(yīng)該盡量少出現(xiàn),因?yàn)閷?duì)象的轉(zhuǎn)型操作里面畢竟有了強(qiáng)制問(wèn)題,容易帶來(lái)安全隱患。
2、向上轉(zhuǎn)型的目的:可以得到參數(shù)類型的統(tǒng)一,方便進(jìn)行傳參和數(shù)據(jù)處理
packagecom.study.override;
/**
* 父類:水果類
*/
public classFruit {
publicString getInfo(){
return "Fruit *************";
}
}
/**
* 蘋(píng)果類
*/
class Apple extendsFruit{
@Override
publicString getInfo() {
return "Apple *************";
}
}
/**
* 橘子類
*/
class Orange extendsFruit{
@Override
publicString getInfo() {
return "Orange *************";
}
}
classTest3{
public static voidmain(String[] args) {
Fruit f1 = newApple();
Fruit f2 = newOrange();
getFruit(f1); //Apple *************
getFruit(f2); //Orange *************
}
/**
* 接受統(tǒng)一的參數(shù)類型:Fruit
* @param fruit
*/
public static voidgetFruit(Fruit fruit){
System.out.println(fruit.getInfo());;
}
}
3、向下轉(zhuǎn)型的目的:調(diào)用子類的特殊方法
只有對(duì)象發(fā)生了向上轉(zhuǎn)型之后,才能成功的向下轉(zhuǎn)型
packagecom.study.override;
/**
* 父類:水果類
*/
public classFruit {
public voidgetInfo(){
System.out.println("Fruit *************");
}
}
/**
* 子類:蘋(píng)果類
*/
class Apple extendsFruit{
@Override
public voidgetInfo() {
System.out.println("Apple *************");
}
}
/**
* 子類:橘子類
*/
class Orange extendsFruit{
}
classTest3{
public static voidmain(String[] args) {
Fruit f1 = new Apple(); // 自動(dòng)進(jìn)行了向上轉(zhuǎn)型
System.out.println(f1 instanceof Fruit); // true
System.out.println(f1 instanceof Apple); // true
System.out.println(f1 instanceof Orange); // false
//向下轉(zhuǎn)型
Apple a1 =(Apple)f1;
a1.getInfo(); //Apple *************
Fruit f2 = newFruit();
System.out.println(f2 instanceof Fruit); // true
System.out.println(f2 instanceof Apple); // false
System.out.println(f2 instanceof Orange); // false
//向下轉(zhuǎn)型失敗
//java.lang.ClassCastException: com.study.override.Fruit cannot be cast to com.study.override.Apple
Apple a2 =(Apple)f2;
a2.getInfo();
}
}
總結(jié)
以上是生活随笔為你收集整理的java多态的两种形式_java核心(八):继承与方法重写、final、多态性的两种描述形式...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux go missing git
- 下一篇: react-native 显示html,