2007年7月21日 星期六

Java 學習筆記 (3) - 管理類別檔案

Inner Class (內部類別)

此種 class 的存在有以下幾點好處:
  1. inner class 可以直接存取 outer class 的 private 成員
  2. 當 inner class 僅被 outer class 一個 class 專屬使用時,相當適合使用
  3. 對外部隱藏 inner class 的存在

接著以下用簡單範例來說明:

一般的 inner class

PointDemo.java (outer class 宣告,其中有 inner class)
public class PointDemo {

//內部類別(Inner Class) ======= Begin
private class Point {
private int x, y;

public void setPoint(int x, int y) {
this.x = x;
this.y = y;
}

public int getX() {
return x;
}

public int getY() {
return y;
}
}
//內部類別(Inner Class) ======= End

private Point[] points;

public PointDemo(int length) {
points = new Point[length];

for(int i = 0 ; i < points.length ; i++) {
points[i] = new Point();
points[i].setPoint(i * 5, i * 5);
}
}

public void showPoints() {
for(int i = 0 ; i < points.length ; i++) {
System.out.printf("Point[%d]: x = %d, y = %d\n", i, points[i].getX(), points[i].getY());
}
}
}
PointShow.java
public class PointShow {
public static void main(String[] args) {
PointDemo demo = new PointDemo(5);
demo.showPoints();
}
}

Anonymous Inner Class (匿名的內部類別)


此種 class 是沒有名稱的,直接宣告在定義的 object 之後,以下為範例說明:

AnonymousClassDemo.java
public class AnonymousClassDemo {
public static void main(String[] args) {
//Anonymous Class 就宣告在此
Object obj = new Object() {
public String toString() {
return "匿名類別物件";
}
};
System.out.println(obj);
}
}
【註】若要在 inner class 中使用 outer class 的區域變數,必須要在該變數的宣告前加上「final」關鍵字,


package

這個部分較為容易,一般可使用自己的 domain name 作為 package name,如此一來與其他 package 名稱衝突的機會就會大大降低。而若非使用 default package,在檔案與目錄的結構上就會有所差異,以下有一段範例程式碼:
package net.twcic;

public class Point2D {
private int x;
private int y;

public Point2D() {}

public Point2D(int x, int y) {
this.x = x;
this.y = y;
}

public int getX() {
return x;
}

public int getY() {
return y;
}
}
如此一來,目錄結構就會變成「$ClassPath/net/twcic/Point2D.class」,這樣 compiler 才知道要去哪裡找檔案進行編譯。


import

import 有分為一般的 import 以及在 SE 5.0 中所提供的 static import,一般的 import 比較容易就不說明了,以下給一段 static import 的程式碼:
import static java.lang.System.out;
import static java.util.Arrays.sort;

public class ImportStaticDemo {
public static void main(String[] args) {
int[] array = {2, 5, 3, 1, 7, 6, 8};

//static method 已經 import 進來
sort(array);

for(int i = 0 ; i < array.length ; i++)
out.print(array[i] + " "); //static method 已經 import 進來
}
}
當然,使用 import static 有可能會發生 method 名稱重複的問題,當然在 compiler 中會有其機制來處理這個問題,不過重要的還是在撰寫時,把名稱部分的細節給處理好才是正確之道。

推薦參考連結

沒有留言:

張貼留言