Java:静态与动态绑定(再次)

Java: static- vs. dynamic binding (again)

我已经阅读了很多博客、教程和合作伙伴,但我对 java 中的动态绑定一无所知。当我创建名为 "myspecialcar" 的对象时,它会从 class "car" 创建一个对象作为 class 车辆的类型作为动态绑定,对吗? 所以 java 知道当我执行方法 myspecialcar.getType() 我有一个汽车对象,它从 class 汽车执行方法。但为什么我从 class 车辆得到 type?那是因为来自 class 车辆(类型)的变量是静态绑定吗?

此致,

代码:

public class vehicle {
    String type = "vehicle";

    public String getType(){
        return type;
    }
}

public class car extends vehicle {
    String type = "car";

    public String getType(){
        return type;
    }
}

public class test {
    public static void main (String[] args){
        vehicle myvehicle = new vehicle(); // static binding
        car mycar = new car(); // static binding
        vehicle myspecialcar = new car(); //dynamic binding

        System.out.println(myspecialcar.getType());
        System.out.println(myspecialcar.type);
        System.out.println(myspecialcar.getClass());
    }
}

输出:

car
vehicle
class car

您遇到了fields hiding

Within a class, a field that has the same name as a field in the superclass hides the superclass's field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super, which is covered in the next section. Generally speaking, we don't recommend hiding fields as it makes code difficult to read.

hidingoverriding有区别。您不能覆盖 class 字段,而是覆盖 class 方法。这意味着在您的具体示例中

Vehicle mySpecialCar = new Car() // use upperCase and lowerUpperCase pls

您有一个 Vehicle 类型,它是 Car 的一个实例。 class 字段将被隐藏时,将使用覆盖的方法。

如果你使用

Car myCar = new Car()

你会得到

myCar.type // car
myCar.super.type // vehicle

您不会在 Java 中覆盖 class 变量,而是隐藏它们。

覆盖是例如方法。隐藏不同于覆盖。

在你的例子中,你隐藏了 super class 的成员变量。但是在创建对象之后你可以访问super的隐藏成员class.

实例方法规则

在使用引用的对象上调用实例方法时,是引用所表示的当前对象的class,而不是type 的引用,它确定将执行哪个方法实现。

实例Property/Field规则

当使用引用访问对象的字段时,是引用的类型,而不是class 由引用表示的当前对象,它确定将实际访问哪个字段。