黑马程序员——父类与子类的构造器

-----------  android培训 java培训 、java学习型技术博客、期待与您交流! ------------


代码:

class Base{

   Base(){

       System.out.println("Base with no arg");

    }

}

 

class Test extends Base{

   Test(int v){

    }

 

   public static void main(String[] args) {

       Test a = new Test(3); 

    }

}

输出

Base with no arg

这里子类里面没有显式调用父类的构造函数,但是父类的构造还是被调用了,说明Java加载类的时候,会加载父类的无参数的构造函数

 

 

class Base{

   Base(int val){

       System.out.println("Base int");

    }

}

 

class Test extends Base{

   Test(int v){

    //如果这里不调用super(v) 是无法通过编译的

    }

 

   public static void main(String[] args) {

       Test a = new Test(3);

    }

}

<think>好的,我需要回答用户关于Java中父类子类构造器隐式调用规则的问题。首先,我得回顾一下相关的知识点,确保自己理解正确。 用户的问题是关于构造器隐式调用的规则,也就是当子类构造器没有显式调用父类构造器时,系统会如何处理。根据引用[1],如果子类构造器没有显式调用超类的构造器,会自动调用超类默认的无参构造器。但如果超类没有无参构造器,而子类又没有显式调用其他构造器,就会编译报错。这一点很重要,需要详细说明。 接下来,引用[2]提到,即使一个类不继承任何类,它默认继承Object类,所以它的无参构造器会隐式调用super(),即Object的构造器。这也需要包含在回答中,说明所有类的最顶层父类都是Object,确保用户理解继承链的顶端。 然后,用户可能需要具体的例子来理解这些规则。比如,当父类有无参构造器时,子类构造器可以不显式调用,系统会自动处理。而如果父类只有有参构造器子类就必须显式调用super(参数),否则会报错。这部分需要用示例代码来展示,帮助用户直观理解。 另外,需要提到super调用必须作为子类构造器的第一条语句,这也是引用[1]中的内容。如果子类构造器中有其他代码在super之前,会导致编译错误。这一点需要强调,避免用户在实际编码中犯错。 还有静态内部类的问题,虽然用户的问题主要在于构造器,但引用[3]提到静态内部类不能访问外部类对象,这可能和当前问题关系不大,但可以暂时忽略,除非用户的问题有涉及内部类的情况,但当前不需要处理这部分。 最后,要确保回答结构清晰,分点说明规则,并附上示例代码和相关问题。用户可能需要了解其他相关的问题,比如如何调用父类有参构造器,或者默认继承Object的情况,所以生成的相关问题要涵盖这些方面。 总结回答的结构应该是: 1. 隐式调用规则:子类构造器默认调用父类无参构造器。 2. 父类没有无参构造器的处理方式。 3. super调用的位置限制。 4. Object类作为所有类的默认父类。 5. 示例代码展示两种情况。 6. 相关问题生成。 需要检查是否有遗漏,比如多重继承是否适用?不过Java是单继承,所以不存在这个问题。确保所有信息准确,并且引用正确的来源。同时使用中文,避免术语错误,比如“构造器”而不是“构造函数”。</think>### Java父类子类构造器隐式调用规则 在Java中,子类构造器父类构造器的调用遵循以下核心规则: 1. **隐式调用父类无参构造器** 若子类构造器未显式调用父类构造器(通过`super`关键字),则编译器会自动插入`super()`调用父类的**无参构造器**。 **示例**: ```java class Parent { Parent() { // 父类无参构造器 System.out.println("Parent constructor"); } } class Child extends Parent { Child() { // 隐式调用 Parent() System.out.println("Child constructor"); } } ``` 2. **父类无无参构造器的处理** 若父类**未定义无参构造器**,且子类未显式调用父类的其他构造器,则编译器会报错。此时必须通过`super(参数)`显式调用父类的有参构造器[^1]。 **示例**: ```java class Parent { Parent(int x) { // 父类仅定义有参构造器 System.out.println("Parent(x)"); } } class Child extends Parent { Child() { // 编译错误:未显式调用父类构造器 System.out.println("Child constructor"); } } ``` 3. **`super`必须为构造器的第一条语句** `super(...)`或`this(...)`调用必须位于子类构造器的第一行,否则会触发编译错误。 **示例**: ```java class Child extends Parent { Child() { System.out.println("Child constructor"); // 错误:super未在第一行 super(10); } } ``` 4. **所有类的默认父类:`Object`类** 即使类未显式继承其他类,其默认父类为`Object`,因此无参构造器会隐式调用`super()`(即`Object`的无参构造器)[^2]。 **示例**: ```java class MyClass { MyClass() { // 隐式调用 Object() System.out.println("MyClass constructor"); } } ``` --- ### 示例代码对比 **情景1:父类有无参构造器** ```java class Animal { Animal() { System.out.println("Animal constructor"); } } class Dog extends Animal { Dog() { // 隐式调用 Animal() System.out.println("Dog constructor"); } } // 输出:Animal constructor → Dog constructor ``` **情景2:父类仅定义有参构造器** ```java class Animal { Animal(String name) { // 无默认无参构造器 System.out.println("Animal: " + name); } } class Dog extends Animal { Dog() { super("Buddy"); // 必须显式调用 System.out.println("Dog constructor"); } } // 输出:Animal: Buddy → Dog constructor ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值