總網頁瀏覽量

2012年5月20日 星期日

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資料/函式、靜態方法中不可以寫thissuper關鍵字,因為static優先於物件存在。當物件中有共享數據時,使用static關鍵字修飾,而當函數內沒有使用到非靜態數據時,可使用static修飾
強調為整體使用static方法時,可將建構子設為private(建構子私有化),讓其物件可透過類別名稱.靜態方法來取用

static成員
l   隨著類別的載入而載入
l   優先於對象存在
l   被所有物件所共用
l   可以直接被類別調用

成員變數與靜態變數
成員變數隨物件建立而存在,隨物件消失而消失
靜態變數類別載入就產生,隨類別消失而消失

靜態區塊
隨著類別載入而執行,只執行一次,可用於類別初始化

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;

基底資料型別對象包裝類
將基底資料型別封裝成物件的好處在於可以在 物件中定義更多的功能方法操作該資料。
常用的操作之一:用於基底資料型別與字串 之間的轉換。
例:IntegerparseInt方法,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不管原值是正或負)

byteshort在位移運算時,會先轉為Int再運算,最後再轉回byteshort,會造成其值被截去,產生不正確的值

四捨五入
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];

Foreach用法
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時,針對cmalloc對應的free()方法,以釋放記憶體
System.gc()強迫終結動作

資料成員自動初始化
區域變數不自動初始化,若使用者未賦值則會產生錯誤

可變引數列: 可以含括未定個數及未定型別
ex:
static void printArray(Object … args){
    ….
}

印出class名稱與object的位址
System.out.println(new A());  à A@1a46e30   前為類別名稱, 後為16進位位址

沒有留言:

張貼留言