this、super详解
当我们在外部程序调用一个类的方法,如果这个类的方法与其父类的方法重载,我们需要用this、super进行区分
this在Java中是一个复杂的关键字,this的使用形式体现了其灵活性,可以实现三种结构形式的描述:
-
当前类中的属性:this.属性; super.属性
-
当前类中的方法(构造方法、普通方法):
-
普通方法:this.方法名(); super.方法名();
-
构造方法:this(); super(); —————————————因为构造方法的方法名与类名一致所以直接省去;
- 描述当前对象;
第一种this.属性; super.属性;
在普通方法中:当形参与成员名字相同时,用this.属性; super.属性;加以区分
我们先来看第一种结构形式的案例:
public class Person{
String name="工地佬";
}
public class Students{
private name="工地牛马";
public void test(String name){
System.out.println(name);//此时这个name表示的是当前参数的name;
System.out.println(this.name);//this.name表示当前类的属性,this代表的是Students实例化后的对象
System.out.printlb(super.name);//super.name表示来自的父类的属性;
}
}
public class Application{
public static void main(String[] args){
Students stu=new Students;//Students类实例化时,父类的构造器也会被调用
stu.test("超级牛马");
}
}
第二种this、super结构形式:
this.方法名();——调用本类的方法
super.方法名();——调用父类的方法
//输出结果
超级牛马
工地牛马
工地佬
public class Person{
String name="工地佬";
public void print(){
System.out.println("父类的方法输出了")
}
}
public class Students extends Person{
private name="工地牛马";
public void print(){
System.out.println("子类的方法输出了")
}
public void test1(){
print();//调用本类的print方法
this.ptint();//调用本类的print方法
super.print();//调用从父类继承过来的的print方法
//有人可能疑问,为什么可以直接调用上面的print方法;
//首先两个都是非静态方法,其次Students是Person的子类,Person的方法会被继承,最后非静态的方法可以相互调用!
}
}
public class Application{
public static void main(String[] args){
Students stu=new Students();
stu.print();
}
}
//输出结果
子类的方法输出了
子类的方法输出了
父类的方法输出了
在构造方法中this();是调用自身的构造方法
public class Students{
String name;
int age;
public Students(){
this.name="工地佬";
}
public Students(int age){
this();//此时则是在调用自身的构造器
this.age=age;
}
}
构造方法中的super(); 调用父类的构造器
public class Person{
public Person{
}
}
//Students是Person的子类
public class Students extends Person{
//当父类是无参构造器时,子类可定义有参或无参构造方法
public Students{
//此处隐藏一个父类构造器:super();
}
public Students(String name){
//此处隐藏一个父类构造器:super();
}
}
public class Person{
public Person(String name){
}
}
//Students是Person的子类
public class Students extends Person{
//当父类是有参构造器时,子类构造器中那个默认的父类构造器一定要显示的定义为有参构造;
//因为子类构造器中含有隐藏的、默认的父类无参构造器;
//如果我们不显示的定义父类有参构造器;当子类实例化时,默认的无参父类构造器无法运行,因为父类是有参构造器,构造器不一致,无法构造
//所以我们在定义一个有参构造器的时候,一定要将无参构造器显示的定义出来
public Students{
//此处隐藏一个无参父类构造器:super();如果不加以修改,无参和有参发生冲突,父类构造器无法调用
super(String name);//也就是说子类中调用的父类构造器要与父类中的构造器相符
}
public Students(String name){
//此处隐藏一个无参父类构造器:super();如果不加以修改,无参和有参发生冲突,父类构造器无法调用
super(String name);
}
}
总结:
-
super(参数);是在调用父类的构造器;this(参数);是在调用本类的构造器
-
super的结构形式只能出现在子类或者构造器中;
-
super调用父类方法时在构造器中的必须在代码的第一行;
-
super和this调用构造器时不能同时出现;因为this();会调用本类其他构造器,必然含有super();
-
this代表的是调用者本身这个对象,是指向对象的一个指针;
-
super可以理解为是指向自己父类对象的一个指针;