在类的继承中,子类的构造方法中默认会有super()语句存在,相当于执行父类的相应构造方法中的语句
如下面代码:
class Extends_Demo {
public static void main(String[] args) {
Cat c = new Cat(); //---------------(1)
System.out.println("-------------------");
Cat c1 = new Cat("花花",4); //----------------(2)
}
}
class Animal {
private String color;
private int foot;
public Animal(){
System.out.println("我是父类无参数构造器");
}
public Animal(String color,int foot){
System.out.println("我是父类有参数构造器");
this.color = color;
this.foot = foot;
}
}
class Cat extends Animal{
public Cat(){
super(); //---------------可以省略
System.out.println("我是子类无参数构造器");
}
public Cat(String color,int foot){
//super(color,foot); //---------------(3)
super(); //---------------可以省略
System.out.println("我是子类有参数构造器");
}
}
输出
这里写图片描述
main方法中
(1)语句执行的是子类的无参数构造方法,内部默认有super(),代表执行父类无参数构造方法,因此输出父类无参数构造方法中的语句和子类无参数构造方法中的语句;
(2)语句执行的是子类有参数构造方法,内部也是默认有super(),代表执行父类无参数构造方法,,输出语句是父类无参数构造方法中的语句和子类有参数构造方法中的语句;
若将(3)语句解除屏蔽,则子类有参构造方法中执行super(color,foot)表示执行父类有参构造方法Animal(color,foot),修改后子类:
class Cat extends Animal{
public Cat(){
super(); //----------------可以省略
System.out.println("我是子类无参数构造器");
}
public Cat(String color,int foot){
super(color,foot); //---------------(3)
//super();
System.out.println("我是子类有参数构造器");
}
}
输出
对比后可以知道,super()代表执行父类无参数构造方法内容,super(color,foot)代表执行父类有参数构造方法。
Java this()和super()的使用注意
使用super和this应该注意这些:
1)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3)super()和this()均需放在构造方法内第一行。
4)尽管可以用this调用一个构造器,但却不能调用两个。
5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
为什么this或者super要放到第一行?
this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。
详细讲解见链接:https://www.jb51.net/article/110674.htm