当前位置: 首页 > 知识库问答 >
问题:

不明白为什么子类必须显式调用有参数的基类构造函数

萧自珍
2023-03-14

子类被迫显式调用基类的构造函数似乎没有意义。如果用户可以创建自己的构造函数,而不局限于基类,将会更加灵活。有谁能告诉我为什么JAVA里要强制这种行为?这有什么好处呢?

class A
{                                                                                                    
  public A(String s)
  { 
    System.out.println(s);
    System.out.println("BASE parameter constructor");
   }   
}

class C extends A
{  
       public C(String s)   
       {
        super(s);// why here compiler force to call constructor of base class
        System.out.println("Sub parameter constructor");
        }
}

共有3个答案

司马庆
2023-03-14

8.8.9.默认构造函数

如果类不包含构造函数声明,则隐式声明没有形式参数和 throws 子句的默认构造函数。

如果要声明的类是基类 Object,则默认构造函数具有空主体。否则,默认构造函数只是调用不带参数的超类构造函数。

如果默认构造函数是隐式声明的,但是超类没有可访问的构造函数(6.6),该构造函数没有参数,也没有throws子句,那么这就是一个编译时错误。

史同化
2023-03-14

创建新类时,不必指定构造函数。Java在编译期间隐式地为您创建一个。这样的构造函数称为默认构造函数。

如果你的类没有指定一个构造函数,如果你继承了这个类,同样的,你也不需要显式的提供一个构造函数。

但是,当您的类中开始具有构造函数时,Java 不会为您创建默认构造函数。如果构造函数至少包含一个输入参数,则子类必须调用父类的构造函数。

贲凌
2023-03-14

因为基类没有默认从子类调用的无参数构造函数

如果你只是这样做

public C(String s)
    {
        System.out.println("Sub parameter constructor");
    }

然后对超级构造函数的默认调用将被放置在那里,它将变成

public C(String s)
    {
    super();
    System.out.println("Sub parameter constructor");
    }

但是编译器不提供无参数构造函数,因为您已经定义了一个参数化构造函数,只有在没有为该类提供其他构造函数时才会提供该构造函数。

 类似资料:
  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 本文向大家介绍hibernate 实体类必须要有无参构造函数吗?为什么?相关面试题,主要包含被问及hibernate 实体类必须要有无参构造函数吗?为什么?时的应答技巧和注意事项,需要的朋友参考一下 hibernate 中每个实体类必须提供一个无参构造函数,因为 hibernate 框架要使用 reflection api,通过调用 ClassnewInstance() 来创建实体类的实例,如果没

  • 问题内容: 为什么Eclipse总是在构造函数上给我错误: 错误是: 类 密集板 类 板 问题答案: 您只需执行此操作即可将值发送到父类。

  • 问题内容: 考虑以下代码: 如果我们在超类中有一个构造函数,那么我们为子类构造的每个对象(例如,用于类调用的对象及其父对象)都将调用它。 为什么会这样? 该程序的输出为: 在超类的构造函数中 在子类的构造函数中 总和是25 在超类的构造函数中 在子类的构造函数中 总和是29 问题答案: 因为它将确保在调用构造函数时,它可以依赖于其超类中已初始化的所有字段。 请参阅此处的 3.4.4

  • 问题内容: 因此,问题或多或少是我写的。我知道可能还不清楚,所以我举一个例子。 我有Tree类,其中有Node类,并且Tree的空构造函数被编写为: Eclipse给我一个错误:空构造函数中的“ new RBTree()”没有“由于某些中间构造函数调用而导致RBTree类型的封闭实例不可用”。但是,如果将RBNode更改为静态类,则没有问题。 那么,为什么在类为静态的时候它可以工作。 顺便说一句,

  • 为什么下面没有编译: 如有需要,请提供更多详细信息: 我想将tmp传递给父构造函数