java - Java 中类似指针的行为

标签 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

感谢您的帮助!

最佳答案

Java不支持这个。您可以利用多态性将 B 的实例视为 A 的实例,但反之则不然。

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

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

Any instance of some type is an instance of some other type.

例如:

Any instance of Dog is an instance of Mammal.
Any instance of Mammal is an instance of Dog.

请注意,第一个示例为 true,而第二个示例为 false。您在代码示例中尝试做的事情就像尝试将任何哺乳动物视为狗一样 - 尽管有时可能是正确的,但绝对不是正确的,这意味着编译器将不允许这样做。

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

关于java - Java 中类似指针的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2608037/

相关文章:

java - Install4j:如何创建跨平台桌面快捷方式

python - 从相关实例获取实例的属性

javascript - 如何从 jQuery 中的隐藏字段获取数据? (隐藏字段用 class 代替 id)

android - dx 到 dex 的转换是否包括对原始类文件的验证?

java - spring-android-auth maven Artifact 构建错误

java - 我如何以编程方式在Android中放大mp3声音

java - 不发布的服务模块在 Helios 中不起作用

C++ 函数返回 NULL 字符串引用

c# - 添加一个实例以引用另一个实例中的字段

java - 抽象基类还是类?