2012-12-18 102 views
2

我對多態性感到困惑,我想知道這是否考慮多態?這是考慮多態嗎?

我覺得它看起來很奇怪,但它仍然編譯正確。

public class Family { 
    void FamilyInfo() { 
     System.out.println("This is a family super class"); 
    } 
} 

public class Grandparents extends Family { 
    void FamilyInfo() { 
     System.out.println("Graparents are the elders in the family and they are the sub class of family"); 
    } 
} 

public class Parents extends Grandparents { 
    void FamilyInfo() { 
     System.out.println("The parents are the children of the grandparents and they are the sub sub class for family"); 
    } 
} 

public class FamilyDemo { 
    public static void main(String ary[]) { 
     Grandparents Gp = new Grandparents(); 
     Parents P1 = new Parents(); 


     Gp.FamilyInfo(); 
     P1.FamilyInfo(); 

    } 
} 
+0

我想表現出多態,你應該建立一個家庭變量,分配給它一個新的父母()對象,並調用其'FamilyInfo()'方法。這樣你就可以看到對象的方法被調用,而不是變量類型的方法。另外,您應該學習Java命名約定,並在代碼中使用它。變量和方法名稱應以小寫字母開頭,而類名稱應以大寫字母開頭。 –

回答

3

您的方法FamilyInfo在層次結構中的所有三個類中都被覆蓋。這是polymorphism的一個例子。

當你調用Gp.FamilyInfo();:它會調用Grandparents類實現的方法和打印Graparents are the elders in the family and they are the sub class of familyP1.FamilyInfo();會調用該方法Parents類和打印The parents are the children of the grandparents and they are the sub sub class for family

因此,您可以看到相同的方法FamilyInfo()有兩種不同的行爲,即多態行爲。

您的示例與本教程中提到的示例非常相似:Java Tutorial : Polymorphism。所以不要感到困惑。

0

polymorphism一個很好的例子將是:

public static void print(Family[] family){ 
    for(int i=0; i< family.length; i++){ 
     family[i].FamilyInfo(); 
    } 
} 

public static void main(String args[]) 
{ 
    Family[] family = new Family[2]; 
    Grandparents Gp = new Grandparents(); 
    Parents P1 = new Parents(); 
    family[0] = Gp; 
    family[1] = P1; 

    //and then send the array to another method which 
    //doesn't "know" which entry in the array is a parent and which is grandparent 
    //and there you can loop the array calling family[i].FamilyInfo(); 
    //THIS is the whole idea of polymorphism in a nutshell 
    print(family); 

} 
0

多態性的字典定義是指一個原則在 生物學中的生物體或物質可具有許多不同的形式 或階段

基本概念是給定對象的行爲像另一個。這是通過在Java中使用接口和繼承來實現的。

這方面的一個更好的例子是(與你的代碼爲基礎)

public class FamilyDemo { 
    public static void main(String ary[]) { 
     Family gp = new Grandparents(); 
     Family p1 = new Parents(); 

     dump(gp); 
     dump(p1); 
    } 

    public static void dump(Family family) { 
     family.FamilyInfo(); 
    } 
} 

這基本上可以讓GradparentsParents,以「行爲」,因爲它們是Family

1

的例子並不能說明多態性,而是我可以看到簡單的面向對象的繼承。爲了使用多態的概念,代碼應該是下面的代碼。

public class FamilyDemo 
{ 
    public static void main(String ary[]) 
    { 
     Family Gp = new Grandparents(); 
     Family P1 = new Parents(); 

     Gp.FamilyInfo(); 
     P1.FamilyInfo(); 
    } 
} 

即使GpFamily型的,它的行爲就像Grandparents類型,因爲它是與該類型的對象初始化。

然後,可能會有以下內容: Graparents是家庭中的長輩,他們是家庭的子類。 父母是祖父母的孩子,他們是家庭的子分類。

+0

+1,這是非常真實的 –

1

我們的培訓師說使用擴展更多的是繼承的例子。但是如果我們使用實現(接口),我們可以說它是多態的,因爲我們可以實現許多接口。

例如

interface Horse { 
    void run(); 
} 

interface Eagle { 
    void fly(); 
} 

public class Pegasus implements Horse, Eagle { 
    // Implement methods 
    public void run() { 
     // do run 
    } 
    public void fly() { 
     // do fly 
    } 
} 
0

1。什麼是多態?

在面向對象編程中,多態性(從希臘語意思是「具有多種形式」)是能夠爲不同上下文中的某個事物分配不同含義或用法的特性 - 具體而言,允許實體一個變量,一個函數或一個對象擁有多個表單。多態性

2.兩種A)靜態或編譯時間多態性

哪一種方法是被稱爲僅在編譯時被確定。方法重載是this.for例如

在這裏你可以看到有相同名稱但不同的簽名

B)動態或運行時多態性的兩個功能的一個例子。

運行時多態性也稱爲方法覆蓋。在這種機制中,如果基類包含被覆蓋的方法,則在運行時(而不是在編譯時)解析對重寫函數的調用。

Class BaseClass 
{ 
Public void show() 
{ 
Console.WriteLine("From base class show method"); 
} 
} 
Public Class DynamicDemo : BaseClass 
{ 
Public void show() 
{ 
Console.WriteLine("From Derived Class show method"); 
} 
Public static void main(String args[]) 
{ 
DynamicDemo dpd=new DynamicDemo(); 
Dpd.show(); 

} 
} 
0

從技術上講,這是多態性。然而,你選擇了一個糟糕的例子,似乎你並不完全理解多態性背後的想法。一個更好的例子會是這樣的。

public abstract class Shape { 
    public abstract void drawShape(); 
} 

public class Rectangle extends Shape { 
    public void drawShape() { 
    // code for drawing rectangle 
    } 
} 

public class Circle extends Shape { 
    public void drawShape() { 
    // code for drawing circle 
    } 
} 

public class FilledRectangle extends Rectangle { 
    public void drawShape() { 
    super.drawShape(); 
    // code for filling rectangle 
    } 
} 

然後,負責繪圖的類不需要知道如何繪製每個單獨的形狀。相反,它可以做到這一點

public void drawAllShapes(Shape[] myShapes) { 
    for (int i = 0; i < myShapes.length; ++i) { 
    myShapes[i].drawShape(); 
    } 
} 

的目標是抽象掉的具體實施和所有一起去,而是隻提供通用接口的細節。這使得使用不同的類更容易,正如您在上面的最後一個方法中看到的那樣。

0

是的,在您的示例程序中,您使用的是繼承和多態,事實上兩者都是關閉的。

您正在使用繼承因爲你一旦家庭從祖父母類擴展,而一旦父母類擴展祖父母和您還使用polimorphism,因爲你在你的子類寫這是寫在中超的方法無效FamilyInfo類。

你應該以這種方式使用@Override

public class Parents extends Grandparents { 
    @Override 
    void FamilyInfo() { 
     System.out.println("The parents are the children of the grandparents and they are the sub sub class for family"); 
    } 
}