Java中 super和this用法总结
在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只能出现在子类的方法或构造方法中。