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