【问题标题】:what happens while creating objects differently in inheritance in java?在 java 的继承中以不同的方式创建对象时会发生什么?
【发布时间】:2020-02-03 03:21:38
【问题描述】:

这是一个与继承有关的问题,我在一次采访中被问到。任何人都可以向我解释在下面给出的 4 种对象创建案例中会发生什么。任何人都可以帮我解决这个问题。提前致谢

class A {

    int i = 10;

    void printHi() {
        System.out.println("Hi in A");
    }
}

class B extends A {

    int k = 20;

    void printHi() {
        System.out.println("Hi in B");
    }
}

public class Test {

    public static void main(String[] args) {

        A a = new A();// 1.a.k is possible?
        A a = new B();//2.
        B b = new A();//3.b.i is possible?
        B b = new B();//4.
    }

}

【问题讨论】:

  • 您是否尝试添加代码以尝试访问a.kb.i,是否有效?
  • 您是否尝试编译此代码?
  • 学习 OO 的第一件事 - 避免使用无意义的名称,如 AB 等。而是将它们替换为有意义的名称,如 AnimalBudgie。那么,Animal a = new Budgie() 是否允许? (是的,因为 Budgie 是动物)。 Budgie B = new Animal() 是否允许? (不,因为动物可能不是 Budgie - 除了 Budgies 之外,可能还有其他动物)。
  • 1.不 2. 直接,不。有反射是 3. 编译错误 4. 是(假设TestAB 在同一个包中,否则否)。
  • @ElliottFrisch 2. 演员是的。

标签: java oop inheritance


【解决方案1】:

四种情况下只有三种有效。

A a = new A();
A a = new B();
B b = new B();

在Java继承中,您可以创建子类的实例并分配给超类,但不能相反B b = new A();(会出现编译错误),因为子类将从超类继承,所以所有方法如果被覆盖,要么从子类的超类运行。

如果您调用printHi 方法,您可以看到到底发生了什么。

  1. 对于A a = new A();printHi 将打印Hi in A,因为它是A 类的实例
  2. 对于A a = new b();printHi 将打印Hi in B,因为它是B 类的实例
  3. 对于B a = new B();printHi 将打印Hi in B,因为它是B 类的实例

【讨论】:

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