Java中关于构造函数继承的相关问题

 
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); 



//此处调用了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 st1=new Student(); 

System.out.println("---------------------------"); 



System.out.println("st2:"); 

Student st2=new Student("zhangsan",21,"北大"); 

System.out.println("---------------------------"); 



System.out.println("st3:"); 

Student st3=new Student("lisi",24,"北大","研究生"); 



} 

} 

 



 

 

 

输出如下:

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)

 

4、即使子类中的构造函数有参数,如果他没有显示调用父类中的构造函数,他仍然会默认调用父类中的默认构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值