1

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

问候,

代码:

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
4

4 回答 4

3

实例方法规则

当使用引用在对象上调用实例方法时,由引用表示的当前对象的类,而不是引用的类型,决定了将执行哪个方法实现。

实例属性/字段规则

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

于 2017-08-09T12:18:06.743 回答
2

你面对隐藏的领域

在一个类中,与超类中的字段同名的字段会隐藏超类的字段,即使它们的类型不同。在子类中,超类中的字段不能通过其简单名称来引用。相反,必须通过 super 访问该字段,这将在下一节中介绍。一般来说,我们不建议隐藏字段,因为它会使代码难以阅读。

于 2017-08-09T11:43:46.930 回答
1

hiding和之间有区别overriding。您不能覆盖类字段,而是类方法。这意味着在您的具体示例中

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

您有一个类型VehicleCar. 将使用覆盖的方法,同时隐藏类字段。

如果你使用

Car myCar = new Car()

你会得到

myCar.type // car
myCar.super.type // vehicle
于 2017-08-09T11:47:18.597 回答
1

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

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

在您的情况下,您隐藏了超类的成员变量。但是在创建对象之后,您可以访问超类的隐藏成员。

于 2017-08-09T11:51:24.090 回答