Java養(yǎng)成計劃(打卡第18天)
JAVA SE(夯實基礎(chǔ)系列----Java初步)
今天分享一下chapter four的容易忽略的類和對象容易忽略的知識。以問答的方式來復習鞏固
一個類中可以定義多個靜態(tài)代碼塊,靜態(tài)初始化塊在類裝入并初始化時執(zhí)行一次,作用是初始化類變量(也是屬于類的)
Public Mytime();Public Mytime(int h);Public Mytime(int h, int m, int s);
this就是指代對象的,所以同一類中一個構(gòu)造方法調(diào)用另外一個構(gòu)造方法必須使用關(guān)鍵字this,但是只能調(diào)用一次,并且只能是第一行代碼, 并且一個構(gòu)造方法不能直接或間接調(diào)用自己
Public Mytime(int h, int m, int s){ this(h); ………}
類方法代碼塊是靜態(tài)的,和靜態(tài)代碼塊一樣不能使用this關(guān)鍵字,因為this就是指代實例對象的,實例方法必須實例調(diào)用
標號只需要注意一個細節(jié),那就是它是用于標記循環(huán),如果標記在循環(huán)內(nèi)部的普通語句,且下面執(zhí)行break 標記 ,那么會編譯錯誤
has-a是一種包含關(guān)系,是在另外一個類中將該類對象作為屬性,在之前博客UML中提到
對C語言有點了解就知道指針的存在,C語言里面的指針傳遞和JAVA里面的引用傳遞類似,JAVA里面的變量是在棧里面,我們創(chuàng)建new出來的對象在堆里面,變量存儲的是堆中對象內(nèi)存的首地址,這些知識在JVM里會深入講到,,講到指針就會提到動態(tài)內(nèi)存,我們?yōu)橹羔樂峙鋬?nèi)存之后在使用完指針之后若不進行free釋放操作就會出現(xiàn)一些問題,但是在多線程,共享對象的情況下,Programmer不知道什么時機釋放指針內(nèi)存,但是在JAVA里面就不需要顯釋放內(nèi)存了
在JAVA里面,對象清除由運行系統(tǒng)自動完成,稱為垃圾收集,運行系統(tǒng)自動識別出哪些對象不再使用,之后由一個叫做垃圾處理器的線程來完成, (如果不了解線程就看看之前的博客)
JAVA系統(tǒng)認為,一個程序的所有活的線程都不存在有變量去引用一個對象時,該對象就是垃圾,那失去價值了就不要讓它占用堆內(nèi)存了
Point2D pointone = new Point2D(2,3);……pointone = new Ponint2D(3,4);
Point2D pointone = new Point2D(2,3);……pointone = null;
方法體里的局部變量的生存期要短一些,當生存期過了,其引用對象就可能成為垃圾對象
那JAVA的垃圾處理線程這么?,那Programmer豈不是隨意而為了?這不可能,JAVA中還會有這種情況出現(xiàn):雖然有一個或多個變量引用某個對象,但實際上這個對象不需要,但是JAVA系統(tǒng)不會處理這個對象,那我們就要使用第二種方式將其設(shè)置為null,------所以Programmer要養(yǎng)成一個發(fā)現(xiàn)對象型變量不使用時,就將其設(shè)置為null的好習慣
這里我來舉一個栗子
Public Class Point{ ……}Public Class Test{ private Point pointone = new Point(); private static final Point pointtwo = new Point(); //這是一個(靜態(tài)的)類變量Public static void main(Stting[] args){ Test t1 = new Test(); Test t2 = new Test(); pointone = null; fun(t1); //gc ……}……public static void fun(Test u) Point pointthree = new Point(); u = null;}
這里我們分析一下就以知道我們一共創(chuàng)建了3個Point對象,其中pointone被置空了,因此滿足回收條件,還有就是fun方法里的局部變量pointthree的生存期過了,所以這里也會回收,但是系統(tǒng)還不會回收Test類對象t1,因為系統(tǒng)不能判斷是否放棄
在Java中垃圾回收線程的執(zhí)行不是固定的,它可能就算滿足條件也不回收,而等到占內(nèi)存過大才回收,有的收集器比較積極,過一段時間就會回收一次,但是有的比較消極,很久才執(zhí)行一次。我們可以使用System類的gc()方法來啟動回收線程,但是這里和多線程中所講的一樣,僅僅是讓該線程處于可執(zhí)行狀態(tài),但是否執(zhí)行由系統(tǒng)決定,可能一直都不執(zhí)行。
(這里之前分享基礎(chǔ)的時候漏掉了,現(xiàn)在將其補上)枚舉類型是一種特殊的類型,用于表示一組不變的常量,關(guān)鍵字是enum,和C是相似的
enum TrafficLight{//枚舉類型和普通的類是不一樣的,普通類使用class,但是枚舉類型使用enum RED,GREEN,YELLOW //枚舉常量,末尾不需要加分號,枚舉常量代表枚舉類型的實例,這些類型在初創(chuàng)時就裝入}//除了枚舉常量,枚舉類型不會有其他實例
枚舉常量定義時需要大寫,枚舉變量除了枚舉常量值之外還可能是null,我們調(diào)用枚舉常量,因為是靜態(tài)的,使用類名.常量名
枚舉類型編譯后也是產(chǎn)生一個.class文件,我們調(diào)用枚舉類型時: < 枚舉類型名> < 變量名>;和普通的對象引用沒有太大的區(qū)別,但是不同的就是這里不能使用new來創(chuàng)建對象,因為除了枚舉常量沒有其他實例
比較兩個枚舉常量是否相等,常使用的是 “==” ,雖然也可以使用equals();
枚舉量的比較除了直接使用if來比較之外也可以使用switch語句switch括號后的值應該是該枚舉類型變量的簡單名字,不需要再用類型名,在前面聲明
所謂嵌套枚舉類型就是在類體中定義枚舉類型,就是將其作為一個普通的塊,放在類里面,但需要注意一點:
這里我們可以舉一個簡單的例子來說明枚舉類型
package ThirdChapter;public class EnumTraffic { private enum TrafficLight{ RED,GREEN,YELLOW } public static void dirveRule(TrafficLight lightcolor) { switch(lightcolor) { case RED: System.out.println("Stop now,it"s red"); break; case GREEN: System.out.println("GO,it"s green"); break;//不加break就可能多執(zhí)行下面的default default: System.out.println("Ready to go,it"s yellow"); break; } } public static void main(String[] args) { TrafficLight lightcolor = TrafficLight.GREEN;//這里就是之前的靜態(tài)變量的引用 dirveRule(lightcolor); }}
這里我們就將枚舉類型和switch一起使用了,這里是代碼比較簡單,如果復雜一些就不能無腦if-else或者switch,應該使用Strategy模式,上次介紹的比較簡單,之后會再詳細講解一下
枚舉類型不能繼承,因為都隱式繼承了java.lang.Enum抽象類,因為java沒有多繼承,所以就不能擴展(繼承)其他類
Enum類中有幾種行為方法
舉個例子,遍歷輸出所有枚舉常量
private enum Week{ MON,TUS,WES,THR,FRI,SAT,SUN } public static void main(String[] args) { Week[] w = Week.values(); for(Week s:w) { System.out.println(s.ordinal() +":"+ s.name()); } }
這里既然是一個數(shù)組,那么就可以使用for-each循環(huán)
在枚舉類型中,除了枚舉常量列表,還可以定義構(gòu)造方法,成員變量和方法等成分,枚舉常量列表應該以分號結(jié)尾,其他語法成分在其后面, 當創(chuàng)建枚舉類型的對象時,運行系統(tǒng)會調(diào)用相應的構(gòu)造方法,如果沒有顯式的構(gòu)造方法,系統(tǒng)會默認一個無參的構(gòu)造方法
枚舉常量可以包含一個實參列表,如RED(2),在枚舉類型中,如果定義有帶實參的枚舉常量,那么就應該有相應的帶形參的構(gòu)造方法,否則將引發(fā)編譯錯,當創(chuàng)建帶實參的枚舉常量對象時,運行系統(tǒng)會將各自的實參傳遞給相應的形參。
在枚舉類型中,自定義成員變量不能和枚舉常量重名,自定義方法不能和繼承的方法相沖
接下來舉一個例子就是輸出一周七天
private enum Week{ MON("星期一"),TUS("星期二"),WES("星期三"),THR("星期四"),FRI("星期五"),SAT("星期六"),SUN("星期日");//必須要有相應的帶形參的構(gòu)造方法 private String description; private Week(String description) {//枚舉類型的構(gòu)造方法只能時private的,否則會報錯 this.description = description; } @Override public String toString() { return description; } } public static void main(String[] args) { Week[] w = Week.values(); for(Week s:w) {//.ordinal()為返回枚舉常量的序號,name是返回其常量名稱,重寫toString方法可以返回其參數(shù)列表中的字符串 System.out.println(s.toString() +":"+ s.name()); } }
運行結(jié)果
星期一:MON
星期二:TUS
星期三:WES
星期四:THR
星期五:FRI
星期六:SAT
星期日:SUN
??,今天的分享就到這里,這是Second round review,所以進度就非??欤杜e和回收進程說的要多一些,我們學完之后一定要能夠綜合利用MVC,singleton ,strategy,decorator,factory模式,利用容器,綜合利用繼承與多態(tài),封裝不同的類,運用界面編程和反射機制(異常處理使用軟件就可以自動進行,但是還是要自己會處理),同時運用IO完成一個復雜的功能強大的小程序。要能夠?qū)崿F(xiàn)對user隱藏代碼,只在界面上操作,還要掌握debug的能力,,,,這是學完java SE的初級人員所應該具備的能力~~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/121408.html
摘要:中的詳解必修個多線程問題總結(jié)個多線程問題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開源的運行原理從虛擬機工作流程看運行原理。 自己實現(xiàn)集合框架 (三): 單鏈表的實現(xiàn) 自己實現(xiàn)集合框架 (三): 單鏈表的實現(xiàn) 基于 POI 封裝 ExcelUtil 精簡的 Excel 導入導出 由于 poi 本身只是針對于 ...
摘要:結(jié)構(gòu)體也可以包含結(jié)構(gòu)體,就像內(nèi)部類訪問結(jié)構(gòu)的屬性和一樣。。我覺得這個需要學下數(shù)據(jù)結(jié)構(gòu)才能更好理解給數(shù)據(jù)類型起一個新名字則可以通過對于結(jié)構(gòu)體我可以這樣再通過變量名就可以簡便的聲明結(jié)構(gòu)體變量。文件暫時過了一遍預處理器頭文件就是擴展名為的文件。 ...
摘要:總結(jié)我們主要介紹到了以下幾種方式實現(xiàn)單例模式餓漢方式線程安全懶漢式非線程安全和關(guān)鍵字線程安全版本懶漢式雙重檢查加鎖版本枚舉方式參考設(shè)計模式中文版第二版設(shè)計模式深入理解單例模式我是一個以架構(gòu)師為年之內(nèi)目標的小小白。 初遇設(shè)計模式在上個寒假,當時把每個設(shè)計模式過了一遍,對設(shè)計模式有了一個最初級的了解。這個學期借了幾本設(shè)計模式的書籍看,聽了老師的設(shè)計模式課,對設(shè)計模式算是有個更進一步的認識。...
摘要:,,面向切面編程。,切點,切面匹配連接點的點,一般與切點表達式相關(guān),就是切面如何切點。例子中,注解就是切點表達式,匹配對應的連接點,通知,指在切面的某個特定的連接點上執(zhí)行的動作。,織入,將作用在的過程。因為源碼都是英文寫的。 之前《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》詳細講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動態(tài)代理嗎?看這篇就夠了》介紹了下...
摘要:供應商和經(jīng)銷商之間可以在線實時地提交訂單查詢產(chǎn)品供應和庫存狀況并獲得市場銷售信息及客戶支持,實現(xiàn)了供應商與經(jīng)銷商之間端到端的供應鏈管理,有效地縮短了供銷鏈。近期太多同學找我解惑,我經(jīng)常勸大家不要過度焦慮,放平常心,其實我剛畢業(yè)時超級菜 B 的(放到今天工作都找不到那種),總結(jié)下來就是前面的 職場瓶頸:2~4 年前端走出離職困境與舒適區(qū) 的這些文章,于是我把剛?cè)胄性?ITEye 寫的文章,統(tǒng)...
閱讀 931·2021-11-22 13:54
閱讀 2861·2021-09-28 09:36
閱讀 2996·2019-08-30 15:55
閱讀 1965·2019-08-30 15:44
閱讀 558·2019-08-29 12:31
閱讀 2575·2019-08-28 18:18
閱讀 1212·2019-08-26 13:58
閱讀 1398·2019-08-26 13:44