因為子類已經繼承了父類的所有方法,子類也未去重寫這些方法,這些方法實際上已經屬於子類,那么使用時,如果我們不寫this或super,類也不報錯;使用this或super也正確。那我們什么也不寫的那種情況到底默認是哪個?
看看下面的代碼
package com.java.three; public class Father { public void printTheInfomationOfThisMan(){ System.out.println(this.toString()); } public String name="父親name"; public int age=55; public String sex="男"; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Father [name=" + name + ", age=" + age + ", sex=" + sex + "]"; } }
package com.java.three; public class Son extends Father{ public String ambution; public String getAmbution() { return ambution; } //使用this給變量賦值 public void setAmbution(String ambution) { this.ambution = ambution; } //使用super給變量賦值 public void superSetInfoToSon(String name,int age){ super.setName(name); super.setAge(age); } //使用this給變量賦值 public void thisSetInfoToSon(String name,int age){ this.setName(name); this.setAge(age); } //這是我們要研究的重點,看看這種方式到底改變的是this的變量還是super的變量 //不適用this,也不使用super,給變量賦值 public void setInfoToSonWithoutNeither(String name,int age){ name=name; age=age; } public void printTheInfomationOfSon(){ System.out.println(this.toStringOfSon()); } public void printTheInfomationOfFather(){ System.out.println(this.toStringOfFather()); } //注意下面關鍵字this的使用 public String toStringOfSon() { return "Son [ambution=" + this.ambution + ", name=" + this.name + ", age=" + this.age + ", sex=" + this.sex + "]"; } //注意下面關鍵字super的使用 public String toStringOfFather() { return "Son [ambution=" + ambution + ", name=" + super.name + ", age=" + super.age + ", sex=" + super.sex + "]"; } }
package com.java.three; public class Testmain { public static void main(String ssd[]){ // Father ff=new Father(); // ff.setName("父親"); // ff.setAge(55); // ff.printTheInfomationOfThisMan(); Son ss=new Son(); System.out.println("----------------this--start-----------------------"); ss.thisSetInfoToSon("給兒子命名this", 26);////使用this給變量賦值 ss.setAmbution("億萬富翁");//子類自己的方法 //ss.printTheInfomationOfThisMan();//繼承父類的方法 ss.printTheInfomationOfSon();//子類自己的方法,打印自己的變量this ss.printTheInfomationOfFather();//子類自己的方法,打印父類的變量super System.out.println("----------------this--end-----------------------"); System.out.println("----------------super--start-----------------------"); ss.superSetInfoToSon("給兒子命名super", 25);//使用super給變量賦值 ss.printTheInfomationOfSon();//子類自己的方法,打印自己的變量this ss.printTheInfomationOfFather();//子類自己的方法,打印父類的變量super System.out.println("----------------super--end-----------------------"); System.out.println(""); System.out.println("----------------注意!!!-----------------------"); System.out.println("----------------neither--start-----------------------"); //注意下面我們設置的信息是("給兒子命名neither", 18) ss.setInfoToSonWithoutNeither("給兒子命名neither", 18);//不適用this,也不使用super,給變量賦值 ss.printTheInfomationOfSon();//子類自己的方法,打印自己的變量this ss.printTheInfomationOfFather();//子類自己的方法,打印父類的變量super System.out.println("----------------neither--end-----------------------"); } }
控制台打印:
----------------this--start----------------------- Son [ambution=億萬富翁, name=給兒子命名this, age=26, sex=男] Son [ambution=億萬富翁, name=給兒子命名this, age=26, sex=男] ----------------this--end----------------------- ----------------super--start----------------------- Son [ambution=億萬富翁, name=給兒子命名super, age=25, sex=男] Son [ambution=億萬富翁, name=給兒子命名super, age=25, sex=男] ----------------super--end----------------------- ----------------注意!!!----------------------- ----------------neither--start----------------------- Son [ambution=億萬富翁, name=給兒子命名super, age=25, sex=男] Son [ambution=億萬富翁, name=給兒子命名super, age=25, sex=男] ----------------neither--end-----------------------
結論:子類繼承的變量就是自己的,無論用this,或是用super都一樣。
還有一個問題我沒看明白,希望高手解答:
我們預想應該輸出的("給兒子命名neither", 18)這個信息無論用this取,還是用super取,都取不出來!
ublic void setInfoToSonWithoutNeither(String name,int age){
name=name;
age=age;
}
因為 你這倆形參名 和 父類的屬性名重復了
所以這里的 name=name;和 age=age; 使用的是局部變量了
就是 自己=自己 的意思