Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态绑定适用于方法。为什么不为其他成员[变量]?_Java_Dynamic - Fatal编程技术网

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”对我来说似乎足够作为一个评论。