JAVA Object

摘要: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進位位址