2015-03-31 49 views
-1

我有以下代碼:差異的這些對象(Java繼承)

class ExampleClass 
{ 
    public static void main(String[] args) 
    { 
     Bz bz1 = new Bz(); 
     Az bz2 = new Bz(); // Perfectly possible. 
    } 
} 

class Az 
{ 

} 

class Bz extends Az 
{ 

} 

現在,我不明白的是爲什麼它可以從類Az那樣創建一個對象。 有什麼區別。

這只是一個示例代碼,我只是想知道它們之間的區別。

謝謝。

+1

你是什麼意思「從Az類創建一個對象」?我建議你閱讀關於繼承的教程,例如https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html – 2015-03-31 14:39:10

+0

Person p = you; JavaDeveloper p2 = you;兩者都指向你。當使用p時,編譯器只知道你是一個人,而當使用p2時,編譯器知道你是一個Java開發人員。 – 2015-03-31 14:40:14

+0

如果'Bz'是'Dog','Az'是'Animal',那麼它就有意義,'Dog'是'Animal' :) – Maroun 2015-03-31 14:41:22

回答

3

看它是否更喜歡這個

class Cat 
{ 
    public static void main(String[] args) 
    { 
     // 1) 
     Cat cat = new Cat(); 
     // 2) 
     Animal anotherCat = new Cat(); // Perfectly possible. 
    } 
} 

class Animal {} 

class Cat extends Animal {} 

在1感)要創建一個Cat對象,你會暴露從Cat的所有方法,並從Animal因爲CatAnimal(在Java的轉換到extends)。

2)您正在創建Cat對象,並且您將公開Animal的所有方法。

不同之處在於,您使用catanotherCat將世界上的兩個不同界面暴露在外。

例如,假設你正在編寫與飼養動物交易的方法,該簽名可能是這樣的

public void abstract feed(Animal animal, Food food); 

你只是想要一個Animal,你不在乎,如果它是一個DogCat
一旦你編寫了feed的實現,你可能想要說animal.eat,其中eat將是所有Animal的一種方法。

+0

這是一個很容易理解的問題和基本繼承的例子! – EA91 2015-03-31 14:45:26

+0

我們非常歡迎你,我希望它是有道理的,我沒有犯任何重大錯誤:D – 2015-03-31 14:56:34

0

這就是你定義的確切關係。 Bz「是一個」阿茲(還有更多)。 就像每個拇指都是手指,但不是每個手指都是拇指。

0

這兩個類之間存在「是」的關係。所以Bz「是」Az。這就是爲什麼你可以通過聲明的變量作爲它的超類型(Az bz2

0

嘗試在其他領域的翻譯創建Bznew Bz())實例:

class ExampleClass 
{ 
    public static void main(String[] args) 
    { 
     Cat bz1 = new Cat(); 
     Animal bz2 = new Cat(); // Perfectly possible. 
    } 
} 

class Animal 
{ 

} 

class Cat extends Animal 
{ 

} 

貓是貓,但也是動物。這是子類繼承的簡單概念。

+0

我們想出了完全一樣的例子:D – 2015-03-31 14:42:13

+0

也許意大利人的愛情貓很多...我真的這樣做 – abarisone 2015-03-31 14:43:52

0

父/超類可以看作是子類的泛化。 這用於像這樣,例如:

class Person 
{ 
    public void talk() 
    { 
     System.out.println("I am a Person"); 
    } 
} 

class Student extends Person 
{ 
    @Override 
    public void talk() 
    { 
     System.out.println("I am a Student (also a Person)"); 
    } 
} 

class Test() 
{ 
    public static void main(String[] args) 
    { 
     List<Person> people = new ArrayList<Person>(); 
     people.add(new Person()); 
     people.add(new Student()); //ok, because a student IS also a person 

     //Will call the "right" methode, we only care about people and not the student details. 
     for(Person person : people) 
      person.talk(); 

    } 
} 
0
Bz bz1 = new Bz(); 

對象BZ1將不支持的運行時間的多態性。

超類中的某些方法的默認實現將不會在子類Bz無法自行執行的情況下執行。

Az bz2 = new Bz(); 

對象BZ2將支持運行時多態性,並能夠支持其他它的子類的聲明,如果你碰巧產生任何污染。由於它的繼承是-A UML關係,所以這樣的聲明是可能的。

超類中的某些方法的默認實現將在子類Bz不自行創建時執行。

面向對象程序設計的所有多義性方面都將在第二種情況下得到支持,而第一種情況則是獨立類。但它會繼承父類的屬性。