Java中的类指针行为

时间:2010-04-09 13:58:14

标签: java reference class pointers extends

我得到了以下内容:

class A{  
    int foo;  
}  
class B extends A{  
    public void bar();  
}

我有一个A的实例,想要将它转换为B的实例,而不会丢失对变量foo的引用。

例如:

A a = new A();  
a.foo = 2;  
B b = a; <-- what I want to do.  
//use b  
b.foo = 3;  
//a.foo should now be 3

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

Java不支持此功能。您可以利用多态来将B的实例视为A的实例,而不是相反。

你无法做到这一点的原因是因为没有类型安全的方法可以保证A的实例实际上是B的实例(你可以投射实例但即使你你是否只是在执行时保证自己是一个例外)。

判断类型之间是否存在类型安全的多态关系的最佳方法是测试此语句的有效性:

  

某种类型的任何实例都是其他类型的实例。

例如:

  

Dog的任何实例都是Mammal的一个实例。
  任何Mammal实例都是Dog的实例。

请注意,第一个示例为true,而第二个示例为false。你在你的代码示例中尝试做的就像试图将任何哺乳动物当作狗一样 - 即使它偶尔也可能是真的,但这并不是真正的,这意味着编译器不会允许它。

同样,对于可能为真的情况,您必须转换引用,但这会在执行时为您打开异常。上面的具体示例是发生异常的时间之一,因为我们可以清楚地看到您已实例化了A类型的实例。

答案 1 :(得分:0)

使用复制构造函数:

class B extends A{  
    public B(A a){
        this.foo = a.foo;
    }
}

答案 2 :(得分:0)

你无法做到这一点,因为变量a的运行时类型无论如何都是A,而不是B

这意味着a将不具有B的特征..并且您无法通过演员获得它!