【问题标题】:Java: static- vs. dynamic binding (again)Java:静态与动态绑定(再次)
【发布时间】:2017-08-09 11:31:33
【问题描述】:

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

问候,

代码:

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

【问题讨论】:

标签: java dynamic-binding static-binding


【解决方案1】:

实例方法规则

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

实例属性/字段规则

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

【讨论】:

  • 这其实让我看了很久才明白。非常感谢!
【解决方案2】:

你面对的是fields hiding

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢,但我还有一个问题。我只是认为那辆车是我的超类,那为什么我要隐藏我的子类成员变量呢?还是 car 现在是超类,因为我使用了 Vehicle mySpecialCar = new Car()?
    • 你似乎很困惑。看看你做的事情是合法的,但不建议像表亲结婚一样:)。使用父引用调用字段将调用父字段而不是子对象,但对于方法则相反。
    • 是的,我很困惑 :-) 谢谢你的帮助,我也不推荐。 (这是学习书的一个例子……)
    【解决方案4】:

    hidingoverriding 之间存在差异。您不能覆盖类字段,而是类方法。这意味着在您的具体示例中

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

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

    如果你使用

    Car myCar = new Car()
    

    你会得到

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多