摘要:JAVA Object
物件
Stack: 一般的RAM(random-access memory), 儲存物件的reference、基本型別
Heap: 通用型RAM,儲存物件
autoboxing(自動裝箱): 基本型別與其對應的類別
Character ch = ‘x’;
char c = ch;
基本型別 預設值 Byte 包裝類
boolean false 1 Boolean
char ‘\u0000’ 2 Character
byte 0 1 Byte
short 0 2 Short
int 0 4 Integer
long 0L 8 Long
float 0.0f 4 Float
double 0.0d 8 Double
static關鍵字:
static資料成員或函式表示其為靜態,可以直接透過類別名取用,或物件取用
static函式不能直接取用non-static資料/函式、靜態方法中不可以寫this,super關鍵字,因為static優先於物件存在。當物件中有共享數據時,使用static關鍵字修飾,而當函數內沒有使用到非靜態數據時,可使用static修飾
強調為整體使用static方法時,可將建構子設為private(建構子私有化),讓其物件可透過類別名稱.靜態方法來取用
static成員
- 隨著類別的載入而載入
- 優先於對象存在
- 被所有物件所共用
- 可以直接被類別調用
成員變數與靜態變數
成員變數隨物件建立而存在,隨物件消失而消失
靜態變數類別載入就產生,隨類別消失而消失
靜態區塊
隨著類別載入而執行,只執行一次,可用於類別初始化
ex:
static{
…
}
final修飾
final變數不允許在程式執行時改變
final類別不允許有子類別
final方法不允許被重新定義
final參數不允許被修改
註解:
@see
@author
@param: 說明引數內容
@return: 說明返回值
@throws
使用javadoc產生說明文件在cmd下編譯產生html檔,類別需為public
javadoc –d 產生文件路徑 -author –version 類別
匿名物件:
匿名物件使用情況當對物件方法僅進行一次調用的時, 也可以作為實際參數進行傳遞
建構子:
函數名與類別名相同,不需定義返回值,不可寫return,提供給物件初始化
系統會提供一個無參數的預設建構子,但是當有自定義建構子後,系統就不提供預設建構子
建構子的權限與類別權限一致
多載(overloading)建構子可以依參數不同呼叫特定的建構子
在建構子中使用this減少重覆代碼
ex:
private String name;
private int age;
Person(){
}
Person(String name){
this();
this.name = name;
}
Person(String name, int age){
this(name); //呼叫Person(String name)建構子
this.age = age;
}
this
表示當前物件的引用,即哪一個物件在調用,this就代表其物件
建構子中使用this來呼叫其他建構子可縮減程式碼,但必須擺第一行,因為讓初始化先執行
比較兩個人年紀是否一樣
public boolean compare(Person p){
return this.age == p.age;
}
Person p1 = new Person(20);
Person p2 = new Person(25);
boolean same = p1.compare(p2);
構造代碼塊
物件一產生就運行,以建構子更早執行,用於給不同物件統一初始化
ex:
屬性
{構造代碼塊}
方法
Randow rand = new Randow(47);
int i;
i = rand.nextInt(100)+1;
基底資料型別對象包裝類
將基底資料型別封裝成物件的好處在於可以在 物件中定義更多的功能方法操作該資料。
常用的操作之一:用於基底資料型別與字串 之間的轉換。
例:Integer的parseInt方法,intValue方法。
基底資料型別物件包裝類新特性
JDK1.5以後,簡化了定義方式。Integer x = new Integer(4);可以直接寫成
Integer x = 4;//自動裝箱。
x = x + 5;//自動拆箱。通過intValue方法。
需要注意:在使用時,Integer x = null;上面的代碼就會出 現NullPointerException。
運算子
邏輯算式中的 boolean無法以 non-boolean值代替
ex:
Random rand = new Random(47);
int i = rand.nextInt(100);
int j = rand.nextInt(100);
System.out.println(i && j); //產生錯誤
int轉二進制
Integer.toBinaryString();
<<(左移運算子), >>(右移運算子), >>>(無正負號右移運算子,即高位補0不管原值是正或負)
byte與short在位移運算時,會先轉為Int再運算,最後再轉回byte與short,會造成其值被截去,產生不正確的值
四捨五入
float above = 0.7f, below = 0.4f;
Math.round(above); //1
Math.round(below); //0
控制執行
Foreach
舊式for用法,需透過索引值才能存取
Random rand = new Random(47);
float f[] = new float[];
for(int i = 0; i < 10; i++)
f[i] = rand.nextFloat[i];
oreach用法
ex:
for(float x: f){ //定義型別為float變數x, 並循序地將f的每個元素指派給x
System.out.println(x);
}
ex:
for(for c: “ABCDEFG”.toCharArray()){
Systme.out.println(c + “ “);
}
無窮迴圈 while(true)、for(;;)
label1:
outer-iteration{
inner-iteration{
break; //中斷內層迭代
continue; //將執行點移至內層迭代的起始處
continue label1; //跳到label, 從外層迭代重新開始
break label1; //跳到label, 但不會再進入迭代
}
}
多載(overload)
Java是依不同的引數列來決定要呼叫哪一個函數
int add(int x, int y){return x + y;}
int add(int x, int y, int z){return x + y + z;}
double add(double x, double y){return x + y;}
ex:
void show(int a, char b, double c){}
下列函數是否多載
void show(int x, char y, double z){} No
int show(int a, double b, char c){} Yes
void show(int a, double b, char c){} Yes
boolean show(int a, char b){} Yes
double show(int a, char b, double c){} No
陣列:
型別[] 名稱 = new 型別[大小];
型別 名稱[] = new 型別[大小];
ex:
int[] a = new int[]{1, 2, 3, 4, 5};
int[] a = {1, 2, 3, 4, 5};
二維陣列:
int[][] a = new int[3][4];
int[][] b = new int[3][];
b[0] = new int[3];
b[1] = new int[1];
b[2] = new int[2];
int c = {{1, 2, 1}, {0, 1, 0}, {6, 5, 9, 10}};
特殊:
int[] x,y[]; //x為一維, y為二維
初始化和清理
finalize() 當使用native code時,針對c中malloc對應的free()方法,以釋放記憶體
System.gc()強迫終結動作
資料成員自動初始化
區域變數不自動初始化,若使用者未賦值則會產生錯誤
可變引數列: 可以含括未定個數及未定型別
ex:
static void printArray(Object … args){
….
}
印出class名稱與object的位址
System.out.println(new A()); à A@1a46e30 前為類別名稱, 後為16進位位址