星期二, 10月 23, 2012

OCPJP Day 10


20121022 Day 10

Lab: interface 實作

Shape.java

package lab10;

public interface Shape {
//宣告 getArea() 以及 getPerimeter()
public double getArea();
public double getPerimeter();
}


Circle.java

package lab10;

public class Circle implements Shape {
//宣告一個 半徑的 double
private double radius;
//使用建構子來傳入半徑
public Circle(double radius) {
this.radius = radius;
}
//因為用interface, 所以所有的子類別都要實作方法, 改寫方法在netbeans可以按滑鼠右鍵
// Mouse right click --> Insert Code --> Implement Method
@Override
public double getArea() {
//PI * radius * radius 改成自己要的方法
return Math.PI*this.radius*this.radius;
}

@Override
public double getPerimeter() {
// PI * 2*radius
return Math.PI*2*this.radius;
}

}


Rectangle.java

package lab10;

public class Rectangle implements Shape {
//宣告長以及寬度
private double width;
private double height;

//建立一個建構子來傳入長度以及寬度
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
//因為用interface, 所以所有的子類別都要實作方法, 改寫方法在netbeans可以按滑鼠右鍵
// Mouse right click --> Insert Code --> Implement Method
@Override
public double getArea() {
// 面積等於height * width
return this.height * this.width;
}

@Override
public double getPerimeter() {
//周長等於 (width + heigh) *2
return (this.width+this.height)*2;
}
}


GeometricTool.java

package lab10;

public class GeometricTool {
public static void main(String args[]){
//新增兩個物件並傳入數值
Rectangle r = new Rectangle(3,4);
Circle c = new Circle(5);
GeometricTool gt = new GeometricTool();
//呼叫 getShapeInfo 並傳回面積還有周長
gt.getShapeInfo(r);
gt.getShapeInfo(c);

}
//
public void getShapeInfo(Shape s){
//這邊利用 getClass().getSimpleName() 取出名稱 Circle 或是 Rectangle
//如果使用 getClass().getName() 會出現 lab10.Circle 或是 lab10.Rectangle
//回傳面積以及周長
System.out.println(s.getClass().getSimpleName()+"Area = "+s.getArea()+", Perimeter ="+s.getPerimeter());
}
}


Notes:
  • Math.PI – 圓周率
*Chapter 11 static enum

*static 語法
  • static 是個修飾子(modifier)
  • 用於類別中的屬性, 方法或是巢狀類別(Nested class)
  • static成員又被稱為類別成員(Class member), 像是類別屬性(Class attribute) 或是類別方法(Class method)
  • 宣告為static的屬性與方法, 不在專屬某實體物件(instance), 而是屬於類別本身(當類別載入到記憶體的時候就已經存在了)

*static 屬性
  • 又稱為類別屬性
  • 用來呈現使用同一類別所建立的物件之間的共享資料(像是全域變數 global variable)


Notes:
  • 類別圖上面, 底線代表 static
  • static 要考慮存取控制

*static 方法
  • static 方法不再具有this 的隱含變數
  • static 方法, 不可以直接存取實體變數(instance attributes)


*static initializer (block)
  • 是個特殊的方法,只在類別載入時執行, 而且只執行一次
    • 用來初始化static屬性
    • 執行一些應用程式的前置初始化作業
  • 在一個類別裏面, static block 沒有數量的限制, 執行的先後順序, 按照出現在類別裏面的先後順序


Account.java

package mod11;

public class Account {
//
private static double interestRate;
static{
//
System.out.print("Static initialzer");
}

public static double getInterestRate() {
return interestRate;
}

public static void setInterestRate(double aInterestRate) {
// use aInterestRate not InterestRate
interestRate = aInterestRate;
}
private int balance;
//

public int getBalance() {
return balance;
}

public void setBalance(int balance) {
this.balance = balance;
}
public static void main(String args[]){
//Test static initialzer
System.out.println(Account.getInterestRate());
}
}


*static import 語法
  • Java SE5 新語法.
  • 匯入某個類別的靜態成員


*final 語法
  • final 是修飾子(modifier)
  • 用於
    • 類別
      • 無法再衍生子類別
    • 方法
      • 不能被覆寫 override
    • 變數
      • 常數

*final 變數
  • final 變數即為一個常數
  • final 變數只能夠設定一次
  • final 區域變數(區域常數)使用前必須在方法本體內先設定初始值
  • static final 的屬性必須直接設定初始值或是透過 static initializer, 否則會編譯錯誤.





Employee2.java

package mod11;

public class Employee2 {
//
private final int MYCONST1 = 100; //Compile-Time Constant
private final int MYCONST2; //Blank-final instance variable
// must define MYCONST2 value, because Blank-final instance variable
public Employee2(int a ){
MYCONST2 = a;
}
//每個建構子都要先定義 Blank final instance variable
public Employee2(){
this.MYCONST2=500;
}
}


Notes:
  • final 容易搞混的狀況

//下面這行是將 d 這個變數設定為 final, 不能改變
final MyDate d = new MyDate(22,10,2012);
d.setDay(20); // 因為是 d 設定為 final 所以這個方式是可以的, 沒有說不能改參考的位置
d.setMonth(3); // 因為是 d 設定為 final 所以這個方式是可以的, 沒有說不能改參考的位置
d = new MyDate(25,12,2012); //這個不行因為 d 已經被 final


*System 類別

Notes:
  • System.currentTimeMillies() 回傳執行當下的時間, 單位為毫秒
    • 從 1970/1/1 00:00:00 開始計算
    • 可以用 Date() 來顯示, 例如System.out.println(new Date(System.currentTimeMillis()));

*String 類別
  • String物件是不可變的(immutable)
  • String物件經運算後, 會產生新物件
  • 運算API
    • concat() 處理字串串接
    • replace() 置換字串中某字元
    • substring() 擷取字串片斷
    • trim() 截斷字串頭尾空白
    • toLowerCase() 轉換為小寫
    • toUpperCase() 轉換為大寫
  • String的比較
    • equals() 比較兩個字串的內容
    • equalsIgnoreCase() 比較兩個字串的內容, 且不分大小寫

*String Pool

stringPool.java

package mod11;

public class stringPool {
public static void main(String args[]){
String a = "Hello";
String b = "Hello";
// Java use String Pool 來存放資料, 所以兩個都存放在 String Pool, 所以以下結果會是true
System.out.println( a == b);
//使用 new 的方式就不會存放到 String Pool, 而是放在記憶體
String c = new String("Hello");
String d = new String("Hello");
//所以使用 c == d 會比較兩個記憶體位置, 答案會是 false
System.out.println( c == d );
//所以要比較字串的內容要使用 equals() 來比較
System.err.println( c.equals(d));
}
}


*StringBuffer 與 StringBuilder
  • StringBuffer物件內容是可改變的
    • StringBuffer Thread-safe
  • StringBuilder Java SE 5.0 的新類別
    • StringBuilder API StringBuffer相同
    • StringBuilder 不是Thread-safe

沒有留言: