一、super關鍵字的作用
1、子類在構造方法中顯示調用父類構造方法
super可以在子類的構造方法中顯示調用父類的構造方法;並且這行代碼必須出現在子類構造方法的第一行。原因:因為父類構造方法沒有執行之前父類的屬性和方法還沒有被創建,則子類不能繼承父類的屬性和方法,因此子類的構造方法不能被執行。
/** * 子類:構造方法的第一行要保證顯示或者隱式的調用構造方法 * @author Administrator * */ public class Teacher extends Person { //繼承自父類的空構造函數 public Teacher() { } public Teacher(String name, int age, String gender) {
//1. 出現在子類構造函數的第一行,用於調用父類的構造方法 super(name, age, gender); } private String course; public void teach() { System.out.println("教..."); } }
2.可以在子類中充當臨時父類對象
可以在子類內部代表父類對象,從而在子類中訪問父類的屬性和方法。
class Person01 { private String name; private int age; public void say() { System.out.println("人說...."); return null; } public void eat() { System.out.println("人吃...."); } } class Teacher01 extends Person01 { @Override public C say() { System.out.println("老師在一本正經的說..."); return null; } //注解的作用:防止開發者誤寫,起到提示作用 @Override public void eat() { System.out.println("洗個手"); //2. super作用:super類似於父類的虛擬對象 super.eat(); System.out.println("抽根煙..."); } }
二、this關鍵字的作用
1、代表當前對象
在類的內部永遠代表正在執行此代碼的對象;在成員方法和構造方法內部,都可以通過this來明確訪問類中的成員屬性和成員方法。
public class Person03 { String name; int age; //構造代碼塊:直接在類中編寫一對大括號,構造代碼塊可以訪問到之前定義的屬性 { System.out.println("構造代碼塊!" + name); } { say(); System.out.println("構造代碼塊2!" + this); } public Person03(){ System.out.println("構造方法!"); } public Person03(String name, int age) {
//1. 指向無參構造方法 this();
//2. 代表正在執行此代碼的對象 this.name = name; this.age = age; } void say() { System.out.println("成員方法說動作"); } { say(); System.out.println("構造代碼塊3!"); } public static void main(String[] args) { Person03 p = new Person03(); p.say(); //匿名創建對象:創建對象只會用一次並且立即使用,而不用賦值給一個引用,即為創建了一個匿名對象 new Person03().say(); } }
2、指向某個構造方法
在構造方法內部通過this(參數列表),可以調用其他構造方法。
注意:使用這種用法時,this()必須出現在當前構方法的第一行。
三、super和this的共同點和區別
共同點:super和this都可以代表一個臨時對象執行構造函數,並且都要放在構造函數的第一行;
不同點:super一般用在子類中,用於代表父類的對象;this用於當前類中,用於代表正在執行該代碼的對象。