java中有兩個關鍵字super和this,它們都是用來訪問類成員的。
super可以訪問父類中的成員變量和方法,用來避免子類中的同名變量或方法與父類中的重名沖突。在方法中使用super調用父類的方法,子類可以通過傳參來對父類方法的行為進行擴展。
public class Animal { int age; public Animal(int age) { this.age = age; } public void eat() { System.out.println("Animal is eating..."); } } public class Dog extends Animal { String name; public Dog(String name, int age) { super(age); this.name = name; } public void eat() { super.eat(); System.out.println("Dog is eating..."); } public static void main(String[] args) { Dog dog = new Dog("Tom", 3); dog.eat(); } }
在上面的代碼中,子類Dog通過super(age)調用了父類Animal的構造器,并且重寫了父類的eat()方法,在eat()方法中使用super.eat()調用了父類的eat()方法。執行上面代碼的輸出結果為:
Animal is eating... Dog is eating...
this用來訪問當前對象的成員變量和方法,用來避免類中的同名變量或方法與對象實例中的重名沖突。在多次調用同一個類的方法時,使用this關鍵字可以顯式地表明該方法是從當前對象中調用的。
public class Person { String name; public Person(String name) { this.name = name; } public void speak() { System.out.println(this.name + " is speaking..."); } public void run() { this.speak(); System.out.println(this.name + " is running..."); } public static void main(String[] args) { Person person = new Person("John"); person.run(); } }
在上面的代碼中,類Person中有成員變量name和方法speak()和run(),在speak()方法中使用了this關鍵字訪問了當前對象的name成員變量,在run()方法中使用了this關鍵字顯式地調用了speak()方法。執行上面代碼的輸出結果為:
John is speaking... John is running...