class Person
{
private String name="";
private int age=0;
public Person()
{
System.out.println("person无参数构造函数");
}
public Person(String name,int age)
{
this.name=name;
this.age=age;
System.out.println("person 2 参数的构造函数");
}
}
class Student extends Person
{
private String school;
private String grade;
public Student()
{
System.out.println("student 无参数的构造函数");
}
public Student(String name ,int age,String school)
{
System.out.println("student 3 参数的构造函数");
}
public Student(String name ,int age,String school,String grade)
{
super(name,age);
this.school=school;
this.grade=grade;
System.out.println("student 4 参数的构造函数,super().");
}
}
class Test
{
public static void main(String [] args)
{
System.out.println("st1:");
Student st2=new Student();
System.out.println("---------------------------");
System.out.println("st2:");
Student st=new Student("zhangshan",76,"武大");
System.out.println("---------------------------");
System.out.println("st3:");
Student st3=new Student("lisi",24,"武大","研究生");
}
}
/*
=======================================
输出如下:
E:\JavaWork>java Test
st1:
person无参数构造函数
student 无参数的构造函数
---------------------------
st2:
person无参数构造函数
student 3 参数的构造函数
---------------------------
st3:
person 2 参数的构造函数
student 4 参数的构造函数,super().
**************************************
说明了创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。
=============================================
我们假设A是B的父类,B是A的子类。
1、如果程序员没有给类A没有提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不在提供默认的无参数构造函数。
2、子类B实例化时会自动调用父类A的默认构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供了其他类型的构造函数,编译器同样会报错,因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数。
3、或者在B的构造函数中显示的调用父类A的有参构造函数。super(parameter)
分享到:
相关推荐
声明一个带参数的构造函数,该构造函数继承基类base中的带参数的构造函数
- 如果父类没有无参数构造函数,且子类构造函数没有显式调用父类的有参构造函数,编译器会报错。 - 使用`super()`关键字可以在子类构造函数中显式调用父类的构造函数,传入相应的参数。 遵循这些规则,我们可以更好...
基类的构造函数是不能继承的,在声明派生类时,派生类并没有把基类的构造函数继承过来,因此,对继承过来的基类成员初始化的工作也要由派生类的构造函数承担。 在设计派生类的构造函数时,不仅要考虑派生类所增加的...
类的继承以及构造函数,包括私有继承、公有继承的区别,详细的构造函数的使用
3. **构造函数重载与父类构造函数的选择**:如果父类中有多个构造函数,子类可以通过`super()`后跟相应的参数列表来选择调用哪一个父类构造函数。 例如: ```java class Base { public Base() { System.out....
Java继承时构造函数的调用机制是:子类的构造函数需要调用父类的构造函数,父类的无参数构造函数是默认的,如果父类没有提供无参数构造函数,而提供了其他类型的构造函数,那么编译器将报错。因此,我们最好给父类...
在构造函数中处理参数传递,有助于我们更有效地设置对象的属性和状态。 1. **值传递**:在构造函数中使用值传递时,函数接收的是参数值的副本。这意味着即使在构造函数内部改变了这个副本,也不会影响到调用构造...
如果没有在派生类的初始化列表中指定,编译器会默认调用基类的无参数构造函数(如果存在的话)。例如: ```cpp class Derived : public Base { public: Derived() { // 默认调用Base的无参构造函数 // ... } ...
- **继承中的构造函数**:在子类继承父类时,如果子类定义了自己的构造函数,则必须显式地调用父类的构造函数来确保父类中的初始化操作得以执行。这可以通过在子类的构造函数中使用`super()`函数来实现。 ```...
构造函数分为两种类型:默认构造函数和自定义构造函数。默认构造函数是编译器自动提供的,当类中没有定义任何构造函数时,会有一个无参的默认构造函数生成。而自定义构造函数是程序员根据需要定义的,通常带有参数,...
在`MyClass`的构造函数中,`member`的数据成员先被初始化,调用了`MemberClass`的构造函数,传入了42作为参数。 2. 基类构造函数: 当一个类是另一个类的基类时,基类的构造函数会在派生类构造函数之前被调用。这...
在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...
### C#中构造函数和析构函数的深入解析 #### 构造函数与析构函数:C#中的生命期管理 在C#编程语言中,构造函数和析构函数是对象生命周期管理的关键部分,它们分别负责对象的初始化和清理工作。理解这两者的运作...
构造函数可以分为两大类:默认构造函数和有参构造函数。 ##### 1. 默认构造函数 - **定义**:默认构造函数是没有参数的构造函数。如果没有明确地定义任何构造函数,C#编译器会自动生成一个默认构造函数。这个默认...
- 当父类和子类都有多个构造函数时,子类的构造函数默认调用父类的无参数构造函数,即使这个无参数构造函数是程序员显式定义的,而不是编译器自动生成的。 - 如果父类只有一个带参数的构造函数,子类必须通过`...
默认构造函数是由C#编译器自动为类提供的构造函数,当一个类没有定义任何构造函数时,C#编译器会自动生成一个不带任何参数的构造函数。例如,在给定的部分内容中,类`A`最初并未显式定义构造函数: ```csharp ...
综上所述,这个"C#多态性实例,向基类构造函数传递参数"的示例展示了如何在C#中利用多态性、继承和构造函数来创建灵活、可扩展的代码结构。通过理解和应用这些概念,开发者可以编写出更高效、更具维护性的软件系统。
如果类中没有定义构造函数,编译器会提供一个默认的无参数构造函数。 5. **重载**:与普通方法一样,构造函数也可以被重载,即在同一类中可以定义多个具有不同参数列表的构造函数。 接下来,我们谈谈析构函数。析...
构造函数主要分为两种:默认构造函数和参数化构造函数。 - **默认构造函数**:无参数的构造函数,用于执行基本的初始化任务。 - **参数化构造函数**:带有参数的构造函数,用于设置更具体的初始值。 #### 构造函数...