Java 继承最后一个字段并将子类对象强制转换为父类以使用它

Java 继承最后一个字段并将子类对象强制转换为父类以使用它,java,inheritance,final,Java,Inheritance,Final,我在阅读有关继承的内容时发现,即使将子类对象强制转换为父类并尝试使用该对象调用重写的方法(请参阅),子类方法也会被调用 但在我的问题中,为什么即使对象类型是Class Sub,也要打印父类变量值?如果使用.staticMember,静态成员由用于引用它的表达式类型解析 在这种情况下,((Test)s)是类型为Test的表达式,这就是为什么Test.FOO在((Test)s.)中被引用的原因 请注意,使用实例引用静态成员是不好的做法,因为这只会导致混淆。始终使用.staticMember可以避免这

我在阅读有关继承的内容时发现,即使将子类对象强制转换为父类并尝试使用该对象调用重写的方法(请参阅),子类方法也会被调用


但在我的问题中,为什么即使对象类型是Class Sub,也要打印父类变量值?

如果使用
.staticMember
,静态成员由用于引用它的表达式类型解析

在这种情况下,
((Test)s)
是类型为
Test
的表达式,这就是为什么
Test.FOO
((Test)s.)中被引用的原因

请注意,使用实例引用静态成员是不好的做法,因为这只会导致混淆。始终使用
.staticMember
可以避免这种混淆,即使用

class Test {
public static final String FOO = "foo";
public static void main(String[] args) {
Test b = new Test();
Sub s = new Sub();
System.out.print(Test.FOO);           /* Prints foo */
System.out.print(Sub.FOO);            /* Prints bar */
System.out.print(b.FOO);              /* Prints foo */
System.out.print(s.FOO);              /* Prints bar */
 System.out.print(((Test)s).FOO);     /* Prints foo but Why?*/ 
 } }
 class Sub extends Test {public static final String FOO="bar";}


final static
变量不能重写是的,您是对的。但是为什么最后一个System.out.print打印的是“foo”而不是bar。?因为这是父类的值,不能被重写。但在方法的情况下,因为它们可以被重写,所以这取决于对象的类型而不是引用。对吧?这是毫无疑问的。谢谢
Test.FOO
Sub.FOO