子父类中的构造函数
子父类构造函数
*在对子类的构造函数进行初始化时,对父类的构造函数也会运行
那是因为子类构造函数第一行有一条隐式的语句super();
super():会访问父类中的空参数的构造函数,且子类中的所有构造函数默认第一行都是super();
public class ExtendsDemo { public static void main(String[] args) { Zi zi=new Zi(); } } class Fu{ Fu(){ System.out.println("show fu"); } } class Zi extends Fu{ Zi(){ //super() 隐式语句 System.out.println("show zi"); } }
输出结果:
show fu
show zi
先运行super(),运行父类的空参数构造函数,再运行子类自己的方法。
默认时,父类的有参构造函数不能直接被子类继承,因为super()只能直继承父类中无参的构造函数,
继承有参构造函数,则super就不能隐式了,要用super直接调用用父类的有参构造函数
调用父类的一般方法用super.父类方法名,调用父类构造用super(父类方法名);
同时,super语句和this语句一样,放在子类构造函数的第一行;
子类一实例化,就会去找父类。
如下:
public class ExtendsDemo { public static void main(String[] args) { Zi z = new Zi(); Zi z1 = new Zi(3); } } class Fu { Fu(int x) { System.out.println("show fu" + x); } } class Zi extends Fu { Zi() { // super() 隐式语句 super(3); // 调用父类对应的构造函数 System.out.println("show zi"); } Zi(int x) { // super() super(5); // 调用父类对应的构造函数 System.out.println("zi..." + x); } }
输出:
show fu3
show zi
show fu5
zi...3
public class ExtendsDemo1 { public static void main(String[] args) { Student student = new Student("nike"); student.show(); } } class Person { String name; Person(String name) { this.name = name; } void show() { System.out.println(name +"......"+ "go"); } } class Student extends Person { Student(String name) { super(name); //调用父类的变量 } void show() { super.show(); //调用父类的方法 } }
输出:
nike......go
子类的构造函数第一行,也可以用this设备名手动指定访问本类中的构造函数。子类中会有一个构造函数,会访问父类中的构造函数。
public class ExtendsDemo { public static void main(String[] args) { Zi z = new Zi(7); } } class Fu { Fu(int x) { // 父类初始化后,m初始值变成了11 System.out.println(x); } } class Zi extends Fu { Zi() { //super(); //隐式语句 super(5); // 调用父类对应的构造函数 System.out.println("show zi"); } Zi(int x) { this();//调用Zi(),同时不再有super(),因为super()只能在第一行 System.out.println("zi..." + x); } }
输入出:
5
show zi
zi...7