为什么Java对象类在强制转换后保持不变?
我试着向上抛一架飞机。但在运行时,对象类仍然是派生类为什么Java对象类在强制转换后保持不变?,java,class,upcasting,Java,Class,Upcasting,我试着向上抛一架飞机。但在运行时,对象类仍然是派生类 Derived drv = new Derived(); Base base = (Base) drv; System.out.println("Class : " + base.getClass()); //prints -> Class : class packagename.Derived 那么为什么类属性没有改变呢 那么为什么类属性没有改变呢 因为对象没有更改,所以只更改对它的引用类型。投射对对象本身没有任何影响 在J
Derived drv = new Derived();
Base base = (Base) drv;
System.out.println("Class : " + base.getClass());
//prints -> Class : class packagename.Derived
那么为什么类属性没有改变呢
那么为什么类属性没有改变呢
因为对象没有更改,所以只更改对它的引用类型。投射对对象本身没有任何影响
在Java中,和其他一些语言不同(谢天谢地),引用的类型在很大程度上不会影响得到的方法的版本。例如,考虑这两个类(礼貌-谢谢!):
此代码:
Child x = new Child();
Base y = (Base) x;
y.foo();
…输出
I'm the child!
此代码不会编译:
Child x = new Child();
Base y = (Base) x;
y.bar(); // <=== Compilation error
Child x=new Child();
基y=(基)x;
y、 bar();// 不能在Java中更改实例的类型。使用强制转换所做的只是从不同类型的变量引用它。向上转换不会更改对象的类型。事实上,Java对象的类型不会改变
这是OO编程的核心:一个对象有一个定义的行为,不能从外部影响。一个对象有一个定义的行为,不能从外部影响。
不完全:)好的,不能从外部覆盖或绕过它。更好?OOP背后的意图是一回事;Java的语义与此完全不同。具体来说,引用转换与对象的已定义行为没有多大关系。这是关于引用和对象的问题。@T.J.克劳德:不,我们这里说的是一个向上投射:@Marko Topolnik最初的问题是,为什么投射没有影响getClass()的结果。这与对象的行为有关,不是吗?我让你玩这个概念,但为时已晚。T.J.的答案是正确的。@2rs2ts:谢谢,我已经把它添加到我的答案中,非常感谢。你的意思是“…对象的类型…”?一个实例是指向对象的引用变量。基数=(基数)drv;不将drv指向的派生类型对象转换为基类型对象。它只是说明派生类型对象可以被视为基类型对象,并且可以执行基类型对象可以执行的所有操作。@NoName:答案中的任何地方都没有“转换”一词。@t.J.Crowder:噢,您可能误解了我的注释,认为这是对您答案的更正。我只是想澄清演员的思维方式。@NoName:好的。我想我在实际答案中已经很好地涵盖了这一点。
class Child extends Base {
public Child() {}
public void foo() {
System.out.println("I'm the child!");
}
public void bar() {
System.out.println("I'm Child#bar");
}
}
Child x = new Child();
Base y = (Base) x;
y.bar(); // <=== Compilation error