Java中的关键字this_super
文章目錄
- 要點
- 錯誤的理解
- 正確的理解
- 演示代碼
要點
1.在類的構(gòu)造器中,可以使用 this() 調(diào)用本類的其它構(gòu)造器,調(diào)用的時候根據(jù)構(gòu)造器聲明的參數(shù)列表傳遞參數(shù)值
2.super() 調(diào)用父類的無參構(gòu)造器
3.super.method() 調(diào)用父類的 method() 方法
4.super.name 訪問父類的變量 name
5.使用 this() 和 super() 調(diào)用構(gòu)造器,必須寫在構(gòu)造方法體內(nèi),且必須寫在第一個語句中
6.this() 和 super() 不可以同時存在構(gòu)造方法體內(nèi)
錯誤的理解
1.this 表示當前對象
2.this 表示當前對象中的本類的資源
3.super 表示當前對象中繼承自父類的資源
4.this 就是一個局部變量,保存當前對象的引用地址
正確的理解
1.this 表示本類的含義
2.super 表示父類的含義
演示代碼
類 Ape:
package priv.lwx.javaprac.lambda;public class Ape {String bloodColor;String name;String skinColor;private int age;public String getBloodColor() {return bloodColor; // 會編譯成Ape$bloodColor}public String getName() {return this.name; // 會編譯成Ape$name} }類 Person:
package priv.lwx.javaprac.lambda;public class Person extends Ape {static String gender = "pp"; }類 WhitePerson:
package priv.lwx.javaprac.lambda;public class WhitePerson extends Person {private int age;private String name;public WhitePerson() {}public WhitePerson(String name, int age, String bloodColor) {this.name = name;this.age = age;this.bloodColor = bloodColor;}public WhitePerson(String name, int age, String bloodColor, String skinColor,String gender) {this.age = age;this.name = name; // 會編譯成WhitePerson$namethis.bloodColor = bloodColor; // 會編譯成Ape$bloodColorsuper.skinColor = skinColor; // 會編譯成Ape$skinColorthis.gender = gender; // 會編譯成Person.gender}public WhitePerson(String name, int age, String bloodColor, String skinColor) {this.age = age;this.name = name;this.bloodColor = bloodColor; // 會編譯成Ape$bloodColorsuper.skinColor = skinColor; // 會編譯成Ape$skinColorthis.gender = gender; // 會編譯成Person.gender,值為"pp"}public int getAge() {return age;}public String getBloodColor() {return this.bloodColor; // 會編譯成 return Ape$bloodColor}}演示類 Demo02WhitePerson:
package priv.lwx.javaprac.lambda;public class Demo02WhitePerson {public static void main(String[] args) {WhitePerson whitePerson1 = new WhitePerson("西太隆", 38, "red", "white");String gender = whitePerson1.gender; // 會編譯成Person.genderSystem.out.println(gender); // 值為"pp"String name = whitePerson1.getName(); // whitePerson1對象中存在兩個名為name的變量,分別是Ape$name、WhitePerson$name,方法getName返回的是當前對象中Ape$name的值System.out.println(name); // nullString bloodColor = whitePerson1.getBloodColor();System.out.println(bloodColor); // redWhitePerson whitePerson2 = new WhitePerson("喜太郎", 28, "blue", "yellow", "male");String gender1 = whitePerson2.gender; // 會編譯成Person.genderSystem.out.println(gender1); // male} }舉例說明:
假設(shè)構(gòu)造方法中有這句代碼 this.name = name,等號左邊部分 this.name 在編譯時,編譯器會在本類 WhitePerson.java 中查找是否存在變量 name,如果存在還會繼續(xù)判斷是不是靜態(tài)的變量,如果是靜態(tài)的變量會編譯成 WhitePerson.name 這樣的語法格式;如果不是靜態(tài)的變量,則會編譯成 WhitePerson$name 這樣的語法格式,表示這個變量 name 是來自于類 WhitePerson。
如果本類 WhitePerson 中找不到變量 name,則會往上查找,如果找到頂層的父類還是找不到,則會報編譯錯誤。假設(shè)在父類 Person 中找到了變量 name,同樣會判斷是不是靜態(tài)的變量,如果是則會編譯成 Person.name 這樣的語法格式;如果不是靜態(tài)的變量,則會編譯成 Person$name 這樣的語法格式,表示這個變量 name 是來自于類 Person。
假設(shè)最后編譯成 Person$name = name 這樣的語法格式,那么在運行時,JVM 會去當前對象中查找來自于類 Person 的變量 name,再將參數(shù) name 的值賦值給變量 Person$name
假設(shè)構(gòu)造方法中有這句代碼 super.name = name,等號左邊部分 super.name 在編譯時,編譯器會在父類 Person.java 中查找是否存在變量 name,如果存在會繼續(xù)判斷是不是靜態(tài)的變量,如果是靜態(tài)的變量則會編譯成 Person.name 這樣的語法格式;如果不是靜態(tài)的變量,則會編譯成 Person$name 這樣的語法格式,表示這個變量 name 是來自于類 Person。
同樣地,如果父類 Person 中找不到變量 name,也會往上查找,如果找到頂層的父類還是找不到,則會報編譯錯誤。假設(shè)在 Person.java 的父類 Ape.java 中找到了變量 name,接著判斷該變量是不是靜態(tài)的,如果是靜態(tài)的則會編譯成 Ape.name;如果不是靜態(tài)的,則會編譯成 Ape$name,表示變量 name 來自于類 Ape。
假設(shè)最后編譯成 Ape$name = name 這樣的語法格式,那么在運行時,JVM 會去當前對象中查找來自于類 Ape 的變量 name,再將參數(shù) name 的值賦值給變量 Ape$name。
總結(jié)
以上是生活随笔為你收集整理的Java中的关键字this_super的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两个路由器如何实现局域网共享两个路由器如
- 下一篇: Java包装类和基本数据类型的对照