后端入門--java中多態(tài)情況下如何調(diào)用子類獨(dú)有的方法?

先說一下代碼結(jié)構(gòu),一共是老師、學(xué)生、管理員三個角色,是將他們共有的屬性抽出來寫了一個Person類,但是不同的部分沒有寫在Person類,也就是父類中,然后使用繼承來使用共有的一部分東西。
先看一下代碼

Person.java

package com.itppf.繼承;

public class Person {
    private String name;
    private String sex;
    private int age;
    private double height;
    private double weight;

    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return this.name;
    }

    public void setSex(String sex){
        this.sex=sex;
    }
    public String getSex(){
        return this.sex;
    }

    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return this.age;

    }

    public void setHeight(double height){
        this.height=height;
    }
    public double getHeight(){
        return this.height;
    }

    public void setWeight(double weight){
        this.weight=weight;
    }
    public double getWeight(){
        return this.weight;
    }

}

Student.java

package com.itppf.繼承;

public class Student extends Person {
    public void action(){
        System.out.println(this.getName()+"學(xué)生學(xué)習(xí)");
    }
}

Teacher.java

package com.itppf.繼承;

public class Teacher extends Person{
    public void teach(){
        System.out.println(this.getName()+"老師教課");
    }
}

Administrator.java

package com.itppf.繼承;

public class Administrator extends Person{
public void option(){
    System.out.println(this.getName()+"進(jìn)行操作");
}
}

然后寫了測試類。

package com.itppf.繼承;

public class Test {
    public static void main(String[] args) {
        Person p1=new Student();
        Person p2=new Teacher();
        Person p3=new Administrator();

        p1.setName("學(xué)生1");
        p1.setAge(12);
        p1.setHeight(180.0);
        p1.setWeight(140.00);
        System.out.println("學(xué)生姓名:"+p1.getName());
        System.out.println("學(xué)生年齡:"+p1.getAge());
        System.out.println("學(xué)生身高:"+p1.getHeight());
        System.out.println("學(xué)生體重:"+p1.getWeight());
        p1.action();    //注意,這里是報錯的
    }
}
注意,在這里報錯了,我一直想這個問題是怎么回事?以前調(diào)用子類方法的時候沒有出現(xiàn)過這種狀態(tài),我估計是多態(tài)的情況下出現(xiàn)了問題,于是我準(zhǔn)備換種方式試一下。
Student p1=new Student();
果然不報錯了。
但是多態(tài)的情況下沒有辦法解決的嗎?

方法一

并不是,使用Alt+Enter可以解決這個問題。

補(bǔ)全后成為了這個樣子

 ((Student) p1).action();
輸出也沒有問題,查詢后可知是向上向下轉(zhuǎn)型問題。

這里需要父類強(qiáng)轉(zhuǎn)為子類,然后調(diào)用子類方法。

Person p1=new Student();
//現(xiàn)在開始
Student  s1=(Student)p1;
s1.action();
這個和上面的快捷鍵補(bǔ)全意思是一樣的,但是我起碼明白了是怎么一回事,這個叫做向下轉(zhuǎn)型。
同理,肯定還有向上轉(zhuǎn)型,子類強(qiáng)制轉(zhuǎn)型成父類。
((Person)s1).action();
//拆開
Person p1=(Person)s1;
p1.action();
其實(shí)這個問題還有一種解決方法。

方法二

那就是在父類中定義方法,然后在子類中進(jìn)行重寫,代碼補(bǔ)全的時候也提供了這一種方法。
在父類中定義該方法。
子類重寫
但是顯然這種方法比較繁瑣,除了寫共有的屬性和方法以外還要寫不同的,再重寫,因此以后還是使用強(qiáng)轉(zhuǎn)吧!
以上為個人測試,如有不對,歡迎指正批評!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容