【问题标题】:Casting objects and inheritance [duplicate]铸造对象和继承[重复]
【发布时间】:2018-05-12 15:30:32
【问题描述】:

我有这两个类,我想知道为什么输出是ABB.xxx。有人能解释一下为什么在投射时不是A.xxx吗?

这是我的两个类和主要方法:

public abstract class A {
    public A() {
        System.out.println("A");
    }

    public void xxx() {
        System.out.println("A.xxx");
    }

    abstract void yyy();
}

public class B extends A {
    public B() {
        System.out.println("B");
    }

    public void xxx() {
        System.out.println("B.xxx");
    }

    public void yyy() {
        System.out.println("B.yyy");
    }
}

public class ClassRunner {
    public static void main(String[] args) {
        B b2 = new B();
        ((A)b2) .xxx();    
    }
}

【问题讨论】:

标签: java object inheritance methods casting


【解决方案1】:

所以当你有继承时......表单的变量初始化

A my_A = new B()

B 延伸 A...的地方称为伪装。您将 B 的实例伪装成 A 的对象。经验法则是等号 (A) 左侧的类定义了允许在对象上调用的方法。由于 A 类有“.xxx()”方法,我们可以使用它。另一方面,等号右侧的类定义了我们使用的 .xxx() 方法的实际版本。由于 B 类在右侧,我们使用 B 的 .xxx() 版本。如果 B 没有 .xxx(),则默认使用 A 的版本。

【讨论】:

  • 那么既然等边两边都是B,你是说不管演员阵容,它都会使用B类中的方法?
  • 当你用 ( (A)b2 ) 将 b2 转换为 A 时,左侧变成了 A,但由于底层对象仍然是 B 的实例,它将使用 B 的 xxx( )
猜你喜欢
  • 2021-06-14
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多