-
在Java中,this 和 super 是常用来指代类自身对象和该类的父类对象的关键字。
-
Java系统默认每个类都具有null、this 和 super 三个对象引用量,所以在任意类中不加说明直接使用这三个对象。
-
null 代表空对象,一般用null代表为创建的对象。
-
this 指当前对象的引用。
-
super 指对父类对象的引用。
-super关键字
super表示当前对象的直接父类对象(数据成员或成员方法),是当前对象的直接父类的引用。如果子类定义的对象(数据成员或成员方法)和父类对象(数据成员或成员方法)相同,此时如果想调用父类对象的方法,可以通过super来实现对父类对象的访问。
使用super有下面三种情况:
1.用来访问父类被隐藏的数据成员;
2.调用父类中被子类覆盖的方法;
3.调用父类的构造函数。
使用方法:
super.父类中方法名(成员名)
1.super用于方法
用于构造方法(****)表示调用父类构造方法:super(参数列表)
当子类调用父类无参构造时,super( ) 可写可不写,表示调用父类无参构造。
当子类调用父类有参构造时,super(参数列表) 必须要写,要告诉编译器当前调用的是哪个有参构造。
注意:
a.子类构造方法中调用父类构造必须是第一行语句。
b.this与super不能同时调用。
用于普通方法: super.方法名(参数)
> 用于在子类中明确调用父类被覆写的方法。
2.super用于属性(了解)
super.属性名
> 表示调用父类中被覆写的属性(权限不是private)
class Person{
public int c;
private String name;
private int age;
protected void setName(String name){
this.name = name;
}
protected void setAge(int age){
this.age = age;
}
protected void print(){
System.out.println("Name="+name+",age="+age);
}
}
public class SuperExample extends Person{
public void print(){
System.out.println("test: ");
super.print(); //直接调用父类的成员方法
}
public static void main(String[] args){
SuperExample ds = new SuperExample();
ds.setName("steven");
ds.setAge(22);
ds.print(); //调用覆盖后的方法
}
}
//test:
Name=steven,age=22
– this关键字
一般在方法中如果某个形参名与当前对象的某个数据成员的名字相同,为了不混淆两者,通常情况下需要明确使用this关键字来指明类的数据成员,使用方法是“this.成员名”,而不带this 那个便是形参。另外,还可以使用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,也可以直接用方法名来访问那个方法,编译器会知道要调用的是哪个方法。
public class ThisExample{
private String name;
private int age;
ThisExample(String name,int age){
this.setName(name);//用this引用当前对象
this.setAge(age);
this.print();
}
public void setName(String name){
this.name = name;//this指明赋值号左边为引用当前对象的成员变量,以免混淆
}
public void setAge(int age){
this.age = age;
}
public void print(){
System.out.println("Name="+name+",age="+age);//在此行中并不需要this,因为不会导致混淆
}
public static void main(String[] args){
ThisExample dt = new ThisExample("steven",20);
}
}
//Name=steven,age=20
1. this 表示调用本类属性
只要在类中访问类的属性,一定要加上 this 关键字
2. this 表示调用本类方法
a.调用普通方法 : this . 类中方法名(成员名)
当有类的继承关系时,表示本类方法一定要加上 this 关键字
b(重点).调用构造方法: this(参数)
class Person{
private String name;
private int age = 10;
//无参构造
public Person(){
System.out.println("**************");
}
//一个参数的有参构造
public Person(String name){
this();//调用本类的无参构造
this.name = name;
}
//两个参数的有参构造
public Person(String name,int age){
this(name);//调用本类一个参数的有参构造
this.age = age;
}
public void setName(String n){
name = n;
}
}
3. this 表示当前对象
(1). this 调用构造方法必须放在构造方法首行
(2) . this 调用构造方法不允许成环
只要对象调用了本类中的方法,这个this就表示当前执行的对象
class Person{
public void print(){
System.out.println("[person 类的print的方法]"+this); // //this 表示当前执行的对象
}
}
public class Hello{
public static void main(String[] args){
Person per1 = new Person();
System.out.println("[main方法]"+per1);
per1.print();
System.out.println("===============");
Person per2 = new Person();
System.out.println("[main方法]"+per2);
per2.print();
}
}
[main方法]Person@15db9742
[person 类的print的方法]Person@15db9742
===============
[main方法]Person@6d06d69c
[person 类的print的方法]Person@6d06d69c