在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。
PS:super存在的意义?
当父类的方法不能完全满足子类使用,这个时候子类重写父类的方法,并可以在方法中使用关键字super调用父类的方法,这样做即可以保有父类的功能,也可以拥有子类特有的功能。
一、this用法总结
this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
this 的用法在 Java 中大体可以分为3种:
1.在本类中直接引用
可以引用本类的成员属性,也可以引用方法,例如
public class SmartPhone {
String manufacturer;
int price;
public void editSms(){
System.out.println("用"+this.manufacturer+"手机编辑短信!");//用this引用本类的方法
}
public void sendSms(){
this.editSms();//用this引用本类的方法
System.out.println("用"+this.manufacturer+"手机发送短信!");
}
}
2.当方法中形参与成员名字重复的时候,用this作区分。
一般用在构造方法、getter、setter及自定义方法中。
public SmartPhone(String manufacturer) {
this.manufacturer = manufacturer;//用this做区分
}
getter
public String getManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
return this.manufacturer;
}
setter
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
……
3.引用构造函数
二、super用法总结
1.在子类中直接引用
例如:super.xxx;(xxx为变量名或bai对象名)
这种方法意义为获取父类中的名字为xxx的变量或方法引用,使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作
例如父类BasicPhone
public class BasicPhone {
String manufacturer;
int price;
public BasicPhone(){
manufacturer = "HuaWei";
price = 1999;
}
}
子类Smartphone
public class SmartPhone extends BasicPhone {
String manufacturer;
int price;
public SmartPhone() {
System.out.println(super.manufacturer);//访问父类的成员变量
System.out.println(super.price);//访问父类的成员变量
}
}
2.第二种
super.xxx();(xxx为方法名) 直接访问并调用父类中的方法。
public class BasicPhone {
String manufacturer;
int price;
public BasicPhone(){
manufacturer = "HuaWei";
price = 1999;
}
public void editSms(){
System.out.println("用"+this.manufacturer+"手机编辑短信!");
}
}
子类Smartphone
public class SmartPhone extends BasicPhone {
String manufacturer;
int price;
public SmartPhone() {
System.out.println(super.manufacturer);
System.out.println(super.price);
}
public void sendSms(){
super.editSms();//用super关键字调用父类的方法
System.out.println("用"+super.manufacturer+"手机发送短信!");
}
}
3.第3种
super();
调用父类的初始化方法,而且super()必须是子类构造方法中的第一个执行语句。如果不写的话,系统会默认在子类构造器上的第一行加上隐式的super()。
public class BasicPhone {
String manufacturer;
int price;
public BasicPhone(){
manufacturer = "HuaWei";
price = 1999;
System.out.println("父类的构造器!");
}
public void editSms(){
System.out.println("用"+this.manufacturer+"手机编辑短信!");
}
}
子类
public class SmartPhone extends BasicPhone {
String manufacturer;
int price;
public SmartPhone() {
super();
}
public void sendSms(){
super.editSms();//用super关键字调用父类的方法
System.out.println("用"+super.manufacturer+"手机发送短信!");
}
}
三、总结
- 如果子类中出现非私有的同名变量,要引用时:
(1) 访问父类中的同名变量,用super
(2) 访问子类本类中的变量,用this - 如果子类重写方法时,要引用父类中的已经定义好的功能时,用super.方法
- 如果子类中的构造函数需要指定父类中其他构造函数进行初始化,使用super(参数)的形式
- 如果子类中的构造函数中,需要引用父类中已经定义好的方法,使用super(参数)
- super调用父类的构造方法时,必须出现在构造方法的第一行;
- super只能出现在子类的方法或构造方法中。