Java中类似指针的行为

Java中类似指针的行为,java,reference,class,pointers,extends,Java,Reference,Class,Pointers,Extends,我得到以下信息: class A{ int foo; } class B extends A{ public void bar(); } 我得到了a的一个实例,希望在不丢失对变量foo的引用的情况下将其转换为B的实例 例如: 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 A A

我得到以下信息:

class A{  
    int foo;  
}  
class B extends A{  
    public void bar();  
}
我得到了a的一个实例,希望在不丢失对变量foo的引用的情况下将其转换为B的实例

例如:

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
A A=新A();
a、 foo=2;

B=a Java不支持这一点。您可以利用多态性将
B
的实例视为
A
的实例,但不能反过来

您不能这样做的原因是,没有类型安全的方法来保证
A
的实例实际上是
B
的实例(您可以强制转换该实例,但即使您这样做了,您也只能保证自己在执行时出现异常)

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

某种类型的任何实例都是另一种类型的实例。

例如:

任何狗的例子都是哺乳动物的例子。
任何哺乳动物的例子都是狗的例子

请注意,第一个示例为true,而第二个示例为false。在代码示例中,您试图做的事情与试图将任何哺乳动物视为狗一样——尽管有时可能是真的,但从绝对意义上讲,它不是真的,这意味着编译器将不允许这样做


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

类型的实例,Java不支持这种情况。您可以利用多态性将
B
的实例视为
A
的实例,但不能反过来

您不能这样做的原因是,没有类型安全的方法来保证
A
的实例实际上是
B
的实例(您可以强制转换该实例,但即使您这样做了,您也只能保证自己在执行时出现异常)

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

某种类型的任何实例都是另一种类型的实例。

例如:

任何狗的例子都是哺乳动物的例子。
任何哺乳动物的例子都是狗的例子

请注意,第一个示例为true,而第二个示例为false。在代码示例中,您试图做的事情与试图将任何哺乳动物视为狗一样——尽管有时可能是真的,但从绝对意义上讲,它不是真的,这意味着编译器将不允许这样做


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

的实例。请使用副本构造函数:

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

使用复制构造函数:

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

您不能简单地这样做,因为变量
a
的运行时类型无论如何都是
a
,而不是
B


这意味着
a
将不具有
B
的特征。。你不能用石膏获得它

您不能简单地这样做,因为变量
a
的运行时类型无论如何都是
a
,而不是
B


这意味着
a
将不具有
B
的特征。。你不能用石膏获得它

您可能想尝试一点“组合重于继承”或good old添加额外的间接层。您可能想尝试一点“组合重于继承”或good old添加额外的间接层。foo是一个int,不会被引用,它将被复制到一个新的foo中。有一个简单的解决方法-使用
Integer
包装类而不是
int
@Shmoo:听起来你基本上想在类a的特定实例中使用类B的一些特性。好吧,你不能这样做,句号。如果你想要的话,我怀疑你的设计有问题。foo是int,不会被引用,它将被复制到一个新的foo中。有一个简单的解决方法-使用
Integer
包装类而不是
int
@Shmoo:听起来你基本上想在类a的特定实例中使用类B的一些特性。好吧,你不能这样做,句号。如果你愿意,我怀疑你的设计有问题。