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