20121022
Day 10
Lab:
interface 實作
Shape.java
package
lab10;
public
interface Shape {
//宣告
getArea()
以及
getPerimeter()
public
double getArea();
public
double getPerimeter();
}
Circle.java
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
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
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
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的比較
- equalsIgnoreCase() 比較兩個字串的內容, 且不分大小寫
*String
Pool
stringPool.java
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
沒有留言:
張貼留言