首先還是來看一下例子:
package thisExample;
public class Student {
private String name;
private Long id;
public Student () {
}
public Student (Long id) {
this();
this.id = id;
}
public Student (Long id, String name) {
this(id);
this.name = name;
}
public void print () {
System.out.println("A method of super class");
}
}
package thisExample;
public class MiddleStudent extends Student {
private String book;
public MiddleStudent () {
}
public MiddleStudent (Long id, String name) {
super(id, name);
}
public MiddleStudent (Long id, String name, String book) {
this(id, name);
this.book = book;
}
public void print () {
System.out.println("Override the super class method!");
}
public void show () {
this.print(); //這裏爲了區分比較,沒有將this取消掉
super.print();
System.out.println("A method of sub class");
}
}
package thisExample;
public class StudentTest {
public static void main(String[] args) {
MiddleStudent ms = new MiddleStudent();
ms.show();
}
}
// 輸出結果:Override the super class method!
// A method of super class
// A method of sub class
1.首先看一下超類Student類中用到的this,有兩種用法,一種是this()
或者this(para...)
;另外一種是this.para
。
第一種情況只能用在構造器中,也就是一個構造器可以調用另一種構造器,但是構造器不能調用自己本身,也就是不能在構造器中形成遞歸;
第二種情況是調用當前類的成員變量和方法。在類中構造器或非構造器方法中都可以使用。其實個人覺得第二中情況一般都是使用this調用當前類的變量,來區分與變量同名的方法參數,當調用方法的時候,this可以直接省略掉。。。
2.接着看一下Student的子類MiddleStudent,是怎樣調用this和super的。
this(para...)
的用法還是不變的,這裏主要比較一下this(para...)
和super(para...)
。
看上面兩個圖就很明顯,super(para...)
調用的是父類的構造器,而this(para...)
調用的是當前對象的構造器。
我們都知道不管是super(para...)
還是this(para...)
都只能放在構造器的第一行,所以他倆不能混用,反正就是一個構造器只能調用他倆之中的一個。
super可以調用父類所有非私有的成員變量和方法,這時就不能像this調用方法那麼任性可以取消的,如果想調用父類的方法,必須加上super。
寫到這裏大家應該都清楚這兩個用法和區別了,以後遇到其他的再補充。