2020-04-13
Java面向?qū)ο笾校悍椒ㄖ剌d和方法重寫(xiě) 、 this關(guān)鍵字和super關(guān)鍵字
方法重載:是指同一個(gè)類(lèi)中的多個(gè)方法具有相同的名字,但這些方法具有不同的參數(shù)列表,即參數(shù)的數(shù)量或參數(shù)類(lèi)型或者參數(shù)順序不能完全相同;重載是一個(gè)類(lèi)中多態(tài)性的一種表現(xiàn)
總結(jié):
1.同一個(gè)類(lèi)中
2.方法名相同
3.參數(shù)列表不同,即參數(shù)的數(shù)量 或 參數(shù)類(lèi)型 或 參數(shù)順序 不能完全相同
4.對(duì)其他沒(méi)有要求,(例如:對(duì)返回值類(lèi)型沒(méi)有要求一致)
package com.zzm.trydemo; /* 方法重載: * 1.同一個(gè)類(lèi)中 * 2.方法名相同 * 3.參數(shù)列表不同,即參數(shù)的數(shù)量 或 參數(shù)類(lèi)型 或 參數(shù)順序 不能完全相同 * * */ public class Test1_Overload { public static void main(String[] args) { student(); student("小明",5); student(18,"小紅"); } public static void student(){ System.out.println("我是一個(gè)學(xué)生"); } public static void student(String name,int age){ System.out.println("我是一個(gè)學(xué)生,我叫"+name+",我今年"+age+"歲"); } public static void student(int age,String name){ System.out.println("我是一個(gè)學(xué)生,我叫"+name+",我今年"+age+"歲"); } } /* 代碼輸出: *我是一個(gè)學(xué)生 *我是一個(gè)學(xué)生,我叫小明,我今年5歲 *我是一個(gè)學(xué)生,我叫小紅,我今年18歲 * * */
方法重寫(xiě):是存在子父類(lèi)之間的,子類(lèi)定義的方法與父類(lèi)中的方法具有相同的方法名字,相同的參數(shù)表和相同的返回類(lèi)型;
重寫(xiě)是父類(lèi)與子類(lèi)之間多態(tài)性的一種表現(xiàn);
重寫(xiě)是為了調(diào)用子類(lèi)對(duì)象時(shí),改變父類(lèi)的功能
總結(jié):
1.方法重寫(xiě):訪(fǎng)問(wèn)修飾符 返回值類(lèi)型 方法名(參數(shù)類(lèi)型 參數(shù)){代碼...}
2.方法重寫(xiě)用于繼承中(子類(lèi) Extends父類(lèi))的子類(lèi)里--------不在同一個(gè)類(lèi)中
3.訪(fǎng)問(wèn)修飾符 權(quán)限: 子類(lèi)>=父類(lèi)(public>protected>default>private)
4.返回值類(lèi)型: 4.1.基本類(lèi)型 或者 void ---子類(lèi)和父類(lèi)相同
4. 2.引用類(lèi)型 -----子類(lèi)<=父類(lèi)
5.方法名、參數(shù)列表:子類(lèi)同父類(lèi)相同,一模一樣
6. 繼承后,子類(lèi)就擁有了父類(lèi)的功能
7. 那么在子類(lèi)中,可以添加子類(lèi)特有的功能也可以修改父類(lèi)的原有功能
8. 子類(lèi)中方法簽名與父類(lèi)完全一樣(包括方法的返回值,方法名和參數(shù)列表,完全一致)時(shí),會(huì)發(fā)生覆蓋/復(fù)寫(xiě)操作,相當(dāng)于修改功能
注意:
1、父類(lèi)中的私有方法不能被重寫(xiě)
2、子類(lèi)重寫(xiě)父類(lèi)方法時(shí),修飾符要大于等于父類(lèi)修飾符的權(quán)限
package com.zzm.trydemo; /* *方法重寫(xiě):訪(fǎng)問(wèn)修飾符 返回值類(lèi)型 方法名(參數(shù)類(lèi)型 參數(shù)){代碼...} *方法重寫(xiě)用于繼承中(子類(lèi) Extends父類(lèi))的子類(lèi)里---在不同一個(gè)類(lèi)中 *訪(fǎng)問(wèn)修飾符 權(quán)限: 子類(lèi)>=父類(lèi) *返回值類(lèi)型: 1.基本類(lèi)型 或者void ---子類(lèi)和父類(lèi)相同 * 2.引用類(lèi)型 ---子類(lèi)<=父類(lèi) *方法名、參數(shù)列表:子類(lèi)同父類(lèi)相同,一模一樣 */ public class Test2_OverRide { public static void main(String[] args) { Student1 s=new Student1(); s.teach(); } } class Teacher1{ public void teach(){ System.out.println("老師上課"); } } class Student1 extends Teacher1{ public void teach(){ System.out.println("學(xué)生聽(tīng)課"); } } /* * 輸出結(jié)果: * 學(xué)生聽(tīng)課 * * */
重載與重寫(xiě)的區(qū)別(Overload和Override的區(qū)別)
1、目的不同
overload用于增加程序的可讀性(做法不同,但是做的同一事情)。 override用于提供其超級(jí)類(lèi)已經(jīng)提供的方法的特定實(shí)現(xiàn)。
2、范圍不同
overload 在相同的類(lèi)范圍內(nèi)內(nèi)執(zhí)行,是一個(gè)類(lèi)中多態(tài)性的一種表現(xiàn)。 override發(fā)生在兩類(lèi)具有繼承(繼承)的關(guān)系,是父類(lèi)與子類(lèi)之間多態(tài)性的一種表現(xiàn)。
3、參數(shù)不同
overload參數(shù) 必須不同。 override參數(shù) 必須相同。
this關(guān)鍵字:
1.this 代表本類(lèi)對(duì)象引用,在本類(lèi)中使用
2.局部變量和成員變量同名時(shí),用this可調(diào)用本類(lèi)成員方法或者本類(lèi)成員變量,調(diào)用方式 this.成員
因?yàn)樵跇?gòu)造方法(構(gòu)造函數(shù))中,有個(gè)經(jīng)典的this用法,所以也順便提一提
構(gòu)造方法(構(gòu)造函數(shù)):構(gòu)造方法是與類(lèi)同名,且 沒(méi)有返回值類(lèi)型,主要是完成對(duì)象的創(chuàng)建或者對(duì)象的初始化
修飾符 類(lèi)名(【參數(shù)】){
代碼……
}
package test.constructe; //構(gòu)造方法創(chuàng)建 public class Constr { public static void main(String[] args) { Person p=new Person();//無(wú)參創(chuàng)建對(duì)象,底層會(huì)自動(dòng)調(diào)用無(wú)參構(gòu)造方法 Person p2=new Person("小明");//含參創(chuàng)建對(duì)象,底層會(huì)自動(dòng)調(diào)用含參構(gòu)造方法 } } class Person{ //構(gòu)造方法,與類(lèi)同名,修飾符 類(lèi)名(參數(shù)列表){方法體} public Person(){//默認(rèn)會(huì)存在構(gòu)造方法--前提沒(méi)有提供含參構(gòu)造方法 System.out.println("無(wú)參構(gòu)造方法"); } //重載構(gòu)造方法 public Person(String name){ System.out.println("含參構(gòu)造方法 "+name); } } /* *無(wú)參構(gòu)造方法 *含參構(gòu)造方法 小明 * * */
package com.zzm.trydemo; /* *1.this 代表本類(lèi)對(duì)象引用,在本類(lèi)中使用 *2.局部變量和成員變量同名時(shí),用this可調(diào)用本類(lèi)成員方法或者本類(lèi)成員變量 */ public class Test3_This { public static void main(String[] args) { ThisDemo td=new ThisDemo();//創(chuàng)建無(wú)參構(gòu)造對(duì)象時(shí),就會(huì)自動(dòng)調(diào)用無(wú)參構(gòu)造方法 ThisDemo td2=new ThisDemo(30); td2.f1(); } } class ThisDemo{ int sum=20; public ThisDemo(){//一般,沒(méi)有用也要寫(xiě)出來(lái) //this(999);//this 不能在兩個(gè)都早參數(shù)中相互調(diào)用,那是死循環(huán) System.out.println("自動(dòng)調(diào)用無(wú)參構(gòu)造方法"); } public ThisDemo(int sum){ this();//在構(gòu)造方法中,放在第一行;在一個(gè)構(gòu)造函數(shù)中可以調(diào)另一個(gè)構(gòu)造函數(shù) System.out.println("含參構(gòu)造方法,已經(jīng)傳入值"+sum); this.sum=sum; } public void f1(){ int sum=10; System.out.println("就近原則"+sum); ThisDemo t=new ThisDemo();//又會(huì)調(diào)用一次無(wú)參構(gòu)造 System.out.println("新創(chuàng)建一個(gè)對(duì)象仍然使用的是成員變量的值"+t.sum);//仍然使用的是成員變量的值 System.out.println("使用的傳入的賦值后的值"+this.sum);//使用的傳入的賦值后的值 f2();//同this.f2();意義結(jié)果相同,通常this是隱式,不寫(xiě)直接調(diào)用,氮實(shí)際上是有this關(guān)鍵字的 } public void f2(){ System.out.println("這是f2"); } } /* * 輸出結(jié)果: *自動(dòng)調(diào)用無(wú)參構(gòu)造方法 *自動(dòng)調(diào)用無(wú)參構(gòu)造方法 *含參構(gòu)造方法,已經(jīng)傳入值30 *就近原則10 *自動(dòng)調(diào)用無(wú)參構(gòu)造方法 *新創(chuàng)建一個(gè)對(duì)象仍然使用的是成員變量的值20 *使用的傳入的賦值后的值30 *這是f2 * * * */
super關(guān)鍵字:
1、 通過(guò)super關(guān)鍵字可以使用父類(lèi)的內(nèi)容
2、 super代表父類(lèi)的一個(gè)引用對(duì)象
3、 如果用,必須出現(xiàn)在調(diào)用位置的第一行
4、 不管父類(lèi)無(wú)參構(gòu)造寫(xiě)沒(méi)寫(xiě),子類(lèi)構(gòu)造無(wú)參里都有super,隱式了 。一般都要寫(xiě)無(wú)參構(gòu)造,方便。
如果父類(lèi)沒(méi)有寫(xiě)無(wú)參構(gòu)造,子類(lèi)的構(gòu)造函數(shù)里必須寫(xiě) super(參數(shù))
package com.zzm.trydemo; /*1、 通過(guò)super關(guān)鍵字可以使用父類(lèi)的內(nèi)容,在子類(lèi)中使用 *2、 super代表父類(lèi)的一個(gè)引用對(duì)象 *3、 如果用在構(gòu)造方法中,必須出現(xiàn)在調(diào)用位置的第一條語(yǔ)句??!(類(lèi)似于this) * *4、 不管父類(lèi)無(wú)參構(gòu)造寫(xiě)沒(méi)寫(xiě),子類(lèi)構(gòu)造無(wú)參里都有super,隱式了 。一般都要寫(xiě)無(wú)參構(gòu)造,方便 * 如果父類(lèi)沒(méi)有寫(xiě)無(wú)參構(gòu)造,子類(lèi)的構(gòu)造函數(shù)里必須寫(xiě)super(參數(shù)) * */ public class Test4_Super { public static void main(String[] args) { Student2 s=new Student2(); } } class Person2{ int a=1; public Person2(){//父類(lèi)無(wú)參構(gòu)造 System.out.println("無(wú)參Person2"); } public Person2(int a){//父類(lèi)有參構(gòu)造 System.out.println("有參Person2"); } public void f(){ System.out.println("父類(lèi)f方法"); } } class Student2 extends Person2{ int a=2; public Student2(){//子類(lèi)無(wú)參構(gòu)造 //super();//先調(diào)用父類(lèi)的無(wú)參構(gòu)造;隱式的,可以不寫(xiě),不寫(xiě)也會(huì)調(diào)用父類(lèi)的無(wú)參構(gòu)造;必須放在第一行 super(1);//super(1)會(huì)將super()覆蓋掉 System.out.println("Student2"); System.out.println("調(diào)用子類(lèi)的a值"+a); System.out.println("調(diào)用父類(lèi)的a值"+super.a); f(); super.f(); } public void f(){ System.out.println("子類(lèi)f方法"); } } /* * 輸出結(jié)果: *有參Person2 *Student2 *調(diào)用子類(lèi)的a值2 *調(diào)用父類(lèi)的a值1 *子類(lèi)f方法 *父類(lèi)f方法 * */
1、 this代表本類(lèi)對(duì)象的引用,super代表父類(lèi)對(duì)象的引用。
2、 this用于區(qū)分局部變量和成員變量
3、 super用于區(qū)分本類(lèi)變量和父類(lèi)變量
4、 this.成員變量 this.成員方法() this(【參數(shù)】)代表調(diào)用本類(lèi)內(nèi)容
5、 super.成員變量 super.成員方法() super(【參數(shù)】),代表調(diào)用父類(lèi)內(nèi)容
6、 this和super不可以同時(shí)出現(xiàn)在同一個(gè)構(gòu)造方法里,他們兩個(gè)只要出現(xiàn)都得放在第一行