【问题标题】:Java object declaration by assigning to a sub object [duplicate]通过分配给子对象的Java对象声明[重复]
【发布时间】:2016-07-28 22:56:54
【问题描述】:

我是 Java 新手,但我无法理解一件事:

当我通过分配给子对象(类扩展对象)来声明对象时,它无法访问子对象属性。 这是为什么呢?

假设我有这个:

public class A {
    public int a;
}

public class B extends A {
    public int b;
}

当我像这样创建一个 B 对象时:

A object = new B();

我无权访问object.b

我不得不这样声明

B object = new B();

我的对象不应该是第一种方式的 B 吗?

【问题讨论】:

  • 您的 object 是 B -- 但是您调用该方法的 reference 可以指向任何 A 对象,并且受到限制到A接口。

标签: java inheritance


【解决方案1】:

如果你打电话给myfunc()

A object = myfunc();

我将myfunc() 定义为:

A myfunc() {
   if (new Random().nextBoolean()) {
       return new A();
   } else {
       return new B();
   }
}

您还能期望始终访问object.b 吗?没有。myfunc() 只是承诺它会返回 A 类(或从 A 类派生)的东西

【讨论】:

    【解决方案2】:

    对象的类型为B,仅在运行时,在编译时,编译器并不认为它的实际类型是B,因为变量object被声明为A类型,需要显式向下转换

    A object = new B();
    B b = (B)object;
    int x = b.b;
    

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多