【設計模式學習筆記】工廠模式
資料型別:
Java有哪些資料型別
定義:Java語言是強型別語言,對於每一種資料都定義了明確的具體的資料類 型,在記憶體中分配了不同大小的記憶體空間。
基本資料型別
- 數值型
整數型別(byte,short,int,long)
浮點型別(float,double) - 字元型(char)
- 布林型(boolean)
引用資料型別
- 類(class)
- 介面(interface)
- 陣列([])
Java基本資料型別圖
switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。從 Java5 開始,Java 中引入了列舉型別,expr 也可以是 enum 型別,從 Java 7 開始,expr 還可以是字串(String),但是長整型(long)在目前所有的版 本中都是不可以的。
用最有效率的方法計算 2 乘以 8
用最有效率的方法計算 2 乘以 8。
Math.round(11.5) 等於多少?Math.round(-11.5) 等於多少
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍 五入的原理是在引數上加0.5 然後進行下取整。
loat f=3.4;是否正確
不正確。3.4 是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於 下轉型(down-casting,也稱為窄化)會造成精度損失,因此需要強制型別轉 換float f =(float)3.4; 或者寫成 float f =3.4F。
short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯
對於 short s1 = 1; s1 = s1 + 1;由於 1 是 int 型別,因此 s1+1 運算結果也是 int型,需要強制轉換型別才能賦值給 short 型。 而 short s1 = 1; s1 += 1;可以正確編譯,因為 s1+= 1;相當於 s1 = (short(s1 + 1);其中有隱含的強制型別轉換。
編碼
Java語言採用何種編碼方案?有何特點?
Java語言採用Unicode編碼標準,Unicode(標準碼),它為每個字元制訂了一個唯一的數值,因此在任何的語言,平臺,程式都可以放心的使用。
註釋
什麼是Java註釋
定義:用於解釋說明程式的文字
分類
- 單行註釋 格式: // 註釋文字
- 多行註釋 格式: /* 註釋文字 */
- 文件註釋 格式:/** 註釋文字 */
作用
在程式中,尤其是複雜的程式中,適當地加入註釋可以增加程式的可讀性,有利於程式的修改、除錯和交流。註釋的內容在程式編譯的時候會被忽視,不會產生目的碼,註釋的部分不會對程式的執行結果產生任何影響。 注意事項:多行和文件註釋都不能巢狀使用。
訪問修飾符 public,private,protected,以及不寫(預設)時的區別
定義:
Java中,可以使用訪問修飾符來保護對類、變數、方法和構造方法的訪 問。Java 支援 4 種不同的訪問許可權。
分類:
- private : 在同一類內可見。使用物件:變數、方法。 注意:不能修飾類(外部 類)
- default (即預設,什麼也不寫,不使用任何關鍵字): 在同一包內可見,不使用 任何修飾符。使用物件:類、介面、變數、方法。
- protected : 對同一包內的類和所有子類可見。使用物件:變數、方法。 注意: 不能修飾類(外部類)。
- public : 對所有類可見。使用物件:類、介面、變數、方法
訪問修飾符圖
運算子
&和&&的區別
&運算子有兩種用法:(1)按位與;(2)邏輯與。
&&運算子是短路與運算。邏輯與跟短路與的差別是非常巨大的,雖然二者都要 求運算子左右兩端的布林值都是true 整個表示式的值才是 true。&&之所以稱為短路運算,是因為如果&&左邊的表示式的值是 false,右邊的表示式會被直 接短路掉,不會進行運算。
注意:邏輯或運算子(|)和短路或運算子(||)的差別也是如此。
關鍵字
Java 有沒有 goto
goto 是 Java 中的保留字,在目前版本的 Java 中沒有使用。
final 有什麼用?
用於修飾類、屬性和方法;
- 被final修飾的類不可以被繼承
- 被final修飾的方法不可以被重寫
- 被final修飾的變數不可以被改變,被final修飾不可變的是變數的引用,而不是引用指向的內容,引用指向的內容是可以改變的
final finally finalize區別
- final可以修飾類、變數、方法,修飾類表示該類不能被繼承、修飾方法表示該方法不能被重寫、修飾變量表示該變數是一個常量不能被重新賦值。
- finally一般作用在try-catch程式碼塊中,在處理異常的時候,通常我們將一定要執行的程式碼方法finally程式碼塊中,表示不管是否出現異常,該程式碼塊都會執行,一般用來存放一些關閉資源的程式碼。
- finalize是一個方法,屬於Object類的一個方法,而Object類是所有類的父類,該方法一般由垃圾回收器來呼叫,當我們呼叫System.gc() 方法的時候,由垃圾回收器呼叫finalize(),回收垃圾,一個物件是否可回收的最後判斷。
this關鍵字的用法
this是自身的一個物件,代表物件本身,可以理解為:指向物件本身的一個指標。
this的用法在java中大體可以分為3種:
- 普通的直接引用,this相當於是指向當前物件本身;
- 形參與成員名字重名,用this來區分;
- 引用本類的建構函式。
super關鍵字的用法
super可以理解為是指向自己超(父)類物件的一個指標,而這個超類指的是離自己最近的一個父類。
super也有三種用法:
- 普通的直接引用與this類似,super相當於是指向當前物件的父類的引用,這樣就可以用super.xxx來引用父類的成員。
- 子類中的成員變數或方法與父類中的成員變數或方法同名時,用super進行區分
- 引用父類建構函式
super(引數): 呼叫父類中的某一個建構函式(應該為建構函式中的第一條語句)。
this(引數): 呼叫本類中另一種形式的建構函式(應該為建構函式中的第一條語句)。
this與super的區別
- super: 它引用當前物件的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員資料或函式,基類與派生類中有相同成員定義時如:super.變數名 super.成員函資料名(實參)
- this:它代表當前物件名(在程式中易產生二義性之處,應使用this來指明當前物件;如果函式的形參與類中的成員資料同名,這時需用this來指明成員變數名)
- super()和this()類似,區別是,super()在子類中呼叫父類的構造方法,this()在本類內呼叫本類的其它構造方法。
- super()和this()均需放在構造方法內第一行。
- 儘管可以用this呼叫一個構造器,但卻不能呼叫兩個。
- this和super不能同時出現在一個建構函式裡面,因為this必然會呼叫其它的建構函式,其它的建構函式必然也會有super語句的存在,所以在同一個建構函式裡面有相同的語句,就失去了語句的意義,編譯器也不會通過。
- this()和super()都指的是物件,所以,均不可以在static環境中使用。包括:static變數,static方法,static語句塊。
- 從本質上講,this是一個指向本物件的指標, 然而super是一個Java關鍵字。
static存在的主要意義
static的主要意義是在於建立獨立於具體物件的域變數或者方法。以致於即使沒有建立物件,也能使用屬性和呼叫方法!
static關鍵字還有一個比較關鍵的作用就是 用來形成靜態程式碼塊以優化程式效能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。為什麼說static塊可以用來優化程式效能,是因為它的特性:只會在類載入的時候
執行一次。因此,很多時候會將一些只需要進行一次的初始化操作都放在static程式碼塊中進行。
static的獨特之處
1、被static修飾的變數或者方法是獨立於該類的任何物件,也就是說,這些變數和方法不屬於任何一個例項物件,而是被類的例項物件所共享。
怎麼理解 “被類的例項物件所共享” 這句話呢?就是說,一個類的靜態成員,它是屬於大夥的【大夥指的是這個類的多個物件例項,我們都知道一個類可以建立多個例項】,所有的類物件共享的,不>像成員變數是自個的【自個指的是這個類的單個例項物件】。
2、在該類被第一次載入的時候,就會去載入被static修飾的部分,而且只在類第一次使用時載入並進行初始化,注意這是第一次用就要初始化,後面根據需要是可以再次賦值的。
3、static變數值在類載入的時候分配空間,以後建立類物件的時候不會重新分配。賦值的話,是可以任意賦值的!
4、被static修飾的變數或者方法是優先於物件存在的,也就是說當一個類載入完畢之後,即便沒有建立物件,也可以去訪問。
static應用場景
因為static是被類的例項物件所共享,因此如果某個成員變數是被所有物件所共享的,那麼這個成員變數就應該定義為靜態變數。
因此比較常見的static應用場景有:
1、修飾成員變數
2、修飾成員方法
3、靜態程式碼塊
4、修飾類【只能修飾內部類也就是靜態內部類】
5、靜態導包
static注意事項
1、靜態只能訪問靜態。
2、非靜態既可以訪問非靜態的,也可以訪問靜態的。
流程控制語句
break ,continue ,return 的區別及作用
break 跳出總上一層迴圈,不再執行迴圈(結束當前的迴圈體)continue 跳出本次迴圈,繼續執行下次迴圈(結束正在執行的迴圈 進入下一個迴圈條件)
return 程式返回,不再執行下面的程式碼(結束當前的方法 直接返回)
在 Java 中,如何跳出當前的多重巢狀迴圈
在Java中,要想跳出多重迴圈,可以在外面的迴圈語句前定義一個標號,然後在裡層迴圈體的程式碼中使用帶有標號的break 語句,即可跳出外層迴圈。例如:
跳出外層迴圈程式碼
public static void main(String[] args) {
ok:for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println("i=" + i + ",j=" + j);
if (j == 5) {
break ok;
}
}
}
}