成都 商業(yè)網(wǎng)站建設(shè)app網(wǎng)絡(luò)推廣公司
目錄
1.類和對(duì)象
2.this指針
3.對(duì)象的構(gòu)造和初始化
3.1默認(rèn)初始化
3.2就地初始化
3.3構(gòu)造初始化
3.4IDEA快速填充
3.5使用this簡(jiǎn)化
3.6初始化的總結(jié)
4.包的引入
4.1包的概念
4.2導(dǎo)入包中的類
4.3自定義包
5.static修飾
6.代碼塊的劃分
7.方法重寫
1.類和對(duì)象
使用對(duì)象的引用加上點(diǎn)號(hào)就可以對(duì)于這個(gè)屬性進(jìn)行訪問;
我們首先是需要定義一個(gè)類,這個(gè)對(duì)象實(shí)際上就是類的實(shí)例化,我們可以把這個(gè)類理解為我們的建筑圖紙,對(duì)象就是依據(jù)這個(gè)圖紙建設(shè)出來的高樓大廈,對(duì)于這個(gè)類里面的成員變量和成員函數(shù),我們的這個(gè)實(shí)例化的對(duì)象里面都是有的;就如同我們的這個(gè)圖紙里面有的內(nèi)容,我們的這個(gè)高樓大廈里面也是包含的,因?yàn)槲覀兊倪@個(gè)高樓大廈就是依據(jù)這個(gè)圖紙建設(shè)的啊;
我們對(duì)象加上點(diǎn)就表示這個(gè)對(duì)象的這個(gè)屬性值,new就是進(jìn)行類的實(shí)例化的過程,一個(gè)類是可以實(shí)例化多個(gè)對(duì)象的,每一個(gè)對(duì)象,包含相同的屬性和方法;
2.this指針
我們的這個(gè)this指針是怎么引出來的呢,就是我們的這個(gè)形參的名字和我們的成員變量的名字是一樣的時(shí)候,我們的this指針就指向當(dāng)前的這個(gè)對(duì)象,我們的下面的這個(gè)是一個(gè)日期的類;
this.yaer表示的就是這個(gè)對(duì)象的year成員變量,year就是這個(gè)里面的傳遞過來的形參,這個(gè)就可以區(qū)分我們的形參和成員變量;
當(dāng)然,如果我們的形參和成員變量的名字不一樣的時(shí)候,我們這個(gè)時(shí)候是很容易進(jìn)行區(qū)分的,因此這個(gè)時(shí)候我們就可以不寫這個(gè)this指針,而且實(shí)際情況下,我們大部分情況下都不會(huì)寫這個(gè)this指針,因?yàn)橐话阄覀兊男螀⒑统蓡T變量不會(huì)一樣,當(dāng)然即使是我們不寫,這個(gè)this指針也是存在的;
3.對(duì)象的構(gòu)造和初始化
3.1默認(rèn)初始化
這個(gè)就是直接來一個(gè)和我們的類名字一樣的函數(shù),就是構(gòu)造函數(shù),這個(gè)可以顯示的寫出來,也可以不寫,但是即使我們不寫出來,創(chuàng)建對(duì)象的時(shí)候這個(gè)構(gòu)造函數(shù)也是會(huì)被調(diào)用的;
這個(gè)時(shí)候我們的int就會(huì)被默認(rèn)初始化為0,bollean類型的數(shù)據(jù)會(huì)被默認(rèn)初始化為false,這個(gè)都是默認(rèn)的操作,如果我們不進(jìn)行任何的干預(yù);
3.2就地初始化
就是我們?cè)趧?chuàng)建對(duì)象的時(shí)候進(jìn)行初始化,這個(gè)就是創(chuàng)建對(duì)象的同時(shí)進(jìn)行初始化,我們把這個(gè)叫做就地初始化;
3.3構(gòu)造初始化
構(gòu)造的時(shí)候賦值,這個(gè)相當(dāng)于C++里面的這個(gè)自定義構(gòu)造函數(shù),本質(zhì)都是一樣的;
這個(gè)和上面的區(qū)別就是我們的就地初始化就是在定義成員變量的時(shí)候進(jìn)行初始化,構(gòu)造初始化是在寫構(gòu)造函數(shù)的時(shí)候進(jìn)行初始化;
3.4IDEA快速填充
按照下面的這個(gè)步驟,我們就可以快速的構(gòu)建出來帶參數(shù)的構(gòu)造函數(shù),最后一不會(huì)讓我們選擇這個(gè)函數(shù)有幾個(gè)參數(shù):我們可以選一個(gè),也可以選多個(gè),因?yàn)檫@個(gè)構(gòu)造函數(shù)也是函數(shù),也是支持這個(gè)重載的;
3.5使用this簡(jiǎn)化
這個(gè)的意思:我們的下面是有一個(gè)無參數(shù)的構(gòu)造函數(shù)和一個(gè)有三個(gè)參數(shù)的構(gòu)造函數(shù),這個(gè)時(shí)候,我們?cè)谶@個(gè)無參的構(gòu)造函數(shù)里面,就可以使用這個(gè)this(1900,1,1)相當(dāng)于就是去調(diào)用這個(gè)有參的構(gòu)造函數(shù)進(jìn)行初始化;
這個(gè)前提是我們的這個(gè)無參的構(gòu)造函數(shù)里面如果是有多行代碼,我們的這個(gè)thsi的這一行必須寫在第一行,否則就會(huì)報(bào)錯(cuò);
第二個(gè)就是我們的有參函數(shù)和無參函數(shù)不可以成環(huán),就是本來我已經(jīng)調(diào)用你了,然后你又調(diào)用我,這個(gè)就是成環(huán),這個(gè)也是不被允許的;
下面的這個(gè)代碼就是對(duì)于上面的這個(gè)進(jìn)行進(jìn)一步說明,兩個(gè)函數(shù)的調(diào)用形成了遞歸調(diào)用,這個(gè)時(shí)候就會(huì)報(bào)錯(cuò);
3.6初始化的總結(jié)
其實(shí)上面的這個(gè)什么默認(rèn)初始化。就地初始化都是分出來的,其實(shí)沒有必要搞得這么多的類型,我們就只需要知道這個(gè)默認(rèn)的構(gòu)造函數(shù),以及我們可以寫參數(shù)的自定義構(gòu)造函數(shù);
因?yàn)閷W(xué)習(xí)過這個(gè)C++里面的這個(gè)類和對(duì)象,因此這個(gè)里面并不難理解,因?yàn)閮蓚€(gè)的核心思想就是一樣的,我們只需要進(jìn)行遷移即可;
4.包的引入
4.1包的概念
包的全稱叫做軟件包,是為了讓我們程序猿更好的對(duì)于創(chuàng)建的類進(jìn)行管理;
包的這個(gè)機(jī)制很好的體現(xiàn)了我們的類和對(duì)象的封裝性,我們可以通過這個(gè)包實(shí)現(xiàn)對(duì)于類和接口的組織和管理;
4.2導(dǎo)入包中的類
下面的是兩個(gè)導(dǎo)入包里面的類的方法,但是第一種會(huì)更加繁瑣一些,第二個(gè)更加簡(jiǎn)單一些:
第一個(gè)就是上面的這個(gè)樣子的,我們直接指出來我們要導(dǎo)入的類屬于哪個(gè)包里面。上面導(dǎo)入的這個(gè)Date這個(gè)類就是屬于我們的java.util這個(gè)包里面,但是這樣寫比較繁瑣,因?yàn)槲覀兠恳淮问褂枚家亚懊娴倪@個(gè)包的名字寫一遍,因此我們可以使用下面的這個(gè)import寫法:
下面的這個(gè)import就是我們?cè)诘谝恍兄苯又赋鰜磉@個(gè)類屬于那個(gè)包,這樣再類里面我們就可以直接使用了;
如果想要導(dǎo)入這個(gè)java.util的其他的類,這個(gè)時(shí)候我們就可以使用*這個(gè)方法:
?這個(gè)*實(shí)際上就是一個(gè)通配符,這個(gè)通配符表示的是所有,例如我們之前學(xué)習(xí)這個(gè)sql語句的時(shí)候從這個(gè)表里面選擇所有的內(nèi)容,這個(gè)時(shí)候就是select * from之類的這個(gè)語句,在我們學(xué)習(xí)這個(gè)linux的時(shí)候,想要從一個(gè)很大的文件系統(tǒng)里面對(duì)于這個(gè)文件里面進(jìn)行篩選,這個(gè)時(shí)候使用*.txt表示的就是所有的以txt結(jié)尾的文件,這個(gè)也是相同的用法;熟悉git的朋友可能就更清楚了,這個(gè)git里面有一個(gè)gitignore文件,這個(gè)文件里面內(nèi)容就是用來,對(duì)于我們上傳的文件進(jìn)行篩選的,這個(gè)文件我們可以修改的,例如這個(gè).mlx文件就是一類文件,這類文件就會(huì)在上傳的時(shí)候被過濾掉;
雖然這個(gè)*可以省去很多的問題,但是我們還是建議直接指定,下面的這個(gè)就是使用*出現(xiàn)的一個(gè)問題(兩個(gè)類的名字沖突,該如何進(jìn)行選擇)
上面的這個(gè)編譯報(bào)錯(cuò)就是因?yàn)槲覀兊倪@個(gè)兩個(gè)包里面都是有這個(gè)date這個(gè)類的,因此在進(jìn)行導(dǎo)入的時(shí)候,他就不知道我們程序猿到底想要導(dǎo)入哪一個(gè)類,因此這個(gè)就會(huì)出現(xiàn)報(bào)錯(cuò)的情況,我們?nèi)绻胍鉀Q這個(gè)報(bào)錯(cuò),我們就可以使用這個(gè)具體的:就是進(jìn)行import之后,我們用到的時(shí)候進(jìn)行具體的指定,這個(gè)就不會(huì)報(bào)錯(cuò)(如下圖所示)
4.3自定義包
我上面創(chuàng)建的這個(gè)包是分層顯示的,就是類似于一個(gè)樹狀的結(jié)構(gòu)。但是最開始這個(gè)系統(tǒng)默認(rèn)的這個(gè)設(shè)置可能就不是這個(gè)樣子的,因?yàn)槲覀兊倪@個(gè)自定義包實(shí)際上會(huì)在這個(gè)我們的電腦的這個(gè)文件夾里面進(jìn)行創(chuàng)建,我們點(diǎn)擊這個(gè)package之后,我們就寫這個(gè)com.baidu.www,實(shí)際上這個(gè)就是一個(gè)文件之間的包含的關(guān)系,就是這個(gè)com文件夾里面有一個(gè)baidu的文件夾,baidu文件夾里面有一個(gè)www文件夾;
如果使用這個(gè)默認(rèn)的IDEA設(shè)置,這個(gè)里面的com,baidu,www的層架結(jié)構(gòu)可能就不會(huì)顯示出來,我們可以按照下面的這個(gè)步驟把對(duì)應(yīng)的這個(gè)勾選取消掉,就是這個(gè)compact middle packages這個(gè),他的這個(gè)原來的是勾選上的,我們把這個(gè)取消掉,這個(gè)時(shí)候我們的com,baidu,www就是像樹狀一樣進(jìn)行顯示的;
如果想要查看這個(gè)具體的文件層級(jí)結(jié)構(gòu),我們可以按照下面的這個(gè)方式進(jìn)行查看,這樣我們就可以真正的在自己的這個(gè)電腦的文件夾里面看到我們呢的自定義的包包;
包的層級(jí)結(jié)構(gòu):我們需要知道這個(gè)包的層結(jié)結(jié)構(gòu),即使是我們的自定義的包,這個(gè)也是有自己的層級(jí)結(jié)構(gòu)的,像下面的這個(gè)www就是和test3,test4同屬以一個(gè)級(jí)別的,就是這三個(gè)都是屬于baidu這個(gè)包里面的,但是我們的這個(gè)test,test2就是屬于com.baidu.www這個(gè)包里面的,因此,他們的這個(gè)范圍是不一樣的;
下面的這個(gè)string brand這個(gè)沒有任何的權(quán)限設(shè)置,但是這個(gè)屬于我們的test包,因此這個(gè)可以在自己的這個(gè)類里面進(jìn)行訪問,像這個(gè)test3,test4都是無法進(jìn)行訪問的,這個(gè)就是包的訪問權(quán)限(在自己的這個(gè)包里面的類可以訪問,其他的不可以訪問,不同的包里面的類的名字可以不一樣,這個(gè)就是C++里面的這個(gè)命名空間,兩個(gè)就是一個(gè)意思,本質(zhì)沒有差別)
我們可以使用下面的方式驗(yàn)證上面的結(jié)論:我們?cè)赽aidu這個(gè)目錄下面建立一個(gè)test類,這個(gè)時(shí)候不會(huì)報(bào)錯(cuò),但是我們?cè)谶@個(gè)www下面去建立一個(gè)類,這個(gè)時(shí)候就會(huì)報(bào)錯(cuò),這個(gè)就是包的作用域的限制導(dǎo)致的,不同的包里面的這個(gè)類的名字可以一樣,但是一個(gè)包里面的名字不可以是一樣的;
5.static修飾
這個(gè)其實(shí)不難理解:
static修飾成員變量:這個(gè)成員變量屬于類域的,不是某一個(gè)對(duì)象的,而是創(chuàng)建類的時(shí)候就存在了,這個(gè)成員變量就是共有的;
static修飾成員方法:這個(gè)成員方法也是屬于這個(gè)類的,不依賴于任何一個(gè)對(duì)象而存在;
static修飾的靜態(tài)成員方法里面不可以使用我們的非靜態(tài)成員變量;
也不可以使用我們的非靜態(tài)的成員方法(因?yàn)榉庆o態(tài)方法有this指針,但是我們的static修飾的方法沒有this指針)
6.代碼塊的劃分
下面的這個(gè)就是一個(gè)普通的代碼塊:
下面的這個(gè)是另外的兩個(gè)類型:實(shí)例化代碼塊和靜態(tài)代碼塊,其中兩個(gè)的區(qū)別就是靜態(tài)的代碼塊的前面加上我們的關(guān)鍵字static;
實(shí)例化代碼塊只有在我們創(chuàng)建對(duì)象的時(shí)候才會(huì)被執(zhí)行,靜態(tài)代碼塊:無論我們創(chuàng)建多少個(gè)對(duì)象,我們的這個(gè)靜態(tài)的代碼塊只會(huì)被執(zhí)行一次,如果一個(gè)類里面有多個(gè)靜態(tài)的代碼塊,這個(gè)時(shí)候就會(huì)按照這個(gè)先后順序依次執(zhí)行;
7.方法重寫
就是我們自己創(chuàng)建一個(gè)對(duì)象,我們想要打印這個(gè)對(duì)象的相關(guān)的屬性內(nèi)容,這個(gè)時(shí)候就可以使用一下對(duì)于方法的重寫;
下面的這個(gè)就是我們的類的相關(guān)的信息:
接著我們調(diào)用自定義構(gòu)造函數(shù):創(chuàng)建一個(gè)對(duì)象,想要打印這個(gè)對(duì)象;
下面的這個(gè)是一個(gè)調(diào)用的過程(這個(gè)和我們上面使用的案例不一樣,但是這個(gè)調(diào)用的過程是一樣的,因此這個(gè)時(shí)候,我們可以看到這個(gè)最后是走到了這個(gè)toString這個(gè)位置,但是打印的結(jié)果卻是一個(gè)類的全路徑名+@+一個(gè)地址,我們想要的是這個(gè)相關(guān)的屬性,這個(gè)時(shí)候,我們就可以進(jìn)行方法的重寫,重寫的方法就是我們的toString方法)
我們可以通過下面的方式進(jìn)行重寫,這個(gè)不需要我們自己寫:
下面的這個(gè)操作是在我們的類的文件進(jìn)行的;首先右鍵,找到generate,然后選擇這個(gè)toString這個(gè)方法,然后把這個(gè)里面所有的成員變量全部勾選(這個(gè)第三個(gè)步驟可能會(huì)不一樣,因?yàn)檫@個(gè)具體取決于我們的成員變量的數(shù)量);
然后我們就可以看到我們的這個(gè)tostring方法已經(jīng)被重寫了,這個(gè)已經(jīng)寫在我們的這個(gè)類里面去,這個(gè)時(shí)候我們?cè)俅螆?zhí)行,這個(gè)就會(huì)調(diào)用我們重寫的這個(gè)方法,override表示的就是這個(gè)方法是被重寫的,打印結(jié)果就是相關(guān)的這個(gè)對(duì)象的屬性信息;