为什么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