2013-06-30 76 views
1

我無法清楚地瞭解Java中的繼承。例如,我有:在Java中獲得關於鑄造和繼承的清晰想法

class A 
{ 
    ... 
    public void MethodA(); 
} 

這裏一切都很清楚。然後我想要一個(子)類:

class B extends A 
{ 
    ... 
    public void MethodB(); 
} 

然後我創建一個A的實例。然後我想要得到一個B的實例,其中包含A的所有內容。我想製作類似aA = new B();但出現錯誤。

使用這件事情是不是真的很舒服:

A aA = new A(...);
B aB = new B(null,null,...);
aB = aA

我應該如何正確地做它,並獲取有關Java繼承一個明確的想法?

UPD:那麼我怎麼能得到B的所有東西的A實例?

+4

每隻狗都是動物,但不是每一隻動物都是狗。 – jlordo

+1

「_So我怎麼能得到B的所有東西的實例?_」什麼也不做。 'B'的每個實例已經擁有'A'的所有東西。 – jlordo

回答

4

聽起來好像你想要一個B的實例。一旦你有這樣的例子,你可以使用它要麼AB是必需的。

換言之,B的每個實例自動也是A的實例。

這被稱爲Liskov Substitution Principle

0

B每個實例都有從A所有的東西,因爲它是一個A。但看起來你實際上想從創建一個B的實例A的實例。這是不可能的,除非你專門寫你的類,以便允許它:

public class B extends A { 
    public B(A original) { ... } 
} 

後來

A a = new A(); 
B b = new B(a); 
1

在你的榜樣,A - 超,B - 子類。

子類擁有其超類的所有屬性和操作(因爲子類繼承了其超類的所有屬性和操作)。這意味着一個子類對象可以做任何超類可以做的事情。因此,當預期超類實例時,我們可以用一個子類實例來替代,並且一切都應該正常工作。這被稱爲可替代性。

1

您需要了解 IS-A的關係。我們來討論員工和經理的關係。

class Employee{ 
    public Employee(){ 
     System.out.println("Employee obj"); 
    } 
} 

class Manager extends Employee{ 
    public Manager(){ 
     System.out.println("Manager obj"); 
    } 
} 

通過擴展員工我們宣佈經理員工的專業化。因此,每經理僱員但每僱員不是經理

僱員的參考可以指的是滿足關係的對象。因此,這些都是完全合法的寫:

Employee emp1 = new Employee(); 
Employee emp2 = new Manager(); 

但是,如果我們嘗試寫

Manager man1 = new Employee(); //Wrong: Compilation error. 

這違反了 IS-A關係。由於這個,我們得到編譯時錯誤。爲了避免這種編譯錯誤,我們需要添加一個強制類型管理器。但是,鑄造到管理器只能避免編譯問題。作爲這種類型轉換的結果,您將得到一個 java.lang.ClassCastException

Manager man1 = (Manager) new Employee(); //Wrong: avoids compilation error but will generate a ClassCastException at runtime. 

我建議你去通過Java Language Specification: Section 5.5.1得到鑄造引用類型的完整概念。