星期一, 10月 15, 2012

OCPJP Day 8


*Object 類別階層架構
  • Object是所有java類別的根源
  • 類別如果沒有extends子句, 就是自動繼承Objects類別
  • Object類別中三個重要的方法
    • equals
      • == 運算子用來判斷兩個參考彼此是否完全相等(identical)(記憶體參照位置相同)
      • 可用來判斷物件的內容是否相同(equal)[內容()相同], 但不必完全相等(identical)(未必是同一個記憶體參照位置)
      • Object類別使用 == 運算子來實作equals方法
      • 使用者自訂的類別可以override equals方法來實作特定領域的內容相同測試
    • hashCode
    • toString

Notes:
  • 轉型的目的是為了恢復該物件的完整功能


*toString方法
  • 用來將物件轉成字串
  • 字串串接時會自動套用這個方法
  • 要將基本型別(primitive)轉換成字串, 須藉由相對應包裝類別(wrapper class)toString方法

*包裝類別(wrapper class)

Primitive Type
Wrapper Class
boolean
Boolean
byte
Byte
char
Character
short
Short
int
Integer
long
Long
float
Float
double
Double


Notes:
  • 除了char int , 其他只要將第一個字母大寫即可
  • Java 5.0開始會 autoboxing autounboxing
Autoboxing
  • 為一對一轉換, 將基本型別轉換成等值(equivalent)的物件
  • 不需要透過包裝類別轉換
  • 大多用在處理集合物件(Collection)

Lab: VIP

VIP.java

package mod09;

public class VIP extends Customer {

private int discount;
//因為要讓TestCustomer.java 可以傳入參數, 所以要建立建構子
//記得要調整順序, netbeans 會將子類別放到最前面
public VIP(int id, String name, char gender, int age, boolean married, int discount) {
super(id, name, gender, age, married);
this.discount = discount;
}

// Override toString 為了讓 VIP TestCustomer.java 內顯示 discount
//利用 super.toString() 來顯示前面的參數
@Override
public String toString() {
return super.toString() + "discount=" + discount ;
}
// Ori Override toString 原本裡用程式產生出來的 toString()
// @Override
// public String toString() {
// return "VIP{" + "discount=" + discount + '}';
// }
public int getDiscount() {
return discount;
}

public void setDiscount(int discount) {
if (discount >= 0 && discount <= 100) {
this.discount = discount;
} else {
this.discount = 0;
}
}
}


TestCustomer.java

package mod09;

public class TestCustomer {

public static void main(String[] args) {
Customer c1 = new Customer();
c1.setAge(14);
System.out.println(c1);
//Customer 內的參數如下 id / name / gender / age / married
Customer c2 = new Customer(2,"max",'F',15,true); //這邊 char 要使用 單引號來標示
System.out.println(c2);
//這邊會發現如果是直接使用Constructor 餵參數進去, 不會被檢查判斷式
//所以可以在建構子那邊改為 setGender 來進行檢查 (會有風險)
Customer c3 = new Customer(3,"ines",'O',200,false);
System.out.println(c3);
//新增 VIP 物件, 然後利用建構子傳入參數
VIP v1 = new VIP(4,"john",'O',30,false,10);
//
System.out.println(v1);
//
VIP v2 = new VIP(5,"Tom",'F',40,false,110);
System.out.println(v2);
}
}



先講 Chapter 13 陣列

Notes:
  • 陣列大小一但決定就不能改變

*陣列概論與使用語法
  • 陣列(Array)就是相同(相容)型態資料的集合
  • Java技術中, 陣列是類別,要用new關鍵字來建立一個陣列物件
    • 在基本型別的後面加上 [ ] 就代表陣列
      • 基本型別的陣列空間就是儲存基本型別的
      • a = new int[5]; //新增一個陣列大小為5
      • a[0] = 5;
      • a[1] = 10;
    • 在參考型別的後面加上 [ ] 就代表陣列
      • 參考型別的陣列空間就是儲存某個物建的參考指標
      • 初始化的時候存放內容為null
      • d = new MyDate[5]; //新增一個陣列大小為5
      • d[0] = new MyDate(15,10,2012);
      • d[1] = new MyDate(25,10,2012);
    • 陣列的索引值由0開始起算

Notes:
  • 陣列的空間一旦規劃出來就會自動初始化(歸零)

*陣列元素自動初始化
  • 陣列一旦建立後, 其中陣列每一個元素都會自動初始化(歸零原則)
  • 上述的String陣列, 每個元素都會自動初始化為null, 表示還未參考到String物件.


Notes:
  • Java 的陣列可以先宣告, 後給值. 但是如果是先宣告後給值, new int[ ] 就不能省略.
  • 陣列可以透過 .length 來得知陣列的長度.

package mod13;

import java.util.Arrays;

public class Main {

public static void main(String[] args) {

String[ ] friends = new String[ ]{"A", "B", "C"};
// 透過 Arrays.toString() 來列出陣列的內容
System.out.println(Arrays.toString(friends));
System.out.println("friends array lengh=" + friends.length);
//
for (int i = 0; i < friends.length; i++) {
System.out.println(friends[i]);
}
System.out.println("--------------------");
// for each 的方式取出內容
for (String i: friends){ //for each i in friends
System.out.println(i);
}
}
}



*多維陣列
  • java 的陣列因為可以先決定前面的維度, 再來決定後面的維度, 所以可以建立非對稱式的陣列


*變更陣列大小
  • 陣列大小無法改變
  • 可以透過相同的參考變數指向一個全新的陣列物件(搬移)
  • 透過System.arraycopo() 可以複製



int [ ] a ={ 1,2,3,4,5,6};
int [ ] b ={ 10,9,8,7,6,5,4,3,2,1};
//a 陣列的大小不夠了, 所以指向b
System.arraycopy(a, 0, b, 3, a.length);//來源陣列, 來源陣列的位置, 目的地陣列, 目的地陣列的索引位置, 複製的長度
a = b;
//顯示 a
System.out.println(Arrays.toString(a));


*變動參數(VarArgs)
  • 方法使用變動參數(Variable Arguments)允許一個方法接受不定數量的參數
  • … 代表可以接受 0 到多個參數

Lab: 變動參數

MyMath.java

package mod13;

public class MyMath {
//double 後面加上 … 代表VarArgs 可以接受0到多個參數
public double avarage(double ... nums){
double sum = 0.0;
//使用 for each 的方式來加總
for(double num: nums){
sum += num;
}
//利用 nums陣列的長度(就是有多少的參數) 來算出平均值
return sum/nums.length;
}
}


Main.java

//產生一個新物件
MyMath m = new MyMath();
//測試丟入不同個數的參數來算平均值
System.out.println(m.avarage(1,2,3));
System.out.println(m.avarage(1,2,3,5,7,3));
System.out.println(m.avarage(1,1,1,1));

Notes:
  • 方法內不可以接受一個以上的變動參數VarArgs (也就是方法內最多只能有一個變動參數)
  • 如果方法內有多參數也同時存在變動參數, 變動參數必須放在最後
    • public void varArgs(boolan a, String s, int … x){ }

沒有留言: