에서 서브 클래스를 생성합니다. 나는 A A 인스턴스를 받아 필드를 복사 B에 costructor을 할 수 있지만, 분명히 비 pratical입니다 : 의가 있다고 가정 해 봅시다
class B extends A {
public int fieldB = 0;
B (A a){
fieldA = a.fieldA;
}
}
당신의 도움이
에서 서브 클래스를 생성합니다. 나는 A A 인스턴스를 받아 필드를 복사 B에 costructor을 할 수 있지만, 분명히 비 pratical입니다 : 의가 있다고 가정 해 봅시다
class B extends A {
public int fieldB = 0;
B (A a){
fieldA = a.fieldA;
}
}
당신의 도움이
은 다음 예제를 가지고
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을 얻는다.
당신의 당신이 Animal
및 Dog extends Animal
을 가지고 있다고 가정 해 봅시다
A a = new B();
B b = (B) a;
주셔서 감사 클래스 캐스트에 대한 사용은 다른 무언가이다.
class Employee()
{
//body
}
class SalariedEmployee extends Employee()
{
//body
}
일부 다형성 코드가 있습니다. 모든 Employee
가 SalariedEmployee
이 보장되지 않기 때문에
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();
할 수 없습니다.
시도해보십시오. 도움이 될 것입니다. 프로그램에서 구현할 수있는 작은 데모를 보여 드리겠습니다.
//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();
}
}
A
이 아닌 실제로 B
(안 모든 A는 B이다, 그러나 모든 B는 것입니다)
당신은 그런 식으로 작업을 수행 할 수 있습니다
A a = new B();
if (a instanceof B) {
B dog = (B) a;
}
뭔가를 할 수 있습니다. "개는 동물입니다" (Animal animal = new Dog()
) "동물은 개입니다" (Dog dog = new Animal()
)이라고 말할 수는 없습니다. Dog
또는 Cat
가 반드시 Animal
동안
Animal
는 또한 Cat
또는 무엇이든 될 수있다.
또한 children은 extends 키워드를 사용하여 수행되는 부모를 항상 인식하지만 부모는 자식에 대해 알지 못합니다. 다음을 쓸 때 :
A a = new B();
자식의 extends 절로 인해 컴파일러는 컴파일 타임에 확인 된 부모 참조를 자식에게 할당 할 수 있습니다. 상속 관계는 컴파일시에 해결됩니다. Java의 캐스트는 참조 처리에만 영향을줍니다. 그들은 실제 객체의 형태를 절대로 변경하지 않습니다. 참조가 가리키는 객체는 변환을 통해 변경되지 않으며 컴파일러의 (또는 런타임 시스템의) 개념 만 변경됩니다.
정확히 무엇이 문제입니까? 어떤 Object가 List, Map, Car 또는 Socket 인 척 할 수 없다는 것은 아주 명백합니다. 따라서 자동차를 원한다면 자동차를 만들어야합니다. Object를 생성하고 그것을 Car에 캐스팅해도 마술처럼 Car가되지는 않습니다. –
가능한 [수퍼 클래스에서 하위 클래스로의 명시 적 캐스팅] (http://stackoverflow.com/questions/4862960/explicit-casting-from-super-class-to-subclass) –