您好,登錄后才能下訂單哦!
這篇文章給大家介紹this與super怎么在Java中使用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
一、this
概念:this代表著當前對象的引用,也是當前函數所屬對象的引用。直白的說,哪個對象調用了當前函數,this就代表哪個對象。
常見的用法(理論不理解就先參考下面案例)
最常見的情況是是對象的一個屬性或被構造器的參數屏蔽時,如果需要調用屏蔽的屬性,this就代表哪個對象
this只能在方法內使用,表示正在調用方法的那個對象,但是,如果在方法內調用同一個類的另一個方法,就不必使用this,直接調用即可,this關鍵字是能省則省
this和static的關系:
static方法是類方法,依附于類而不依賴與任何對象,static屬性是指該屬性是類中所有對象所共享的,static方法是類方法,先于任何實例(對象)存在,static在類加載時就已經存在了,但對象是在創建時才生成;方法中使用this關鍵字它的值是當前對象的引用,只能用它調用屬于當前對象的屬性和方法和。但是,this可以調用static類型的屬性,舉個例子:一個父親是不可能向他還未出生的孩子借錢的,但孩子出生后完全可以找他父親去借錢;
對于一個類中的this,不一定單指這個的對象,也可能是這個類的子類的對象(抽象類里面的this只能是實際調用中它的派生類的實例化對象);
總之:如果new 父類對象的話,父類方法的this指向的是父類,如果new 子類,那么父類方法的this指向的是子類
this關鍵字也可以用于在構造函數中調用其他構造函數。但是,只能定義在構造函數的第一行,因為初始化動作要先執行
this使用案例
class Student extends Person{ public Student(String name, int age, String nation) { super(name); } } public class Person{ private String name; private int age; private static String nation = "chinese"; public Person(String name) { this.name = name; } public Person(String name, int age) { //初始化方法必須放到第一行 this(name); this.age = age; } //局部變量name和age屏蔽了name和age屬性,用this進行標識 public Person(String name, int age,String nation) { this.name = name; this.age = age; //this可以調用到靜態屬性 this.nation = nation; } public void test(){ System.out.println("測試"); } public static void test2(){ //靜態方法內不能出現this或super System.out.println("測試"); } public void print(){ //調用類內部的方法(toString已重寫)加不加this都行 this.toString(); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public static void main(String[] args) { //這個this代表的student對象 Student student = new Student("wzh",20,"chinese2"); System.out.println(student.toString()); //這個this代表的是person對象 Person person = new Person("wzh3",20,"chinese3"); System.out.println(student.toString()); //擴展,全局變量nation的值最后是chinese3 System.out.println(Person.nation); } }
結果:
概念:
super可以理解為“父類的”,super可以在子類中調用父類的屬性,方法,構造器,super關鍵字和this一樣能省就省;
注意點:
1、this和super很像,this指向的是當前對象的調用,super指向的是當前調用對象的父類
2、類加載完畢,創建對象,父類的構造方法會被調用
父類如果重寫了無參構造器或者父類中沒有有參構造器,那么子類的構造方法第一行就是super(),可以省略
class Student extends Person{ //這是默認的構造器內容,寫出來是為了幫大家理解 public Student(){ super(); } } public class Person{ private String name; private int age; }
如果父類中定義了有參構造器但沒有顯示寫出無參構造器,那么必須通過super調用父類的有參構造函數,如果父類中定義了多個有參構造區,那么用super調用其中一個有參構造器即可
class Student extends Person{ public Student(String name, int age) { //任選一個父類有參構造 //super(name, age); super(name); } } public class Person{ private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this.name = name; } }
3、子類相應構造創建了一個子類對象,該子類對象還包含了一個父類對象。該父類對象在子類對象內部(正如子類的構造器無論如何都要通過super調用父類構造器一樣,子類的對象被成功構造,那么它的內部就會包含父類的對象),證明如下
子類重寫父類的方法后可以通過super調用到父類的方法
class Student extends Person { private String name = "wzh3"; @Override public String getName() { return "子類" + name; } public String getParentName(){ //調用父類的方法 return super.getName(); } public static void main(String[] args) { Student student = new Student(); System.out.println(student.getName()); System.out.println(student.getParentName()); } } public class Person{ //protected意味著子類和同一包中可以訪問 protected String name = "wzh"; protected int age = 20; public String getName() { return "父類" +name; } }
輸出結果
子類獲取到父類的變量
class Student extends Person{ public void parentDisplay(){ System.out.println(super.age + super.name); } public static void main(String[] args) { new Student().parentDisplay(); //輸出結果:20wzh } } public class Person{ //protected意味著子類和同一包中可以訪問 protected String name = "wzh"; protected int age = 20; }
調用父類的構造器
不再舉例
4、this super只能在有對象的前提下使用,不能在靜態上下文使用
5、如果一個類沒有基礎任何父類,super還有用嗎?肯定有用,可以調用Object中的方法
public class Person{ private String name; private int age; public void display(){ //通過this或super調用到了Object的toString(); System.out.println(super.toString()); } public static void main(String[] args) { new Person().display(); //輸出為Person@452b3a41 } }
關于this與super怎么在Java中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。