2013-05-30 35 views
3

一個子類,比方說:創建從超

class A { 
    public int fieldA = 0; 
} 

class B extends A { 
    public int fieldB = 0; 
} 

現在,我想從一個創造B的一個實例:

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

這給了一個ClassCastException。我可以在B中的costructor,需要一個一個實例和複製領域,但它顯然是非之實踐:

class B extends A { 
    public int fieldB = 0; 

    B (A a){ 
     fieldA = a.fieldA; 
    } 
} 

謝謝您的幫助

+2

究竟是什麼問題?很明顯,你不能假裝任何對象都是一個List,一個Car或一個Socket。所以如果你想要一輛汽車,你必須創造一輛汽車。創建一個對象並將其投射到汽車上不會神奇地使它成爲汽車。 –

+0

[顯式從超類轉換爲子類]的可能重複(http://stackoverflow.com/questions/4862960/explicit-casting-from-super-class-to-subclass) –

回答

8

看看下面的例子

public class Animal 
{ 
    public void eat(){} 
} 
public class Dog extends Animal 
{ 
    public void eat(){} 
    public void main(String[] args) 
    { 
    Animal animal=new Animal(); 
    Dog dog=(Dog) animal; //will not work 
    } 
} 

通過使用一個轉換,你基本上告訴編譯器「相信我,我是一個profe我知道我在做什麼,我知道雖然你不能保證,但我告訴你,這個動物變量肯定會成爲一隻狗。「由於動物實際上並不是一隻狗(它是一種動物,你可以做動物動物=新的狗();它會是一隻狗),因爲你在運行時拋出一個異常,因爲你違反了信任(你告訴編譯器一切都會好的,不是!)

如果你嘗試在不同的繼承層次結構中投射對象(比如將一個Dog轉換爲一個字符串,例如編譯器比一味地接受一切),那麼編譯器會將它扔回給你,因爲它知道這永遠不可能工作。

因爲你基本上只是從停止抱怨編譯器,每次你投來檢查,你不會在if語句(或諸如此類的話。)

使用的instanceof造成一個ClassCastException是非常重要的

在你的情況下,你說我的引用b將指向B點的對象,然後你將它指向A類的對象(它不是B引用的期望的B類對象)。因此你得到了classCastException。

你可以做類似

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

類鑄件的用途是不同的東西。

class Employee() 
{ 
    //body 
} 

class SalariedEmployee extends Employee() 
{ 
    //body 
} 

你有一些多態代碼。

public static void met(Employee e) 
{ 
    SalariedEmployee s = (SalariedEmployee)e 
} 

public static void somemethod() 
{ 
    //You write a polymorphic method 
    //You will create a list of Employees 
    //Then you can write 
    ArrayList<Employee> employees = new ArrayList<Employee>() 

    //Create a SalariedEmployee 
    Employee e = (Employee) new SalariedEmployee() 
    employees.add(e); 

    e = (Employee) new CommissionEmployee() 
    employees.add(e);   

} 

你不能這樣做,因爲SalariedEmployee b = (SalariedEmployee) new Employee();Employee不能保證是一個SalariedEmployee

1

試試這個,它會幫助你。 我會告訴你可以在你的程序中實現的小演示。

//Inheitance Pass Reference of Child class into Super class object 
class A 
{ 

    void display() 
    { 
     System.out.println("\n\nSuper class A Dispaly method."); 
    } 
} 

class B extends A 
{ 

    void display1() 
    { 
     System.out.println("\n\nDerived class B Dispaly method."); 
    } 

    public static void main (String args[]) 
    { 
     A objA = new A(); 
     objA.display(); 

     A a1; 
     B b1 = new B(); 

     //Here is your answer. 
     a1=b1; //Dynamic Method Distpatch 
     //a1 = new B(); //This will also work. //Dynamic Method Distpatch 

     a1.display1();  
    } 
} 
1

A實際上不是B(不是每一個A是B,但所有B是A)

你可以那樣做:

A a = new B(); 
if (a instanceof B) { 
    B dog = (B) a; 
} 
1

比方說,你有AnimalDog extends Animal。你可以說「狗是動物」Animal animal = new Dog())但你不能說「動物是狗」Dog dog = new Animal())。

Animal也可以是一個Cat或什麼的,而DogCat必然是一個Animal

0

另外孩子總是知道通過使用extends關鍵字完成的父母,但父母沒有關於孩子的知識。當寫入以下內容時:

A a = new B();

由於子句中的extends子句,編譯器能夠將子引用指定給在編譯時本身解析的父指針。繼承關係在編譯時自己解決。 Java中的Casts隻影響引用的處理;他們從不改變實際對象的形式。引用指向的對象從不改變,只有編譯器(或運行時系統)的概念被改變。