您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java類(lèi)、封裝、繼承的方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java類(lèi)、封裝、繼承的方法”吧!
使用static修飾的成員方法和成員變量稱(chēng)為類(lèi)成員
使用static修飾的成員變量叫做類(lèi)變量
使用static修飾的成員方法叫做類(lèi)方法
未使用static修飾的成員方法和成員變量稱(chēng)為實(shí)例成員
未使用static修飾的成員變量叫做實(shí)例變量
未使用static修飾的成員方法叫做實(shí)例方法
例如:
public String name; //這個(gè)就是實(shí)例成員(屬性) public static int age;//這個(gè)就是類(lèi)成員(屬性) public void a(){ System.out.println("我叫:"+this.name) } //這個(gè)沒(méi)有加static的方法就是實(shí)例方法 public static void a(){ //這個(gè)加了static的方法就是類(lèi)方法 System.out.println("我叫:"+this.name) }
所有該類(lèi)的對(duì)象共享同一個(gè)類(lèi)變量,但是每個(gè)對(duì)象都會(huì)有自己獨(dú)特的實(shí)例變量
所有該類(lèi)的對(duì)象都能改變類(lèi)變量的值,但是每個(gè)對(duì)象只能改變自己的實(shí)例變量值
實(shí)例變量在使用前必須創(chuàng)建一個(gè)對(duì)象,根據(jù)對(duì)象名.變量名使用,但是類(lèi)變量不需要?jiǎng)?chuàng)建對(duì)象
//定義一個(gè)類(lèi) public class stu { public String name; //這個(gè)類(lèi)有一個(gè)名字這個(gè)屬性,屬于實(shí)例成員,也就是需要實(shí)例化對(duì)象了才可以使用 //定義構(gòu)造方法 public stu(){} //不管怎么樣,都定義一個(gè)無(wú)參構(gòu)造 public stu(String name){ //定義有參構(gòu)造,需要傳入一個(gè)字符串名字 this.name = name; //這里若不使用this 關(guān)鍵字,那么是不會(huì)與上面的實(shí)例屬性匹配 } //定義方法 public void a(){ System.out.println(this.name); } }
使用該類(lèi):
public class stu_Test { public static void main(String[] args) { //實(shí)例化兩個(gè)對(duì)象,基于stu類(lèi) stu s1 = new stu("小紅"); stu s2 = new stu("小王"); //使用stu類(lèi)里面的方法 s1.a(); s2.a(); } //stu s1 = new stu("小紅"); 將會(huì)輸出小紅 //stu s2 = new stu("小王"); 將會(huì)輸出小王 } //通過(guò)這個(gè)就可以明白每個(gè)對(duì)象都有屬于自己的實(shí)例變量(屬性)
所有該類(lèi)對(duì)象共享類(lèi)方法和實(shí)例方法
類(lèi)方法使用類(lèi)名.方法名([參數(shù)])調(diào)用即可,不需要實(shí)例化對(duì)象后使用
實(shí)例方法使用對(duì)象名.方法名([參數(shù)])調(diào)用
Java類(lèi)提供了兩種類(lèi)型的變量:用static關(guān)鍵字修飾的靜態(tài)變量和不用static關(guān)鍵字修飾的實(shí)例變量。 靜態(tài)變量屬于類(lèi),在內(nèi)存中只有一個(gè)復(fù)制,只要靜態(tài)變量所在的類(lèi)被加載,這個(gè)靜態(tài)變量就會(huì)被分配空間,因此就可以被使用了。對(duì)靜態(tài)變量的引用有兩種方式,分別是“類(lèi).靜態(tài)變量"和”對(duì)象.靜態(tài)變量"
static方法是類(lèi)的方法,不需要?jiǎng)?chuàng)建對(duì)象就可以被調(diào)用,而非static方法是對(duì)象的方法,只有對(duì)象被創(chuàng)建出來(lái)后才可以被使用
static方法中不能使用this和super關(guān)鍵字,不能調(diào)用非static方法,只能訪問(wèn)所屬類(lèi)的靜態(tài)成員變量和成員方法,因?yàn)楫?dāng)static方法被調(diào)用時(shí),這個(gè)類(lèi)的對(duì)象可能還沒(méi)被創(chuàng)建,即使已經(jīng)被創(chuàng)建了,也無(wú)法確定調(diào)用哪個(gè)對(duì)象的方法。
修飾成員變量
修飾成員方法
靜態(tài)代碼塊
修飾類(lèi)【只能修飾內(nèi)部類(lèi)也就是靜態(tài)內(nèi)部類(lèi)】
靜態(tài)導(dǎo)包
static注意事項(xiàng): 靜態(tài)只能訪問(wèn)靜態(tài),非靜態(tài)既可以訪問(wèn)非靜態(tài)的,也可以訪問(wèn)靜態(tài)的。
把客觀事物封裝成抽象的類(lèi),并且類(lèi)可以把自己的屬性和方法只讓可信的類(lèi)或者對(duì)象進(jìn)行操作,對(duì)不可信的類(lèi)或者對(duì)象隱藏,這樣的過(guò)程叫做封裝。 簡(jiǎn)而言之:把自己的信息封閉起來(lái),只給自己信任的人看和使用
對(duì)屬性的封裝:將屬性設(shè)置為private(私有),限制其只能在類(lèi)的內(nèi)部使用
對(duì)方法的封裝:對(duì)于方法的封裝,將外部可以訪問(wèn)方法設(shè)置為public,將外部不能訪問(wèn)的方法設(shè)置為private
在將封裝之前,我們先學(xué)習(xí)一下一個(gè)新的修飾符:private private:限制其只能在類(lèi)的內(nèi)部使用(也就是說(shuō)被private修飾的方法和屬性,只能在這個(gè)類(lèi)內(nèi)被發(fā)現(xiàn)和使用,在這個(gè)類(lèi)外,是找不到這個(gè)屬性的存在,這也達(dá)到了封裝的效果)
//給name這個(gè)屬性進(jìn)行封裝 private Strint name; //即可,這也我們?cè)陬?lèi)外是找不到這個(gè)屬性的存在的
既然封裝了,肯定也有對(duì)這個(gè)封裝進(jìn)行修改和使用的方法,是的,這就是get/set方法
get/set方法
public class stu { private String name; public void setName(String name){ //set方法:對(duì)象調(diào)用這個(gè)方法,即可對(duì)私有屬性進(jìn)行修改 this.name = name; } public String getName(){ //get方法:對(duì)象調(diào)用這個(gè)方法,就可以使用該方法 return name; } }
使用:
public class stu_Test { public static void main(String[] args) { stu s =new stu(); s.setName("小紅"); //給name 這個(gè)私有屬性修改值為小紅 System.out.println(s.getName()); }
//程序運(yùn)行后,輸出值就是小紅
1:一個(gè)新類(lèi)可以從現(xiàn)有的類(lèi)派生,這樣的過(guò)程叫做繼承
2:在繼承的過(guò)程中,新類(lèi)被稱(chēng)為子類(lèi),現(xiàn)有的類(lèi)被稱(chēng)為父類(lèi),子類(lèi)將會(huì)繼承父類(lèi)的屬性和行為。
繼承語(yǔ)法:
public class stu extends Student{ //在類(lèi)名后加上extends,在寫(xiě)上繼承的父類(lèi)即可 //這里可以寫(xiě)父類(lèi)沒(méi)有發(fā)屬性及方法 public String ID; //等等等等 }
注意: 繼承不能繼承父類(lèi)的私有屬性和方法?。?!只要被private修飾的,都不被繼承?。?!
關(guān)于子類(lèi): 子類(lèi)除了可以擁有父類(lèi)非私有的屬性和方法外,也可以擴(kuò)展自己的屬性和方法
繼承是單繼承,也就是一個(gè)類(lèi)只能有一個(gè)父類(lèi)。
如果一個(gè)類(lèi)沒(méi)有顯式的繼承某一個(gè)類(lèi),那么它有一個(gè)默認(rèn)的父類(lèi)是java.lang.Object類(lèi)
繼承了父類(lèi)非私有的成員變量和成員方法,但是請(qǐng)注意:子類(lèi)是無(wú)法繼承父類(lèi)的構(gòu)造方法的
簡(jiǎn)而言之:一個(gè)子類(lèi)只能繼承一個(gè)父類(lèi),如果這個(gè)類(lèi)沒(méi)有繼承別的類(lèi),默認(rèn)繼承Object類(lèi)(Java自帶)
無(wú)法繼承父類(lèi)的構(gòu)造方法。
方法的重寫(xiě):
@overriding
什么是方法重寫(xiě)?:
子類(lèi)根據(jù)需求從父類(lèi)繼承的方法進(jìn)行重新編寫(xiě)(方法名一樣)
重寫(xiě)是可以使用super方法的方式來(lái)保留父親的方法(super在后面講到)
注意:構(gòu)造方法不能被重寫(xiě)
方法名相同,參數(shù)列表相同(數(shù)量,順序,數(shù)據(jù)類(lèi)型)
如果有返回值,返回值相同或者是其子類(lèi),訪問(wèn)權(quán)限不能?chē)?yán)于父類(lèi)
父類(lèi)的靜態(tài)方法不能被重寫(xiě)為非靜態(tài)方法,反之父類(lèi)的非靜態(tài)方法不能被重寫(xiě)為靜態(tài)方法
子類(lèi)可以定義與父類(lèi)同名的靜態(tài)方法,以便在子類(lèi)中隱藏父類(lèi)的靜態(tài)方法**(靜態(tài)方法中無(wú)法使用super、this)**
父類(lèi)的私有方法不能被子類(lèi)重寫(xiě)(private修飾的)
上代碼:
1:定義一個(gè)類(lèi),有名字和年齡的屬性,分別有g(shù)et/set方法,成員方法是輸出名字和年齡:
public class Person { private String name; private int age; //get/ste方法 public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } //成員方法: public void print(){ System.out.println("我叫:"+this.name+","+"我今年:"+this.age+"歲"); } }
2:寫(xiě)一個(gè)類(lèi),繼承Person類(lèi),并且這個(gè)類(lèi)擁有自己的一個(gè)sex屬性,提供get/set方法 并且重寫(xiě)父類(lèi)的print方法,輸出名字+年齡+性別
public class child extends Person{ private String sex; //這個(gè)child類(lèi)繼承了Person類(lèi),但也擁有自己的屬性 sex性別 public void setSex(String sex){ this.sex = sex; } public String getSex(){ return sex; } @Override //重寫(xiě)父類(lèi)方法: 因?yàn)楦割?lèi)是輸出名字和年齡,這里要輸出名字,年齡和性別 public void print(){ System.out.println("我叫:"+getName()+","+"我今年:"+getAge()+"歲"+","+"我是"+sex+"孩子"); } }
3:新建測(cè)試類(lèi),測(cè)試兩個(gè)類(lèi)的繼承、重寫(xiě)
//測(cè)試類(lèi), public class Test { public static void main(String[] args) { child c = new child(); c.setName("小紅"); c.setAge(20); c.setSex("男"); c.print(); } } //分別執(zhí)行child繼承person的set方法,使用重寫(xiě)后的方法,
//輸出結(jié)果為: 我叫:小紅,我今年:20歲我是男孩子
super代表的是父類(lèi)對(duì)象
super的使用方式:
1:super.屬性名 用于在子類(lèi)中調(diào)用父類(lèi)被隱藏的同名實(shí)例變量
2:super([參數(shù)列表]) 用于在子類(lèi)的構(gòu)造方法中調(diào)用父類(lèi)的構(gòu)造方法
注意事項(xiàng):
每一個(gè)子類(lèi)的構(gòu)造方法在沒(méi)有顯示調(diào)用super(),系統(tǒng)都會(huì)提供一個(gè)默認(rèn)的super()
super() 書(shū)寫(xiě)在第一行
可以在子類(lèi)構(gòu)造方法中顯示調(diào)用super(),完成對(duì)特定父類(lèi)構(gòu)造方法的調(diào)用
簡(jiǎn)而言之:super就是調(diào)用父親的屬性和方法來(lái)使用
上代碼:
1:新建一個(gè)類(lèi):定義age為20
public class super_test { public int age=20; public void print(){ System.out.println(this.age); } }
2:建第二個(gè)類(lèi),繼承第一個(gè)類(lèi);
public class su2 extends super_test{ public int age = 10; @Override public void print(){ System.out.println(super.age); //這里使用super,意思是使用父類(lèi)的age } }
3:建立測(cè)試類(lèi):
public class test { public static void main(String[] args) { su2 s = new su2(); s.print(); } }
這樣輸出的就是20,是父類(lèi)的age
this與super的區(qū)別:
super: 它引用當(dāng)前對(duì)象的直接父類(lèi)中的成員(用來(lái)訪問(wèn)直接父類(lèi)中被隱藏的父類(lèi)中成員數(shù)據(jù)或函 數(shù),基類(lèi)與派生類(lèi)中有相同成員定義時(shí)如:super.變量名 super.成員函數(shù)據(jù)名(實(shí)參)
this:它代表當(dāng)前對(duì)象名(在程序中易產(chǎn)生二義性之處,應(yīng)使用this來(lái)指明當(dāng)前對(duì)象;如果函數(shù)的 形參與類(lèi)中的成員數(shù)據(jù)同名,這時(shí)需用this來(lái)指明成員變量名
super()和this()類(lèi)似,區(qū)別是,super()在子類(lèi)中調(diào)用父類(lèi)的構(gòu)造方法,this()在本類(lèi)內(nèi)調(diào)用本類(lèi)的其 它構(gòu)造方法。
super()和this()均需放在構(gòu)造方法內(nèi)第一行,盡管可以用this調(diào)用一個(gè)構(gòu)造器,但卻不能調(diào)用兩個(gè)
this和super不能同時(shí)出現(xiàn)在一個(gè)構(gòu)造函數(shù)里面,因?yàn)閠his必然會(huì)調(diào)用其它的構(gòu)造函數(shù),其它的構(gòu)造 函數(shù)必然也會(huì)有super語(yǔ)句的存在,所以在同一個(gè)構(gòu)造函數(shù)里面有相同的語(yǔ)句,就失去了語(yǔ)句的意 義,編譯器也不會(huì)通過(guò)。
this()和super()都指的是對(duì)象,所以,均不可以在static環(huán)境中使用。包括: static變量,static方法,static語(yǔ)句塊。
從本質(zhì)上講,this是一個(gè)指向本對(duì)象的指針, 然而super是一個(gè)Java關(guān)鍵字。
感謝各位的閱讀,以上就是“Java類(lèi)、封裝、繼承的方法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java類(lèi)、封裝、繼承的方法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。