有时我们在写子类的时候会出现如下所示的报错:
Implicit super constructor AbstractClass() is undefined for default constructor. Must define an explicit constructor
在子类继承父类的时候,实例化时java编译器是会首先调用父类的构造函数,然后调用子类的构造函数的,这也就意味着,如果
父类没有默认构造函数的话,在子类的构造函数中第一行必须显式调用父类的构造函数,否则的会是报编译错误的。
java继承中对构造函数是不继承的,只是调用(隐式或显式)。
以下是例子:
public class FatherClass {
public FatherClass() {
System.out.println(100);
}
public FatherClass(int age) {
System.out.println(age);
}
}
public class SonClass extends FatherClass{
public SonClass() {
}
public SonClass(int c) {
System.out.println(1234);
}
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
编译后执行结果如下是什么呢?
分析:SonClass s = new SonClass(66);执行这句时,调用
public SonClass(int c) {
System.out.println(1234);//系统会自动先调用父类的无参构造函数(super())
}
在这个构造函数中,等价于
public SonClass(int c) {
super();//必须是第1行,否则不能编译
System.out.println(1234);
}
所以结果是 100
1234
在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。
3.如果子类构造函数是这样写的
public SonClass(int c) {
super(22);//必须是第1行,否则不能编译
//显式调用了super后,系统就不再调用无参的super()了;
System.out.println(1234);
}
执行结果是 22
1234
总结1:构造函数不能继承,只是调用而已。
如果父类没有无参构造函数
创建子类时,不能编译,除非在构造函数代码体中第一行,必须是第一行显式调用父类有参构造函数
如下:
SonClass (){
super(777);//显示调用父类有参构造函数
System.out.println(66);
}
如果不显示调用父类有参构造函数,系统会默认调用父类无参构造函数super();
但是父类中没有无参构造函数,那它不是不能调用了。所以编译就无法通过了。
总结2:创建有参构造函数后,系统就不再有默认无参构造函数。
如果没有任何构造函数,系统会默认有一个无参构造函数。
相关推荐
### Java中的继承(子类调用父类构造方法) #### 一、继承的基本概念 Java是一种支持面向对象编程的语言,其中“继承”是一项核心特性。继承允许创建一个新的类(称为子类或派生类),该类继承了现有类(称为父类...
程序中描述了子类对象构建调用父类的构造方法,以及类变量和实例变量创建的不同过程
在编程世界中,继承是...7. **构造函数调用**:子类可以使用`super`调用父类构造器。 以上就是关于“子类调用抽象父类”这一主题的主要内容,理解并熟练运用这些概念,可以帮助我们更好地设计和实现面向对象的程序。
在Java中,如果子类没有显式调用父类的构造器,编译器会自动添加一个默认的`super()`调用,这将调用父类的无参构造器。如果父类有带参数的构造器,子类必须显式调用。 2. **初始化子类**: - 父类的构造器执行完毕...
2. **构造器与初始化**:子类对象在创建时会先调用父类的构造器,确保父类的状态得到正确初始化,然后执行子类自己的构造逻辑。 3. **变量隐藏**:如果子类和父类有同名的实例变量,子类变量会“隐藏”父类变量。...
// 显式调用父类构造器 } Child(String s) { super(s); // 调用父类的带参数构造器 } } ``` 5. **构造器的重载**: - 类可以有多个构造器,它们通过不同的参数列表区分,这就是构造器的重载。 - 重载构造...
这个过程可以通过在子类构造器中使用`super(参数列表)`来显式调用父类构造器。 总结,`super`关键字在Java面向对象编程中起到了关键的作用,它帮助我们区分和调用父类的成员,确保在子类中能够正确地访问和重用父类...
当一个子类实例化时,其实例化过程涉及到多个步骤,这些步骤不仅包括自身的构造器执行,还包括对父类构造器的调用。下面将详细阐述Java中子类实例化的过程及其相关知识点。 首先,子类实例化时会先调用父类的构造器...
### 构造器的解释与应用 #### 一、什么是构造器? 在面向对象编程语言中,构造器(Constructor)是一种特殊的方法...同时,了解子类构造器如何调用父类构造器也是十分重要的,这有助于更好地组织和管理类之间的关系。
3. **父类的默认构造器**:然后,调用父类的默认构造器(如果没有显式指定构造器的话)。这确保了父类的状态被正确地初始化。 4. **父类的非静态初始化块(如有)**:如果父类还有其他非静态初始化块,它们在此时...
5. **调用父类的方法**:在子类中,我们可以使用`super`关键字调用父类的方法。这在需要覆盖父类方法,但又希望在子类中保留原父类行为时非常有用。例如,子类可能有一个重写的方法,但在开始时调用父类的实现: ``...
调用父类构造器 当子类继承父类时,子类构造器的第一条语句通常是调用父类的构造器。这可以通过`super`关键字来实现,确保父类的状态在子类实例化之前得到初始化。例如: ```java public class Parent { public ...
如果子类没有显式调用父类构造器,Java会默认调用无参构造器。如果父类没有无参构造器,则子类必须显式调用一个合适的父类构造器。 **子类的内存分布** 在内存中,子类对象包含父类的所有非静态成员,以及子类自己...
在这个PPT学习教案中,主要讨论了几个核心概念,包括如何在子类中调用父类构造器、super关键字的使用、方法和构造器的重载,以及对象的构造和初始化过程。 首先,当我们创建一个子类时,子类继承自父类,它可能会有...
- 访问父类构造器:在子类的构造器中,可以使用`super()`调用来初始化父类的部分,确保父类的实例化在子类实例化之前完成。 2. **调用父类属性** - 子类可以使用`super.`前缀来直接访问父类的非私有属性,即使这...
如果父类没有无参构造器,则必须在子类构造器中显式调用父类构造器,通常使用`super(参数列表);`。 - 如果子类中定义了与父类同名的成员变量,父类的成员变量将被隐藏。同样地,如果子类定义了与父类同名且具有相同...
- **使用`super`调用父类构造器**:在一个构造器内部,可以使用`super(参数列表)`来调用父类的构造器。同样地,这种调用也必须是构造器的第一条语句。 例如,在下面的示例代码中: ```java public class Platypus {...
1. **调用父类构造器**:在子类构造器中,可以使用`super()`来调用父类的无参构造器,或者使用`super(args)`来调用父类的带参构造器,确保父类的初始化在子类初始化之前完成。 2. **访问父类字段**:如果子类和父类...
此外,`this`也可以用来调用当前类的构造器,即`this(参数列表)`,这通常用于在子类构造器中调用父类构造器,以确保初始化过程的顺序。 其次,`super`关键字则用于引用父类的成员。当你在子类中需要访问父类的非...
1. **调用父类构造器**: 当子类创建一个新的实例时,如果需要调用父类的构造器,必须在子类构造函数的第一行使用`super()`,如下面的`Base`和`Checket`类所示。这是因为子类构造器首先执行父类的构造器,确保父类...