super 和 this 的对比
①
this
this
是一个引用,保存内存地址指向自己。
this
出现在实例方法中,谁调用这个实例方法,
this
就代表谁,
this
代表当前正
在执行这个动作的对象。
this
不能出现在静态方法中。
this
大部分情况下可以省略,在方法中区分实例变量和局部变量的时候不能省
略。
“
this(
实际参数列表
)
”出现在构造方法第一行,通过当前的构造方法去调用
本类当中其它的构造方法。
②
super
严格来说,
super
其实并不是一个引用,它只是一个关键字,
super
代表了当前
对象中从父类继承过来的那部分特征。
this
指向一个独立的对象,
super
并不
是指向某个“独立”的对象,假设张大明是父亲,张小明是儿子,有这样一句
话:大家都说张小明的眼睛、鼻子和父亲的很像。那么也就是说儿子继承了父
亲的眼睛和鼻子特征,那么眼睛和鼻子肯定最终还是长在儿子的身上。假设
this
指向张小明,那么
super
就代表张小明身上的眼睛和鼻子。换句话说
super
其
实是
this
的一部分。如下图所示:张大明和张小明其实是两个独立的对象,两
个对象内存方面没有联系,
super
只是代表张小明对象身上的眼睛和鼻子,因
为这个是从父类中继承过来的,在内存方面使用了
super
关键字进行了标记,
对于下图来说“
this.
眼睛”和“
super.
眼睛”都是访问的同一块内存空间。
super
和
this
都可以使用在实例方法当中。
super
不能使用在静态方法当中,因为
super
代表了当前对象上的父类型特征,
静态方法中没有
this
,肯定也是不能使用
super
的。
super
也有这种用法:“
super(
实际参数列表
);
”,这种用法是通过当前的构造
方法调用父类的构造方法。
super用于构造方法中
“
super(
实际参数列表
);
”语法表示调用父类的构造方法,代码复用性增强了,另外一方面也是模拟现实世界当中的“要想有儿子,必须先有父亲”的道理。不过
这里的“
super(
实际参数列表
)
”在调用父类构造方法的时候,从本质上来说并不是创建一个“独
立的父类对象”,而是为了完成当前对象的父类型特征的初始化操作。
当一个构造方法第一行没有显示的调用“
super(
实际参数
列表
)
”的话,系统默认调用父类的无参数构造方法“
super()
”。当然前提是“
this(
实际参数列
表
)
”也没有显示的去调用(因为
super()
和
this()
都只能出现在构造方法第一行,所以不能并存)。
public class People {
String name;
boolean sex;
public People(String name,boolean sex){
this.name = name;
this.sex = sex;
}
}
public class Worker extends People {
//子类特有的工资属性
double salary;
public Worker(String name,boolean sex,double salary){
super(name,sex);
this.salary = salary;
}
}
public class WorkerTest {
public static void main(String[] args) {
Worker w = new Worker("jack",true,10000.0);
System.out.println("姓名:" + w.name);
System.out.println("性别:" + w.sex);
System.out.println("工资:" + w.salary);
}
}
super用于实例方法中
父类和子类中有同名实例变量或者有同名的实例方法,想在子类中访问父类中的实例变量或实例方法,则
super
是不能省略的,其它情况都可以省略。
//纸质书
public class PaperBook extends Book {
String name; //在子类中也定义了一个 name 属性
//构造方法
public PaperBook(){
super();
}
public PaperBook(String name){
super();
this.name = name;//这里的 this.name 代表子类的 name
}
//打印书名
public void printName(){
System.out.println("this.name->书名 : " + this.name);
System.out.println("super.name->书名 : " + super.name);
}
}
public class BookTest {
public static void main(String[] args) {
PaperBook book1 = new PaperBook("零基础学 Java 卷 I");
book1.printName();
}
}