比方说:
class A {
public int fieldA = 0;
}
class B extends A {
public int fieldB = 0;
}现在,我想从A创建一个B的实例:
A a = new A();
B b = (B) new A();这给出了一个classCastException。我可以在B中创建一个构造函数,它接受一个A实例并复制字段,但这显然是不实际的:
class B extends A {
public int fieldB = 0;
B (A a){
fieldA = a.fieldA;
}
}谢谢你的帮助
发布于 2013-05-30 17:53:17
以下面的例子为例
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
}
}通过使用强制转换,你本质上是在告诉编译器“相信我,我是专业的,我知道我在做什么,我知道尽管你不能保证,但我告诉你,这个动物变量肯定会是一只狗。”
由于动物实际上不是狗(它是动物,您可以执行animal animal = new Dog();它将是一条狗),VM在运行时抛出一个异常,因为您违反了这种信任(您告诉编译器一切都会好的,但事实并非如此!)
编译器比盲目地接受所有东西要聪明一点,如果你尝试在不同的继承层次中转换对象(例如,将Dog转换为字符串),那么编译器会将其抛回给你,因为它知道这永远不可能起作用。
因为您本质上只是阻止编译器抱怨,所以每次强制转换时,通过在if语句中使用instanceof (或类似的东西)来检查是否不会导致ClassCastException是很重要的。
在你的例子中,你说我的引用b将指向点B的对象,然后你让它指向类A的对象(这不是引用b所期望的类B的对象)。因此你得到了classCastException。
你可以这样做
A a = new B();
B b = (B) a;发布于 2013-05-30 17:42:37
类类型转换的用法是不同的。
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。
发布于 2013-05-30 17:51:02
试试这个,它会对你有帮助的。我将向您展示您可以在您的程序中实现的小演示。
//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();
}
}https://stackoverflow.com/questions/16832612
复制相似问题