Java 动态绑定适用于方法。为什么不为其他成员[变量]?
在下面的程序中。方法按类型动态调用。但是动态调用变量怎么样。为什么不能呢Java 动态绑定适用于方法。为什么不为其他成员[变量]?,java,dynamic,Java,Dynamic,在下面的程序中。方法按类型动态调用。但是动态调用变量怎么样。为什么不能呢 class Super { public int field = 0; public int getField() { return field; } } class Sub extends Super { public int field = 1; public int getField() { return field; }
class Super {
public int field = 0;
public int getField() {
return field;
}
}
class Sub extends Super {
public int field = 1;
public int getField() {
return field;
}
public int getSuperField() {
return super.field;
}
}
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub();
System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
Sub sub = new Sub();
System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = "+ sub.getSuperField());
}
}
输出:
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
在这里,如果可以动态地找到sup.method(),为什么不能动态地获取sup.variable
可能吗?如果不是,为什么
当我们有(超视距)动物--->狗、猫、狮子时,我们称它的方法为“制造噪音”(makeNoise),我们会收到吠声或喵喵叫。。。分别地但是我们为什么不询问它的名称并相应地得到它呢?在Java中,成员变量具有静态绑定,因为Java不允许成员变量的多态行为
private
方法,因为它们从不被继承,编译器可以解析
仅在编译时调用任何私有方法。因此是静态绑定
第二,考虑下面的代码.
class SuperClass{
...
public String someVariable = "SuperClass";
...
}
class SubClass extends SuperClass{
...
public String someVariable = "SubClass";
...
}
...
...
SuperClass superClass1 = new SuperClass();
SuperClass superClass2 = new SubClass();
System.out.println(superClass1.someVariable);
System.out.println(superClass2.someVariable);
...
输出:-
超类
超类
成员变量仅基于对象引用的声明类型进行解析,
编译器最早只能在编译时找到
因此,在本例中是静态绑定
总之,Java开发人员基本上不希望这些检查在运行时发生,并在运行时出现异常。因为您重写了super class方法
public int getField() {
return field;
}
为什么不允许?因为语言是这样指定的。。。Java的设计理念是字段是状态,而不是接口。@Tetsujinnoni:我是一个初学者,你可以详细说明一下。用“因为p”回答“为什么p”似乎信息量不大。请参阅assylias的重复链接以获得合理的答案。@Andy“为什么不允许这样做?”“因为这是一个不允许这样做的设计决定,因为X是Y,而不是Z”对我来说似乎足够作为一个评论。