您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java的類和對象知識點詳解”,在日常操作中,相信很多人在Java的類和對象知識點詳解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java的類和對象知識點詳解”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
五丶封裝
(1)包的概念與創(chuàng)建
1>概念
2>創(chuàng)建
(2)包的使用–導(dǎo)入包
(3)封裝定義–權(quán)限控制訪問
(4)補(bǔ)充些常用的包(小拓展)
六丶關(guān)于static成員
(1)修飾成員變量–區(qū)分成員丶靜態(tài)成員變量
(2)修飾成員方法–調(diào)用私有變量
(3)訪問私有屬性
七丶代碼塊
(1)普通代碼塊
(2)構(gòu)造代碼塊
(3)靜態(tài)代碼塊
在我們的電腦上有許多的文件,我們?yōu)榱朔奖愎芾?,大致給它們進(jìn)行了不同的命名。
然后在不同的文件夾下面再給它們進(jìn)行了具體的劃分,比如我自己的音樂里面對于音樂人的劃分:許嵩,周杰倫,薛之謙…
然后每個人對應(yīng)的文件夾下面就是他們自己的歌。
在JAVA中,對于項目的管理也是一樣的道理。
JAVA中我們有不同的項目,就像我們對于自己電腦文件的大致分類:音樂項目,視頻項目,桌面項目等。
在不同的項目底下,我們又有了不同的劃分----包,就相當(dāng)于我們在音樂大文件夾下對歌手進(jìn)行了劃分:周杰倫包,許嵩包,薛之謙包。
在不同的包下,我們又有了區(qū)分—類,比如許嵩包里:《斷橋殘雪》類,《多余的妹妹》類,《天龍八部之宿敵》類等等。
具體圖示如下:
那么,接著給出具體定義:
多個類收集在一起成為一組,稱為軟件包
那么接下來我們創(chuàng)建一個包,打開IDEA,右鍵src --> new --> package
然后對于接下來彈出一下窗口,我們給這個包命名為TestPackage
平常的代碼中,我們能遇到很多要求,比如要求我們求一個數(shù)的平方根,比如我們要得到一個時間,或者我們需要用到數(shù)組的排序等等等等,但是像這些東西JAVA中已經(jīng)有了具體的類來幫助我們實現(xiàn)。
這里我舉一個例子,比如我們要得到一個時間,可以使用 java.util.Date 導(dǎo)入 java.util 這個包中的Date類,但是怎么導(dǎo)入呢?這里提供三種方法;
1.對象創(chuàng)建之初進(jìn)行導(dǎo)入
public class TestPackage { public static void main(String[] args) { java.util.Date d1 = new java.util.Date();//看這里 System.out.println(d1.getTime()); }
優(yōu)點:精確程度很高,很大程度避免沖突。
缺點:無疑很大程度的增加了代碼的復(fù)雜程度,所以不推薦
2.在代碼開頭使用import java.util.*(意味著使用util這個包下所有的類)
import java.util.*; //看這里 public class TestPackage { public static void main(String[] args) { Date d1 = new Date(); System.out.println(d1.getTime()); } }
優(yōu)點:使用及其方便
缺點:可能會產(chǎn)生沖突,如下圖:
此時無法分辨這個Date類是util下的類還是sql下的類,那么怎樣解決呢?也很簡單,將這個*換成指定的類就好,并且支持此類情況導(dǎo)入
3.靜態(tài)導(dǎo)入(前面加static)
import static java.lang.Math.*; public class TestPackage { public static void main(String[] args) { System.out.println(sqrt(100)); System.out.println(max(1,2)); } }
有了前面兩個的基礎(chǔ),那么就有一個問題我們需要考慮一下,如果一個類提供了模板,那么能在另外一個類中創(chuàng)建對應(yīng)的對象
并且訪問這個類的一些屬性嘛?我們怎樣知道它能不能創(chuàng)建并且訪問呢?先給第二個答案的模板:
看一個類以及它的屬性和方法能不能被其他類訪問或者使用那么就要看它的權(quán)限修飾符了,如果修飾符給的權(quán)限允許,那么當(dāng)然可以訪問。我們在同一個包下創(chuàng)建Student類和Stedent的測試類,進(jìn)行對應(yīng)的測試:
可以看到,當(dāng)權(quán)限修飾符不同時,能否被訪問的情況也截然不同,其中private修飾符修飾的變量不僅不能被IDEA提示出來,如果強(qiáng)行打印還會報錯。 這就是一種封裝!
下面給出封裝的具體定義:
一個對象隱藏自己的部分屬性和實現(xiàn)細(xì)節(jié),對于內(nèi)部數(shù)據(jù)的訪問只能通過對外公開的接口,通過這種方式,對象對于內(nèi)部數(shù)據(jù)提供了不同級別的保護(hù),以防止部分無關(guān)意外的改變或錯誤的使用了內(nèi)部數(shù)據(jù)。
java.lang:系統(tǒng)常用基礎(chǔ)類(String、Object),此包從JDK1.1后自動導(dǎo)入。
java.lang.reflect:java 反射編程包;
java.net:進(jìn)行網(wǎng)絡(luò)編程開發(fā)包。
java.sql:進(jìn)行數(shù)據(jù)庫開發(fā)的支持包。
java.util:是java提供的工具程序包。(集合類等)
非常重要java.io:I/O編程開發(fā)包。
在Student這個學(xué)生類中,我們創(chuàng)建每一個學(xué)生對象都有自己對應(yīng)的姓名,年齡,性別。
當(dāng)這些學(xué)生在一個同一個教室上課。如果我們想知道這些學(xué)生在哪里上課,那么我們能怎么辦呢?
創(chuàng)建一個對應(yīng)的成員變量然后進(jìn)行打印嘛?好像不行,因為這個教室是公有的,不是私有的,不屬于某個具體的對象,而是屬于整體。在Student類中定義的成員變量,每個對象中都會包含一份(稱之為實例變量),因為需要使用這些信息來描述具體的學(xué)生。而現(xiàn)在要表示學(xué)生上課的教室,這個教室的屬性并不需要每個學(xué)生對象中都存儲一份,而是需要讓所有的學(xué)生來共享。
那么接下來,就給出static關(guān)鍵字的解釋:
在Java中,被static修飾的成員,稱之為靜態(tài)成員,也可以稱為類成員,其不屬于某個具體的對象,是所有對象所共享的。
Java的類中,不被static修飾的叫成員變量,被static修飾的叫做靜態(tài)成員變量。
1> 成員變量因為是對于類的對象的描述,是類的對象實例化的體現(xiàn),所以成員變量也叫實例變量。而靜態(tài)成員變量是對于類的描述,它是屬于類的,所以靜態(tài)成員變量也叫類變量
2> 成員變量與對象共存亡,他隨著對象的創(chuàng)建而存在,隨著對象被回收而銷毀。類變量與類共存亡,隨著類的加載而存在,隨著類的消失而消失。
3>成員變量存儲在堆當(dāng)中,而靜態(tài)變量比較特殊,在JDK8之前,永久代沒有取消的時候它是存在于方法區(qū)當(dāng)中,但是JDK8以后(含)它也存在于堆當(dāng)中
4>成員變量屬于對象,所以成員變量只能被對象調(diào)用。而類變量屬于類,但是對象也屬于類,所以類變量既可以被類名調(diào)用也可以被對象調(diào)用。
接著看下面的代碼,證明一下上面關(guān)于類變量的結(jié)論:
注意看紅字?。。。?!
Java的類中,不被static修飾的叫成員方法,被static修飾的叫做靜態(tài)成員方法。
.
1>成員方法是對象功能的體現(xiàn),它是屬于對象的,所以只能被對象調(diào)用,而靜態(tài)成員變量是屬于類的,是類的功能體現(xiàn),所以它可以被類名調(diào)用,也可以被對象調(diào)用
2> 靜態(tài)方法沒有隱藏的this引用參數(shù)(重點)
針對這個第二點,我們需要進(jìn)行詳細(xì)的探討。
首先是對于非靜態(tài)方法調(diào)用靜態(tài)方法,最平常的調(diào)用:
再接著對于靜態(tài)方法對于非靜態(tài)方法的調(diào)用:
因為靜態(tài)方法沒有隱藏的this引用參數(shù),所以不可以在沒有創(chuàng)建對象的前提下,訪問任何非靜態(tài)成員變量或者方法。
當(dāng)一個類的成員方法設(shè)置為私有的時候,那么外面的類如果想要進(jìn)行訪問要怎樣訪問呢?具體措施如下:
我們增加一個成員方法,然后通過這個成員方法來訪問私有成員變量。那么怎樣訪問這個成員方法呢?只有以這個類為模板創(chuàng)建一個對象,然后通過對象訪問。
那如果我就想用類名直接點呢?該怎么做?那我們應(yīng)該加static
問題一:為什么要給私有成員變量加static?
回答:因為成員變量只能通過對象來訪問,他是屬于對象的,所以如果不給私有成員變量加static的話,那么創(chuàng)建對象這一關(guān)無論如何過不去
問題二:為什么要給那個訪問私有變量的成員方法加static
回答:因為那個只有對象才能訪問成員方法,而如果是靜態(tài)方法的話,那么就可以直接通過類名來調(diào)用了。
PS:在正式寫下代碼塊之前,有一個需要注意的點想在這里給各位讀者們提一下,對于靜態(tài)成員變量的初始化,除了一開始的就地初始化,我們還能怎樣初始化呢?沒錯,就是通過代碼塊。
那么,何為代碼塊呢?
所謂代碼塊,就是使用 { } 定義的一段代碼,根據(jù)其定義的位置以及關(guān)鍵字,又可以分為一下四種。
定義在方法中的代碼塊
public class Persion { public static void main(String[] args) { { int a = 10; System.out.println(a); } int a = 100; System.out.println(a); } }
//運行結(jié)果:
a = 10;
a = 100;
在類當(dāng)中的代碼塊,不加修飾符,一般用于初始化成員變量,也叫實例代碼塊
問:既然這個構(gòu)造代碼塊也是來初始化成員變量的,那么他和構(gòu)造器有什么關(guān)聯(lián)呢?
我們繼續(xù)往下走。
可以發(fā)現(xiàn),構(gòu)造代碼塊優(yōu)先于構(gòu)造方法執(zhí)行,接下來我們打開它的class文件。
可以看到,編譯器在編譯完成的時候,把構(gòu)造代碼塊中的內(nèi)容放在了構(gòu)造方法的第一條語句之前。
使用static定義的代碼塊稱為靜態(tài)代碼塊。一般用于初始化靜態(tài)成員變量。
從這里,我們可以看出
(1)靜態(tài)代碼塊在類加載的時候才會執(zhí)行一次,與生成對象數(shù)無關(guān)
(2)實例代碼塊只有在創(chuàng)建對象時才會執(zhí)行。
到此,關(guān)于“Java的類和對象知識點詳解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。