JAVA子类作为实参父类作为形参_java 多态 实参形参
多態:
概述:
多態是繼 封裝性,繼承性,面向對象的第三大特性
定義:
多態:是指同一行為具有多個不同的表現形式.
生活中:比如跑的動作:貓,狗,大象,跑起來的動作都是不一樣的
飛的動作:昆蟲,鳥類,人造飛機,飛起來的動作都是不一樣的
可見同一行為通過不同的事物,可以表現出不同的形態.
多態描述的就是這樣的一種狀態
前提:
1.繼承或實現【二選其一】
2.父類的引用指向子類的對象【格式體現】
3.方法的重寫【意義:不重寫無意義】
表現:多態表現得格式:
父類類型 變量名 = new 子類對象;
變量名.方法名();
備注:父類類型指的是子類對象繼承的父類類型,或者實現的父接口類型.
public class Fu{
public void method(){
System.out.println("父類的method方法");
}
}
//1.繼承
public class Zi extends Fu{
//2.重寫
@Override
public void method(){
System.out.println("子類重寫后的method方法");
}
}
public class TestPolymorphismDemo01{
public static void main(String[] args){
//多態格式
/*
父類類型 變量名 = new 子類對象;
變量名.方法名();
*/
//3.父類引用指向子類的對象
Fu fu = new Zi();
fu.method();//本質調用的是子類當中重新給之后的method方法
}
}
如果在使用多態方式調用方法時,首先檢查父類當中是否有該方法,
如果沒有則編譯直接報錯,如果有執行的是子類重寫后的方法
好處:
在實際開發中,父類類型作為方法的 形式參數(不同于實際參數),傳遞子類對象(實參)給方法,
進行方法的調用更能體現出多態的擴展性和便利性
代碼如下:
//定義一個抽象的父類
public abstract class Animal{
//定義一個抽象的方法
public abstract void eat();
}
//定義子類
public class Cat extends Animal{
@Override
public void eat(){
System.out.println("貓吃魚");
}
}
public class Dog extends Animal{
@Override
public void eat(){
System.out.println("啃骨頭");
}
}
public class TestPolyDemo03 {
public static void main(String[] args) {
//根據不同的對象來表現不同的吃的內容
Cat c = new Cat();
//showCatEat(c);//貓吃魚
Dog d = new Dog();
//showCatEat(dog);
showAnimalEat(c);
showAnimalEat(d);
}
/*public static void showCatEat(Cat cat){
cat.eat();
}
public static void showDogEat(Dog dog){
dog.eat();
}*/
/*
以上兩個方法可以用多態進行簡化 可以用showAnimalEat來替代
*/
public static void showAnimalEat(Animal animal){
animal.eat();
}
}
說明:由于多態特性的支持,showAnimalEat方法中的Animal類型,是Dog和Cat的父類類型,
父類類型接收子類對象,當然可以把cat對象和dog對象傳遞給方法.
當程序執行過程中.執行eat方法實際執行的是各自子類對象重寫之后的eat方法
不僅僅可以做到替代,在擴展性方面,無論之后出現多個子類,都不用編寫showXxxEat()方法了
直接使用showAnimalEat()方法了
好處:體現在 可以使程序編寫更簡單,并且具有良好的擴展性.
訪問類中的成員變量有兩種方式(多態前提)
1.直接通過對象名訪問成員變量:看等號左邊是誰,優先用誰,如果沒有繼續往上找
2.間接的通過成員方法訪問成員變量:看該方法屬于誰,優先用誰,如果沒有繼續往上找
//定義一個父類
public class Fu{
int num = 10;
//成員方法
public void showNum(){
System.out.println(num);
}
}
//子類
public class Zi extends Fu {
int num = 20;
@Override
public void showNum(){
System.out.println(num);
}
}
//測試類
public class TestPolyFieldDemo01 {
public static void main(String[] args){
//多態的表示形式
//父類類型 變量名 = new 子類對象;
//變量名.成員變量名
Fu fu = new Zi();
System.out.println(fu.num);
fu.showNum();//10? 20
}
}
引用數據類型的轉型
多態的轉型:分為向上轉型和向下轉型兩種情況:
向上轉型:
向上轉型:多態本身就是子類類型向父類類型 向上壯轉型的過程,這個過程是默認的
當一個父類引用指向了一個子類對象時,便是向上轉型.
使用格式:
父類類型 變量名 = new 子類類型();
比如Animal animal = new Cat();
向下轉型
向下轉型:父類類型向子類類型向下轉換的過程,這個過程是強制的:
一個已經向上轉型的子類對象,將父類的引用又轉為子類的引用,可以使用強制類型轉換
使用格式:
子類類型 變量名 = (子類類型)父類變量名;
比如:Cat cat = (Cat) animal;
轉型異常:
在進行向下轉換的過程中,一不小心就會出現java.lang.ClassCastException類型轉換異常
為了避免這種類型轉換異常的發生,java就提供了 【instanceof】 關鍵字,給引用變量做類型的校驗
格式如下:
變量名 instanceof 數據類型
如果變量屬于該數據類型則返回true
如果變量不屬于該數據類型則返回false
所以在轉換前,我們最好先進行引用變量的類型判斷,
代碼如下:
public class Test{
public static void main(Stirng[] args){
//向上轉形
Animal animal = new Cat();
//向下轉型
if(animal instanceof Cat){
//表明你就是一只貓
Cat cat = (Cat)animal;
cat.eat();//吃魚
cat.catchMouse();//逮老鼠
}else if(animal instanceof Dog){
//表名你就是一只狗
Dog dog = (Dog)animal;
dog.lookDoor();
}
}
}
實參與形參
main
int num = 10;//局部變量
TestPolymorphismDemo02.method(num)//指的是實參
public static void method(int num){int num 指的是形參
System.out.println(num);
}
總結
以上是生活随笔為你收集整理的JAVA子类作为实参父类作为形参_java 多态 实参形参的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信公众号短链生成服务器,微信公众号短链
- 下一篇: 2020C证(安全员)考试题及C证(安全