定义
super关键字通过子类访问父类,有三种用法:
通过子类的方法,访问父类的成员变量,成员函数,构造函数。
this 关键字用来访问本类内容,用法也有三种:
在本类的成员方法中,访问本类的成员变量、成员函数、构造函数。
区别
this指向的是当前对象的调用,super指向的是当前调用对象的父类
因为 super 不是一个对象的引用, 不能将 super 赋给另一个对象变量, 它只是一个指示编译器调用超类方法的特殊关键字。
使用方法
第一行默认为构造函数
构造函数间的调用只能放在第一行,只能调用一次
super()和this()不能同时存在构造函数第一行
super
1.子类不写super()构造函数,编译器会自动添无参数super(),子类默认调用父类无参的构造函数。如果子类为实参构造函数,父类必须要有无参构造函数,子类才可以调用父类的构造函数
//父类
class father{
father(){}//父类无参构造函数
}
//子类继承并且调用父类构造函数
class Son extends father{
Son(){super();}
}
class Test {
public static void main(String[] args) {
Son son = new Son();
}
}
2.子类写含参构造函数,子类会调用父类的含参构造函数
3.自定义一个类,没有类的继承,该类中成员函数可以使用super关键字(继承了Object类,Object类是所有类的父类)
//子类
class father {
int a=2;
father(){System.out.println("父类构造函数");}
public void method(){
System.out.println("父类方法");
}
}
class Son extends father {
int a = 1;
Son(){super();} //定义构造函数
public void method_Son(){
System.out.println(super.a); //父类中的a
}
public void method(){ //子类的method覆盖父类的method
super.method(); //访问父类中的method
System.out.println("子类方法");
}
}
class Test{
public static void main(String [] args){
Son son =new Son();
son.method_Son();
son.method();
}
}
this
this()调用也必须是构造函数的第一条语句
super和this不能同时使用在同一个方法中,选择其一
class father {
int a=2;
father(){System.out.println("父类构造函数");}
public void method(){
System.out.println("父类方法");
}
}
class Son extends father {
int a = 1;
String name;
Son(){this.name="gaokaoli";System.out.println(name);} //定义构造函数
Son(String n){name=n; System.out.println(name);}
public void method_Son(){
System.out.println(super.a); //父类中的a
System.out.println(this.a); //子类中的a
}
public void method(){
super.method(); //访问父类中的method
System.out.println("子类方法");
}
}
class Test{
public static void main(String [] args){
Son son =new Son();
Son son1=new Son("lxs");
son.method_Son();
son.method();
}
}
还可以这样使用this
以下为简介版
//在子类中定义
int a = 1;
String name;
Son(){this("lxs");} //定义构造函数
Son(String n){name=n; System.out.println(name);}
//在函数中定义为
Son son =new Son();
与c++的继承比较
1.在 Java 中使用关键字 super 调用超类的方法,而在 C++ 中则采用超类名加上::操作符的形式
2.在 C++ 的构造函数中,使用初始化列表语法调用超类的构造函数,而不调用super
总结
由于Son 类的构造器不能访问 Father 类的私有域,所以必须利用 Father 类的构造器对这部分私有域进行初始化,我们可以通过 super 实现对超类构造器的调用。使用super 调用构造器的语句必须是子类构造器的第一条语句。
如果子类的构造器没有显式地调用超类的构造器,则将自动地调用超类默认(没有参数 )的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中又没有显式地调用超类的其他构造器,则 Java 编译器将报告错误。