簡體   English   中英

UpCasting 和 DownCasting Java 訪問方法

[英]UpCasting and DownCasting Java accessing methods

我無法理解向上轉換和方法的訪問。 我已經閱讀了關於我遇到的類似理解問題的多個其他問題,但我仍然無法理解。 我希望對我的問題的更個性化的答案可以幫助我更好地理解它。

My problem with upcasting is that I've learned from my computer science class that when an child object is upcasted to an parent class it just is labeled something else, because it is labeled something else it is unable to call methods from the child class.

這是那里的解釋:“貓不能發出咕嚕聲,而被標記為其他東西如果你向上轉換 object,它將失去從其當前 position 下面繼承的所有屬性。例如,如果你將貓投射到動物,它將丟失從 Mammal 和 Cat 繼承的屬性。請注意,該數據不會丟失,除非您將 object 向下轉換到正確的級別,否則您無法使用它。為什么會這樣?如果您有一組動物,那么您不能確定哪些可以喵(),哪些可以吠()。這就是為什么你不能讓動物做只針對狗或貓的事情。

這個解釋對我來說很有意義,但是當我在這段代碼中測試它時:

public class SchoolMember 
{
    public void schoolDay() 
    {
    System.out.print(“School open”); 
    } 
}

public class Teacher extends SchoolMember  
{  
    public void schoolDay()  
    {  
    System.out.print(“Teachers teaching”);  
    }  
}  

public class TeacherAide extends Teacher 
{ 
    public void schoolDay() 
    { 
    System.out.print(“Students learning”); 
    } 
}

public class Main(){
    public static void main(String[] args){
        SchoolMember person1 = new SchoolMember(); 
        Teacher person2 = new Teacher();
        TeacherAide person3 = new TeacherAide();
        person2 = (Teacher) person3;
        person1.schoolDay();
        person2.schoolDay();
    }
}

此代碼的 output 為:Schools OpenStudentsLearning

但據我了解,代碼的 output 應該是 Schools OpenTeachers 教學

有人可以幫助我理解這個問題。

您正在談論的是稱為多態性的面向對象概念的一部分。 您報告的解釋是正確的,但我知道它可能有點復雜。 我認為有一種更簡單的說法(為了簡單起見,我將盡可能少地使用技術術語)。

讓我們介紹句柄和對象

object 是您使用關鍵字創建的,並且在您的計算機的 memory 中有一個地址。 object 是 class 的一個實例,例如,您有一個Teacher class,但可以創建任意數量Teacher對象,每個對象使用new關鍵字(例如new Teacher() )。 每個Teacher object 都包含它自己的非靜態字段和非靜態方法的副本。 每一個

另一方面,句柄只是指向 object 的指針。 在 Java 中,您可以簡單地使用Classname handlename定義句柄(例如Teacher myTeacher )。 句柄不攜帶任何信息,它僅指向 memory 或 null 中的特定null 因此,當您在代碼中執行以下語句時:

person2 = (Teacher) person3;

您只是說“讓句柄person2指向句柄 person3 指向的同一個object 但是從上一行我們知道person3 指向一個TeacherAide實例,所以現在 person2 也指向同一個實例! 因此,如果您現在調用person2.schoolDay() ,您就是在調用TeacherAide object 的schoolDay()方法,它當然會打印“學生學習”...

順便說一句, (Teacher)演員表是無用的,因為person3TeacherAide的句柄,它是Teacher的子類,所以它本身可以被視為沒有任何明確演員表的Teacher 換句話說: TeacherAide始終是Teacher (在您的模型中),而不是每個Teacher都是TeacherAide 因此,只有在向下轉換時才需要顯式轉換。

你引用的解釋是非常正確的。 但是,並不直接適用於您的示例。 在您的情況下,您正在擴展 class SchoolMember並覆蓋其方法schoolDay() 因此,您仍然可以調用方法schoolDay()而不會出現任何編譯錯誤。 同時,作為根據 object 的實際類型動態調用的任何方法,您仍在調用被覆蓋的方法。

相反,以下示例會由於向上轉換而產生錯誤:

public class SchoolMember 
{
    public void schoolDay() {
        System.out.print(“School open”); 
    } 
}

public class Teacher extends SchoolMember  
{  
    public void newMethod(){  
        System.out.print(“Teachers teaching”);  
    }  
}

public class Main(){
    public static void main(String[] args){
        SchoolMember person1; 
        Teacher person2 = new Teacher();
        person1 = (SchoolMember) person2;
        person1.newMethod(); \\ Error even if you are referring to a Teacher object
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM