2013-05-30 3 views
3

Скажем:Создайте подкласс от суперкласса

class A { 
    public int fieldA = 0; 
} 

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

Теперь я хочу, чтобы создать экземпляр B из A:

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

Это дает ClassCastException. Я могу сделать costructor в B, который принимает Экземпляр и копировать поля, но это явно не практичное:

class B extends A { 
    public int fieldB = 0; 

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

Спасибо за вашу помощь

+2

В чем вопрос? Совершенно очевидно, что вы не можете притворяться, что любой объект является списком карты, автомобиля или гнезда. Поэтому, если вы хотите автомобиль, вы должны создать автомобиль. Создание объекта и отбрасывание его на автомобиль не волшебным образом превратит его в автомобиль. –

+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 
    } 
} 

С помощью броска вы, по сути, говорите компилятору «доверься мне. Я профессионал Я знаю, что делаю, и знаю, что, хотя вы не можете этого гарантировать, я говорю вам, что эта переменная для животных определенно будет собакой ».

Поскольку животное на самом деле не собака (это животное, вы можете сделать животное животных = новая собака(), и это будет собака), ВМ выдает исключение во время выполнения, потому что вы нарушили это (вы сказали компилятору, что все будет в порядке, а это не так!)

Компилятор немного умнее, чем просто слепо принимать все, если вы попытаетесь наложить объекты в разные иерархии наследования (например, приведите Собака к строке), тогда компилятор отбросит его обратно, потому что он знает, что никогда не может работать.

Потому что вы, по сути просто остановить компилятор из жалуюсь, каждый раз, когда вы приводите, важно, чтобы убедиться, что вы не будете вызывать ClassCastException с помощью InstanceOf в случае оператора (или что-то об этом.)

В вашем случае вы говорите, что моя ссылка 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 (не каждый А В, но все B является A)

Вы можете сделать это так:

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

Допустим, вы получили Animal и Dog extends Animal. Вы можете сказать «собака животное» (Animal animal = new Dog()), но вы не можете сказать «животное собака» (Dog dog = new Animal()).

Animal также может быть Cat или любым другими, в то время как Dog или Cat обязательно является Animal.

0

Также Child всегда знает родителя, который выполняется с использованием ключевого слова extends, но родитель не знает о ребенке. При написании следующего:

A a = новый B();

из-за предложения extends в дочернем языке, компилятор может назначить ссылку дочернего элемента на родительский элемент, который разрешен во время самого компиляции. Отношение наследования разрешается во время компиляции. Влияния в Java влияют только на обработку ссылок; они никогда не меняют форму фактического объекта. Объект, на который ссылается ссылка, никогда не изменяется путем его литья, изменяется только его компилятор (или система времени).

Смежные вопросы