2013-05-30 2 views
3
슈퍼 클래스

에서 서브 클래스를 생성합니다. 나는 A A 인스턴스를 받아 필드를 복사 B에 costructor을 할 수 있지만, 분명히 비 pratical입니다 : 의가 있다고 가정 해 봅시다

class B extends A { 
    public int fieldB = 0; 

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

당신의 도움이

+2

정확히 무엇이 문제입니까? 어떤 Object가 List, Map, Car 또는 Socket 인 척 할 수 없다는 것은 아주 명백합니다. 따라서 자동차를 원한다면 자동차를 만들어야합니다. Object를 생성하고 그것을 Car에 캐스팅해도 마술처럼 Car가되지는 않습니다. –

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

캐스트를 사용하면 기본적으로 컴파일러에게 "나를 신뢰하십시오. 나는 전문가입니다. 당신이 그것을 보장 할 수는 없지만, 나는이 동물 변수가 분명히 개가 될 것이라고 말하고 있습니다. "

동물이 실제로 개가 아니기 때문에 (동물입니다. 동물 동물 = 새 Dog (개가 될 수 있습니다) 개가 될 수 있습니다.) VM은 런타임에 예외를 발생시킵니다. (컴파일러에게 모든 것이 괜찮을 것이라고 말했고 그렇지 않다!)

다른 상속 계층 구조에서 객체를 캐스팅하려고하면 컴파일러가 모든 것을 맹목적으로 받아들이는 것보다 약간 똑똑하다.) 컴파일러는 결코 작동 할 수 없다는 것을 알고 있기 때문에 그것을 다시 던질 것입니다. 당신은 본질적으로 불평에서 컴파일러를 중지하고 있기 때문에

은, 때마다 당신은 당신이 문 (또는 뭔가 그 효과.)는

에 instanceof를 사용하여 ClassCastException이 발생하지 않습니다 있는지 확인하는 것이 중요 캐스트

당신의 경우에 당신은 내 참조 b가 B 점의 객체를 가리킨다 고 말하면 클래스 A의 객체를 가리키게합니다 (이것은 참조 b가 기대하는 클래스 B의 객체가 아닙니다). 그러므로 classCastException을 얻는다.

당신의 당신이 AnimalDog extends Animal을 가지고 있다고 가정 해 봅시다

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

주셔서 감사 클래스 캐스트에 대한 사용은 다른 무언가이다.

class Employee() 
{ 
    //body 
} 

class SalariedEmployee extends Employee() 
{ 
    //body 
} 

일부 다형성 코드가 있습니다. 모든 EmployeeSalariedEmployee이 보장되지 않기 때문에

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(); 할 수 없습니다.

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 = new B(); 
if (a instanceof B) { 
    B dog = (B) a; 
} 
1

뭔가를 할 수 있습니다. "개는 동물입니다" (Animal animal = new Dog()) "동물은 개입니다" (Dog dog = new Animal())이라고 말할 수는 없습니다. Dog 또는 Cat가 반드시 Animal 동안

Animal는 또한 Cat 또는 무엇이든 될 수있다.

0

또한 children은 extends 키워드를 사용하여 수행되는 부모를 항상 인식하지만 부모는 자식에 대해 알지 못합니다. 다음을 쓸 때 :

A a = new B();

자식의 extends 절로 인해 컴파일러는 컴파일 타임에 확인 된 부모 참조를 자식에게 할당 할 수 있습니다. 상속 관계는 컴파일시에 해결됩니다. Java의 캐스트는 참조 처리에만 영향을줍니다. 그들은 실제 객체의 형태를 절대로 변경하지 않습니다. 참조가 가리키는 객체는 변환을 통해 변경되지 않으며 컴파일러의 (또는 런타임 시스템의) 개념 만 변경됩니다.

관련 문제