gpt4 book ai didi

java - 动态绑定(bind)适用于方法。为什么不为其他成员[变量]?

转载 作者:行者123 更新时间:2023-12-03 18:39:11 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Java Inheritance - instance variables overriding

(3 个回答)


8年前关闭。




在下面的程序中。方法根据类型动态调用。但是动态调用变量怎么样。为什么不能这样做?

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呢?

是否可以?如果不是为什么?

当我们有 (superclas)animal--->Dog,Cat,lion 我们调用它的方法说 makeNoise() 我们分别收到 bark 或 meow...。但是我们为什么不问它的名字并相应地得到它呢?

最佳答案

在 Java 中,成员变量具有静态绑定(bind),因为 Java 不允许成员变量的多态行为。
private方法,因为它们永远不会被继承并且编译器可以解析
仅在编译时调用任何私有(private)方法。因此静态绑定(bind)。

其次,考虑下面的代码..

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);
...

输出:-
父类(super class)
父类(super class)

成员变量仅根据对象引用的声明类型解析,
编译器只能在编译时找到它,并且
因此在这种情况下是静态绑定(bind)。

总而言之,基本上 Java 开发人员不希望这些检查在运行时发生并在此时出现异常。

关于java - 动态绑定(bind)适用于方法。为什么不为其他成员[变量]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17303662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com