本文主要介紹java面向?qū)ο罄碚摶A(chǔ)(java面向?qū)ο蠡A(chǔ)知識(shí)點(diǎn)),下面一起看看java面向?qū)ο罄碚摶A(chǔ)(java面向?qū)ο蠡A(chǔ)知識(shí)點(diǎn))相關(guān)資訊。
本文是《零基礎(chǔ)學(xué)java》欄。它用通俗易懂的文字、圖表、代碼,帶你從零開始走向高薪之路!
本文首發(fā)于官方賬號(hào)【編程攻略】。
在哲學(xué)體系中,類和物可以分為主體和客體。在面向?qū)ο蟮木幊陶Z言中,所有要面對(duì)的事物都可以抽象為對(duì)象。在面向?qū)ο缶幊痰倪^程中,我們使用各種對(duì)象相互配合來完成我們的程序功能。
在面向?qū)ο蟮恼Z言中,所有使用的對(duì)象都有一定的類型,這些類型之間有層次關(guān)系,就像生物學(xué)中的門、類、目、科、屬、種一樣。我們可以通過繼承機(jī)制來實(shí)現(xiàn)這種層次關(guān)系。
java語言是一種面向?qū)ο蟮恼Z言,所有的對(duì)象都可以有一定的屬性和一定的行為功能。在java語言中,對(duì)象的屬性由成員變量(域)描述,行為由方法描述。
類和對(duì)象的區(qū)別和聯(lián)系在于,類是抽象的,它擁有類的所有屬性和行為,相當(dāng)于一個(gè)模板,而對(duì)象是具體的,通過創(chuàng)建相應(yīng)類的對(duì)象來完成相應(yīng)的功能。我們?cè)谧雒嫦驅(qū)ο缶幊痰臅r(shí)候,抽象出類的屬性和行為,然后創(chuàng)建具體的對(duì)象來完成功能。
date類是在jdk定義的,有一個(gè)描述日期的類:java.util.date,表示特定的時(shí)刻,精確到毫秒。這里我們定義了一個(gè)簡單的date類,用年、月和日來表示日期。讓 讓我們先來看看下面的定義。
公開課日期{ public int year公共int月;公共int日;在這個(gè)程序定義中,類被定義為public,年、月、日也被定義為public。它們是什么意思?
我們前面提到了包的概念。我們說過同一個(gè)包中的類在功能上是相關(guān)的,但是并不是包中的所有這些類都可以被其他包中的類調(diào)用。如何區(qū)分它們?對(duì)于那些可以在包外使用的類,我們?cè)诙x時(shí)在類名前加public,在定義不能在包外使用的類時(shí)不加public。
類體中定義的變量,如年、月、日,稱為成員變量(字段),所以成員變量前面的public的作用是表明這些變量是公共的,可以以對(duì)象和變量的形式調(diào)用,這就叫成員變量的訪問權(quán)限。例如,如果我們定義了一個(gè)日期類型的變量d1,那么我們可以在d1到d1.year中使用年份,在定義成員變量時(shí),除了定義為public,還可以有protected,default(無權(quán)限修飾符)和private,它們的限制越來越嚴(yán)格。讓 總結(jié)一下:
public:public修飾的成員是完全公開的,任何合法的訪問形式都可以訪問。受保護(hù)的成員可以在定義它們的類中訪問,也可以由同一個(gè)包中的其他類及其子類訪問(子類可能不在同一個(gè)包中),但不能由其他包中的非子類訪問。默認(rèn)值:不使用權(quán)限修飾符。這個(gè)類的成員可以在定義它們的類中訪問,也可以被同一個(gè)包中的其他類訪問,但是不能被其他包中的類訪問,如果它們不在同一個(gè)包中,它們的子類也不能被訪問。private:只能在定義它們的類中訪問。;這就是全部。在一個(gè)類中,我們不僅可以定義成員變量,還可以定義成員方法,成員方法前面也可以有這四種權(quán)限控制,意思相同。但是唐 t認(rèn)為獨(dú)立類前面可以有private和protected兩個(gè)修飾符,類前面只能有public或者no,意思上面已經(jīng)提到了。
關(guān)于公共類和源文件的關(guān)系,我們之前研究過,這里再提一次:
每個(gè)源代碼文件中至少定義了一個(gè)類。如果有多個(gè)類,最多有一個(gè)類被定義為public。如果有一個(gè)公共類,源代碼文件的前綴名應(yīng)該與該類的類名完全一致。如果沒有公共類,源代碼文件的前綴名稱可能與文件中的任何類都不一致。
測(cè)試 ;的日期類已經(jīng)定義了,我們?cè)趺茨軠y(cè)試這個(gè)類呢?我們定義了這個(gè)類中的main方法了嗎?沒有main方法的類可以作為java類名在控制臺(tái)執(zhí)行嗎?顯然不是,那我們?cè)撛趺崔k?有兩種方案,一種是我們?yōu)樗x一個(gè)主方法;另一個(gè)解決方案是定義另一個(gè)類,特別是測(cè)試 ;的日期類。讓 讓我們依次看一看。
添加main方法我們將main方法添加到日期的定義中,代碼如下:
公開課日期{ public int year公共int月;公共int日;public static void main(string[]args){ year = 2016;月= 9;day = 5;system . out . println( year : 年份和時(shí)間monthe cho 9-@ . com 月份和時(shí)間day: 天);}}編譯...為什么?又錯(cuò)了?唐 不要驚慌,看看錯(cuò)誤消息,這意味著非靜態(tài)變量可以 不能從靜態(tài)上下文中引用。這是什么意思?讓 讓我們看看在main方法前面是否有一個(gè)修飾符static。如前所述,任何由static修改的成員變量或方法都可以以類名和成員的形式訪問。如果在控制臺(tái)中以java date的形式執(zhí)行date類,我想問一下,是不是系統(tǒng)創(chuàng)建一個(gè)date對(duì)象,然后執(zhí)行這個(gè)對(duì)象中的main方法來執(zhí)行date類?錯(cuò)了,系統(tǒng)直接找到類文件date.class,把這個(gè)類調(diào)入內(nèi)存,然后直接執(zhí)行main。此時(shí)內(nèi)存中沒有date對(duì)象,這也是為什么main要定義為static的原因,因?yàn)閙ain是通過類執(zhí)行的,而不是通過對(duì)象。
上面的解釋和這個(gè)編譯有什么關(guān)系?讓 讓我們看看年、月、日之前是否有修飾語static。不,這意味著不能通過類名直接訪問這些成員變量,而必須通過創(chuàng)建類的對(duì)象,然后通過對(duì)象來訪問。當(dāng)main被執(zhí)行時(shí),內(nèi)存中沒有對(duì)象,所以那些沒有靜態(tài)修飾的成員自然可以 不被訪問,因?yàn)樗麄儾弧?不存在,對(duì)嗎?你想通了嗎?還沒有?再想想!
我們可以得出一個(gè)結(jié)論,我們能記住的只有那些靜態(tài)修飾的成員(包括成員變量、方法等。)可以在靜態(tài)修飾方法中使用。如果使用了這個(gè)類中的非靜態(tài)成員,我們還必須創(chuàng)建這個(gè)類的對(duì)象,并通過對(duì)象使用它們。嗯,如果你不 不明白道理,先記住這個(gè)結(jié)論就好。
根據(jù)上述結(jié)論,我們?cè)俅涡薷臏y(cè)試電碼:
public class date 2 { public int year;公共int月;公共int日;public static void main(string[]args){ date 2 d1 = new date 2;d1.year = 2016年;d1 . month = 9;d1 . day = 5;system . out . println( year : d1 .年份和年份monthe cho 9-@ . com d1 .月與日day: d1.day);}}編譯...,好,跑,傳球,
在非靜態(tài)方法中使用靜態(tài)成員可以嗎?我們同意。簡單來說,這是因?yàn)轭愊扔趯?duì)象存在,靜態(tài)成員依賴于類,非靜態(tài)成員依賴于對(duì)象。
在上面的程序中,我們分別給這些成員變量賦值。如果我們不 t給定值直接輸出?讓 讓我們?cè)囋?
public class date 3 { public int year;公共int月;公共int日;public static void main(string[]args){ date 3 d1 = new date 3;system . out . println( year : d1 .年份和年份monthe cho 9-@ . com d1 .月與日day: d1 . day);}}編譯,運(yùn)行,結(jié)果:,全部0。這里有一個(gè)結(jié)論:如果一個(gè)成員變量沒有顯式初始化,那么它的初始值為0,或者一個(gè)等價(jià)于0的值,比如引用變量,沒有顯式初始化,它的值為null,沒有顯式初始化的邏輯變量的值為false。這里需要注意的是,我們說的是成員變量。如果它們是局部變量,將在沒有顯式初始化的情況下使用,編譯將失敗。例如,上面的代碼更改為:
public class date 3 { public int year;公共int月;公共int日;public static void main(string[]args){ date 3 d1;//這里d1是局部變量,system . out . println( year : d1 .年份和年份monthe cho 9-@ . com d1 .月與日day: d1.day)未初始化;}}編譯:從編譯提示中我們知道d1是在沒有初始化的情況下使用的,這是錯(cuò)誤的。
創(chuàng)建測(cè)試類的代碼如下:
//這個(gè)類放在date.java文件公共類date { public int year公共int月;公共int日;}//這個(gè)類放在testdate.java文件中,公共類test date { public static void main(string[]args){ date。d1 =新日期;d1.year = 2016年;d1 . month = 9;d1 . day = 5;system . out . println( year : d1 .年份和年份monthe cho 9-@ . com d1 .月與日day: d1 . day);}}這兩個(gè)類都是公共類,所以應(yīng)該寫在兩個(gè)不同的源代碼文件中,分別命名為dat測(cè)試完成后會(huì)被公開使用,所以我們要把date定義為public,所以源文件的名字是dat測(cè)試date類,所以前面的public要去掉。代碼如下:
//這些代碼放在date.java文件類test date { public static void main(string[]args){ date d1 = newdate;d1.year = 2016年;d1 . month = 9;d1 . day = 5;system . out . println( year : d1 .年份和年份monthe cho 9-@ . com d1 .月與日day: d1 . day);} }公開課日期{ public int year公共int月;公共int日;}這兩個(gè)類的定義順序無關(guān)緊要。編譯完成后,我們可以在命令行上執(zhí)行:java testdate。
考慮一下這個(gè)例子中的封裝,有一個(gè)問題:在我們創(chuàng)建了日期對(duì)象d1之后,我們直接使用d1。該表單為年、月和日賦值。如果我們給它們的值不是合法值呢?例如,month的值不在1和12之間,依此類推。在上面的日期定義中,我們沒有辦法控制其他代碼隨意為這些公共修飾變量設(shè)置值。
我們可以用私有修飾符來保護(hù)這些成員變量。由private修飾的成員只能在類或?qū)ο髢?nèi)部訪問自身,而不能在外部訪問。將上面的日期代碼更改為:
普布利c上課日期{私人int年;私人int月;私人int日;}所以我們可以 t通過d1.year訪問d1對(duì)象中的年份。;t訪問年,所以什么 這個(gè)變量有什么用?是的,如果沒有其他手段,上面的類是沒有用的,我們沒有辦法在里面存儲(chǔ)數(shù)據(jù)。
我們做什么呢我們通過添加一對(duì)公共方法來設(shè)置和獲取每個(gè)私有成員變量的值。這些方法的命名方法是:setxxx和getxxx,setter方法給變量賦值,getter取變量的值,布爾型變量用:isxxx命名,xxx是變量的名字,上面的例子改為:
公開課日期{私立int年;私人int月;私人int日;public void setyear(int year){//理論上沒有年份0。我們將傳入的值為0的實(shí)數(shù)參數(shù)視為1//年。正值表示ad,負(fù)值表示bcif(year == 0){//這里有兩個(gè)年份,一個(gè)是成員變量,一個(gè)是實(shí)參數(shù),是允許的。//為了區(qū)分它們,在成員變量year之前加上這個(gè)。//不處理參數(shù)year如果沒有與成員變量同名的變量,可以省略這個(gè)。年份= 1;} else { this.year = year} }//因?yàn)橐ear的值,所以getter方法的返回值與所選變量的類型一致,public int getyear{ return year;} public void set month(int month){ if((month 0)(month 13)){ this . month = month;} else { this . month = 1;} } public int getmonth{返回月份;}public void setday(int day){//這個(gè)方法有點(diǎn)復(fù)雜,因?yàn)槲覀冃枰鶕?jù)year和month的值來判斷real參數(shù)的值是否符合switch(month){ case 1 echop 9-@ . com case 5 echop 9-@ . com case 7 : case 8 echop 9-@ .com。e10: case 12 : if(day 32 day 0){//在1~31的范圍內(nèi),this.day = day} else { this . day = 1;//日期超出正常范圍,我們?cè)O(shè)置為1 } breakcase 4 : case 6 : case 9 : case 11 : if(day 31 day 0){//在1~30的范圍內(nèi),this.day = day} else { this . day = 1;//日期超出正常范圍,我們?cè)O(shè)置為1 } breakcase 2 : if(isleapyear){ if(day 30 day 0){//在1~29的范圍內(nèi),this.day = day} else { this . day = 1;//超出正常的日期范圍,我們?cè)O(shè)置為1}} else {if (day 29 day 0) {//在1~28的范圍內(nèi),this.day = day} else { this . day = 1;//日期超出正常范圍,我們?cè)O(shè)置為1 } } breakdefault : this . day = 1;//如果month的值不在上述情況,day設(shè)置為1break} }//這個(gè)方法判斷一年是否是閏年,如果是閏年則返回true,否則返回false//這個(gè)方法只在這個(gè)類內(nèi)部使用,所以定義為private private boolean is leap year{//能被400或4整除但不能被100整除的年份為閏年,其他年份為平年如果((year% 400 = = 0) |。= 0))){返回true}返回false//這里能執(zhí)行,說明是平年}}經(jīng)過上面的改造,雖然代碼長了很多,但是安全了很多。我們不再直接訪問年、月和日的值,而是通過相應(yīng)變量的getter和setter方法。訪問時(shí),這些方判斷設(shè)定值是否符合。
上面的代碼其實(shí)是可以優(yōu)化的。例如,setday可以優(yōu)化如下:
public void setday(int day){//這個(gè)方法有點(diǎn)復(fù)雜,因?yàn)槲覀冃枰褂没趛ear,mon的方法。th的值用來判斷自變量的值是否符合this . day = 1;//let ;首先將day設(shè)置為1。你不 以下越界情況不需要寫代碼開關(guān)(月)。{ case 1 : case 3 : case 5 : case 7 : case 10 : case 12 e: if(day 32 day 0){//在1 ~ 30。}破;case 4 : case 6 : case 9 : case 11 : if(day 31 day 0){//在1~30的范圍內(nèi),this.day = day}破;case 2 : if(isleapyear){ if(day 30 day 0){//在1~29的范圍內(nèi),this.day = day}} else {if (day 29 day 0) {//在1~28范圍內(nèi),this.day = day} }破;通過上面的例子,我們看到了一個(gè)面向?qū)ο蟮母拍?封裝。我們用私有隱藏?cái)?shù)據(jù),用公開訪問封裝數(shù)據(jù),使得數(shù)據(jù)更加安全可靠。
成員變量的初始化非靜態(tài)成員變量的初始化在上面的例子中,如果我們創(chuàng)建一個(gè)新的date對(duì)象,我們可以知道當(dāng)我們直接取年、月、日的值時(shí),它們的值都是0,這顯然是不合理的。為了解決這個(gè)問題,我們需要讓系統(tǒng)在創(chuàng)建日期對(duì)象時(shí)自動(dòng)初始化一個(gè)合適的值。為了實(shí)現(xiàn)這一目標(biāo),我們可以采取三種
在定義成員變量時(shí)初始化該值,如上面的代碼所示。我們將其修改如下:
public class date { private int year = 1;private int month = 1;private int day = 1;...}上面的代碼,這樣新date對(duì)象的初始值都是1。
第二種是使用構(gòu)造法。
構(gòu)造函數(shù)是類中的一個(gè)特殊方法,它的方法名與類名相同。這個(gè)方法沒有返回值,甚至是void,構(gòu)造函數(shù)不能作為普通方法對(duì)待。每次生成類的對(duì)象時(shí),都會(huì)調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)的作用是在創(chuàng)建對(duì)象時(shí)初始化它。我們使用構(gòu)造函數(shù)來初始化成員變量,代碼如下:
公開課日期{私立int年;私人int月;私人int日;public date{ year = 1;月= 1;day = 1;} ...}上面的代碼使我們能夠初始化新日期對(duì)象中的值。上面的構(gòu)造方法沒有參數(shù)。這種構(gòu)造方法稱為默認(rèn)構(gòu)造方法。構(gòu)造函數(shù)只能初始化成這個(gè)固定值是真的嗎?當(dāng)你創(chuàng)建一個(gè)對(duì)象時(shí),你能指定初始化值嗎?答案是肯定的,就是使用帶參數(shù)的構(gòu)造函數(shù)。代碼如下:
公開課日期{私立int年;私人int月;私人int日;public date (int year,int month,int day){//下面的代碼使用setter方法進(jìn)行初始化,因?yàn)閟etter方法提供了參數(shù)檢查。//如果不使用setter方法,我們需要重寫參數(shù)校驗(yàn)碼setyear(year);setmonth(月);setday(日);} ...}上面的代碼使我們能夠在創(chuàng)建新的date對(duì)象時(shí)指定一個(gè)初始化值,比如:date d = new date(2016 . 9 . 5);。然而,上面的代碼沒有定義無參數(shù)的構(gòu)造函數(shù),所以我們可以 t使用無參數(shù)構(gòu)造函數(shù)創(chuàng)建日期對(duì)象,如:date d = new date;編譯時(shí)會(huì)出現(xiàn)如圖所示的錯(cuò)誤:為什么?這是因?yàn)槿绻诙x類的時(shí)候沒有定義構(gòu)造函數(shù),編譯器會(huì)自動(dòng)創(chuàng)建一個(gè)沒有參數(shù)的空公共構(gòu)造函數(shù)作為該類的構(gòu)造函數(shù)。但是只要定義了構(gòu)造方法,不管有沒有參數(shù),編譯器都不再自動(dòng)生成,會(huì)出現(xiàn)上面的。
此外,jvm將忽略構(gòu)造函數(shù)中生成的異常,即使在構(gòu)造函數(shù)中使用了try。
public class test { public test{ try { system . out . println( 試圖拋出一個(gè)異常);雙x = 1.0/0.0;//這句話會(huì)生成一個(gè)exception} catch(exception e)除以0。{ system . out . println( 捕獲到異常 );}最后{ system . out . println( 里面終于 );} }公共靜態(tài)void main(string args[]){ test test = new test;上面的代碼執(zhí)行后的結(jié)果如下:從圖中可以看到,發(fā)生的異常沒有被捕獲。
第三種方法是使用實(shí)例語句塊。那么什么是實(shí)例語句塊呢?實(shí)例語句塊是由一對(duì)可以執(zhí)行的大括號(hào)括起來的一系列語句。該語句塊在類內(nèi)部,但不在任何方法內(nèi)部,如下面的代碼所示:
公開課日期{私立int年;私人int月;私人int日;//下面的大括號(hào)是示例語句塊{ year = 1;月= 1;day = 1;} ...}上面的示例語句塊將在執(zhí)行構(gòu)造函數(shù)之前執(zhí)行。如果出現(xiàn)多個(gè)實(shí)例語句塊,請(qǐng)按順序執(zhí)行它們。
如果同時(shí)采用這三種方法呢?代碼如下:
public class date { private int year = 1;private int month = 1;private int day = 1;{ year = 2;月= 2;日= 2;} public date{ year = 3;月= 3;日= 3;如果你想為上面的日期類創(chuàng)建一個(gè)新的對(duì)象,它的初始值是1,2還是3?在創(chuàng)建對(duì)象時(shí),它會(huì)在堆中為對(duì)象分配存儲(chǔ)空間,然后將分配空間的所有內(nèi)容設(shè)置為默認(rèn)初始值0,然后用定義成員變量時(shí)的值初始化成員變量,然后執(zhí)行實(shí)例語句塊,最后執(zhí)行構(gòu)造方法。因此,上述示例的初始最終值為3。
靜態(tài)成員變量的初始化我們前面提到的是非靜態(tài)成員變量的初始化。我們知道有一類成員變量是用靜態(tài)修飾的,這類成員變量是獨(dú)立于對(duì)象的。那么如何初始化這類變量呢?首先要明確一點(diǎn),靜態(tài)成員變量的存儲(chǔ)空間與該類的任何對(duì)象都沒有關(guān)聯(lián),它們的存儲(chǔ)空間是獨(dú)立的。由此,我們可以得出兩個(gè)結(jié)論。首先,靜態(tài)成員變量的值只能初始化一次。其次,靜態(tài)成員變量的值不能在構(gòu)造函數(shù)中初始化(因?yàn)閯?chuàng)建對(duì)象時(shí)會(huì)調(diào)用構(gòu)造函數(shù))。那么如何初始化一個(gè)靜態(tài)成員變量呢?有兩種方法:
就像初始化非靜態(tài)成員變量一樣,直接把初始化賦給靜態(tài)成員變量。值,如:public class test { public static int first = 1;public static int second = 2;}二、使用靜態(tài)語句塊,如下:public class test { public static int first;public static int秒;//下面的語句是靜態(tài)語句塊,不能放在方法體static { first = 1;秒= 2;}}在一個(gè)類中,可以出現(xiàn)多個(gè)靜態(tài)語句塊,這些語句塊按順序執(zhí)行。
靜態(tài)成員變量的初始化發(fā)生在第一次使用該成員變量時(shí),然后該成員變量將不會(huì)被重復(fù)初始化。而且類中靜態(tài)成員變量的初始化發(fā)生在非靜態(tài)成員變量初始化之前,所以下面這段代碼不合適:public class test { public int first = 1;公共靜態(tài)int second = first類定義java中的成員可以包含類中的兩種成員:實(shí)例成員和類成員。
實(shí)例成員實(shí)例成員(包括實(shí)例成員變量和實(shí)例方法)屬于對(duì)象,通過引用訪問:引用變量,實(shí)例成員名稱;定義類時(shí),如果成員沒有被static修改,那么定義的成員就是實(shí)例成員,比如:int i = 10void f{…}實(shí)例成員的存儲(chǔ)分配通常,類只是描述,存儲(chǔ)空間是通過使用new分配給對(duì)象的。未被static修改的成員是對(duì)象的一部分,因此此類實(shí)例成員的存儲(chǔ)分配與對(duì)象的分配一起分配。比如:類t { int i;void f{}} .。。t t1,t2;t1 =新t;t2 =新t;那么這個(gè)時(shí)候我有兩個(gè)副本,一個(gè)在t1,一個(gè)在t2。類成員(包括類成員變量和類方法)通過t1.i和t2.i屬于類,可以通過類名或引用訪問:類名。類成員名稱;定義類時(shí),如果成員被static修改,那么定義的成員就是類成員,比如:static int count = 0;static之前的public static void main(string args[]){…}類成員的存儲(chǔ)分配用于成員變量,無論有多少個(gè)對(duì)象,成員變量只保留一個(gè)公共存儲(chǔ),稱為類變量(static variables);如果你用靜態(tài)來修飾一個(gè)方法,這個(gè)方法叫做類方法(靜態(tài)方法),那么當(dāng)你調(diào)用靜態(tài)方法的時(shí)候,方法不依賴于具體的對(duì)象,也就是你可以調(diào)用一個(gè)方法。而不創(chuàng)建對(duì)象。對(duì)于類成員的使用,可以使用類名,也可以通過引用使用,比如:class t { static int i = 47靜態(tài)void f{ i;}}。。。t t1,t2;t1 =新t;t2 =新t;此時(shí)i只有一個(gè)副本,被t1.i和t2.i使用,也可以被t.i引用,其值都是47。在t.i .的實(shí)施中;t1.i和t2.i的值都是48;對(duì)f的調(diào)用可以以t1.f的形式進(jìn)行;也可以用t . f;使用方法。根據(jù)java編程規(guī)范,我們建議只對(duì)靜態(tài)成員使用類名引用。類成員和實(shí)例成員總結(jié)當(dāng)你使用static時(shí),意味著這個(gè)成員變量或方法不依賴于這個(gè)類的任何對(duì)象,所以你可以使用這個(gè)靜態(tài)數(shù)據(jù)或方法,而不需要?jiǎng)?chuàng)建對(duì)象。對(duì)于非靜態(tài)數(shù)據(jù)和方法,您必須創(chuàng)建一個(gè)對(duì)象,然后使用它來操作非靜態(tài)數(shù)據(jù)和方法。因此,因?yàn)殪o態(tài)方法不需要?jiǎng)?chuàng)建對(duì)象,所以靜態(tài)方法不能直接訪問非靜態(tài)成員。非靜態(tài)方法可以直接調(diào)用靜態(tài)成員公共類test { static int i = 0;int j = 10靜態(tài)void f{ i;} void s{ f;j;} public static void main(string[]args){ test t = new test;t . s;system . out . println(i);}}static的一個(gè)重要應(yīng)用就是調(diào)用方法而不創(chuàng)建對(duì)象。比如在定義類的時(shí)候,main將personality定義為非static,將generality定義為staticthis。在java中,我們經(jīng)常會(huì)看到這個(gè)關(guān)鍵字的使用。它用于兩種場(chǎng)合:
這是作為引用來引用自己的,每個(gè)對(duì)象都有一個(gè)this。在類的成員方法中,這用于指示該對(duì)象中方法或變量的使用。如果不會(huì)引起歧義,可以省略。例如,在上面的一系列setter方法中,因?yàn)閰?shù)與成員變量同名,為了表示區(qū)別,這個(gè)成員變量之前不能省略。
這不能在靜態(tài)方法中使用。因?yàn)殪o態(tài)方法的執(zhí)行根本不需要java對(duì)象的存在,而是通過使用類名直接訪問。方法,這表示當(dāng)前對(duì)象,因此這根本不能用于靜態(tài)方法。
這可以用在構(gòu)造函數(shù)中,以及這個(gè)類中的其他構(gòu)造函數(shù)中到
語法:this([argument]);函數(shù):在一個(gè)構(gòu)造函數(shù)中調(diào)用另一個(gè)構(gòu)造函數(shù)。目的:代碼重用。this (argument):它必須是構(gòu)造函數(shù)中執(zhí)行的第一條語句,并且只能調(diào)用一次。讓 讓我們閱讀下面的代碼。
公共類flower { int petal count = 0;string s =新字符串( 零 );flower(int petals){ petal count = petals;system . out . println( 只有int arg的構(gòu)造函數(shù),petalcount = petal count);} flower(string ss){ system . out . println( 只有字符串參數(shù)的構(gòu)造函數(shù),s = ss);s = ss}flower(string s,int petals){ this(petals);//調(diào)用flower(花瓣),但是不能寫flower(花瓣)//!這(些);//can ;不要叫兩個(gè)!this.s = s//這是使用這個(gè)系統(tǒng)的另一種。out . println( 字符串標(biāo)記和);} flower{ this( 嗨 , 47);system . out . println( 默認(rèn)構(gòu)造函數(shù)(無參數(shù)));}void print {//!這(11);//不在非構(gòu)造函數(shù)內(nèi)部!system . out . println( petalcount = petalcount s = s);} public static void main(string[]args){ flower x = new flower;x . print;} }///: ~私有構(gòu)造函數(shù)也可以有public之類的修飾符,在構(gòu)造方法之前限制構(gòu)造函數(shù)的訪問權(quán)限。通常,如果類是公共的,構(gòu)造函數(shù)也是公共的,因此可以通過new調(diào)用它。那么,如果構(gòu)造函數(shù)前面用private修飾會(huì)怎么樣呢?我們可以 不要在類外生成該類的對(duì)象??梢宰约篹cho1-@q。q.com,請(qǐng)。
這是否意味著私人可以 不能用在構(gòu)造函數(shù)的前面?當(dāng)然,這是一個(gè)非常有用的情況。在某些情況下,某些類在系統(tǒng)中只能有該類的一個(gè)實(shí)例(對(duì)象)。這時(shí),我們可以將這個(gè)類的構(gòu)造函數(shù)定義為private。示例代碼如下:
public class handler {//handler變量用來保存這個(gè)類對(duì)象的引用;私有靜態(tài)handlerhandler = nullprivate handler{/* set something here */}/該類的對(duì)象只能通過gethandler方法從私有變量handler中獲取公共靜態(tài)gethandler(/* arglist */){//如果handler的值不為空,則說明該類的對(duì)象在系統(tǒng)中已經(jīng)存在,可以直接取出,不會(huì)再生成,這樣就保證了singleton if(!handler)handler = new handler;返回處理程序;} public static void main(string args[]){ handler . gethandler;}}最后一篇文章來自官方賬號(hào)【編程攻略】。更多java學(xué)習(xí)資料見【編程攻略】。
標(biāo)簽:
可變成員
了解更多java面向?qū)ο罄碚摶A(chǔ)(java面向?qū)ο蠡A(chǔ)知識(shí)點(diǎn))相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。