【问题标题】:I want to call only child class constructor in multilevel inheritance?我想在多级继承中只调用子类构造函数?
【发布时间】:2019-02-11 10:12:18
【问题描述】:
class A {
    public A() {
        System.out.println("Constructor A");
    }
}

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

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

    public static void main(String[] args) {
        C c = new C();
    }
}

运行代码时,它会调用所有构造函数,但只需要调用子构造函数。

像只打印一样输出

Constructor C

【问题讨论】:

  • 你不能那样做。时期。您可能不想为您的用例使用继承
  • 你为什么要那个?
  • 面试官问我
  • 我需要知道如何调用唯一的子类构造函数
  • @SachinDoifode 对我来说似乎是一个愚蠢的面试问题。也许它可以使用sun.misc.Unsafe

标签: java inheritance constructor constructor-chaining


【解决方案1】:

就像 cmets 和其他答案已经说过的那样,这显然是不可能的

如果一个类(类Foo)扩展了另一个类(类Bar),那么Foo的所有构造函数必须直接或间接调用Bar的构造函数之一。这可以通过显式调用或隐式调用来完成。

class Foo {

    // No constructor is specified, so a default, empty constructor is generated:
    // Foo() { }

}
class Bar extends Foo {

    Bar() {
        // Explicit call to a constructor of the super class is omitted, so a
        // default one (to Foo()) is generated:
        // super();
    }

}

Java Language Specification § 12.5 中记录了如何创建新实例。对于Object 以外的任何类,始终执行超级构造函数。

  1. 此构造函数不是以显式构造函数调用同一类中的另一个构造函数开始(使用 this)。如果此构造函数用于 Object 以外的类,则此构造函数将以显式或隐式调用超类构造函数开始(使用 super)。使用这五个相同的步骤递归地评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则此过程出于相同的原因突然完成。否则,请继续执行第 4 步。

所以super 构造函数总是 被调用。如果您只想打印“构造函数 C”,则需要执行以下任一操作:

  • 更改 B 的构造函数,使其不再打印“构造函数 B”,方法是删除 println 语句或一起删除无参数构造函数。
  • B 中添加第二个构造函数,它不会打印任何内容并从C 调用它:

    B(boolean b) {
    
    }
    
    C() {
        super(true);
    }
    
  • 确保C 不再扩展B

    class C {
        public C() {
            System.out.println("Constructor C");
        }
    }
    

【讨论】:

  • @Lino 你是对的,修复它。 (我交换了 Foo 和 Bar。)
【解决方案2】:

不,你不能这样做。 Java 会根据层次结构调用所有的构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多