1. Software Development for Large
and Open Source Projects
Kun-Ta Chuang
Department of Computer Science and Information Engineering
National Cheng Kung University
20. Java基本知識介紹
Package Description
java.applet The Java Applet Package contains the Applet class and several interfaces
that enable applet/browser interaction and the playing of audio clips. In
Java 2, class javax.swing.JApplet is used to define an applet that uses the
Swing GUI components.
java.awt The Java Abstract W indow Toolkit Package contains the classes and
interfaces required to create and manipulate GUIs in Java 1.0 and 1.1. In
Java 2, the Swing GUI components of the javax.swing packages are often
used instead.
java.awt.event The Java Abstract W indow Toolkit Event Package contains classes and
interfaces that enable event handling for GUI components in both the
java.awt and javax.swing packages.
java.io The Java Input/ Output Package contains classes that enable programs to
input and output data (see Chapter 17, Files and Streams).
java.lang The Java Language Package contains classes and interfaces (discussed
throughout this text) that are required by many Java programs. This
package is imported by the compiler into all programs.
java.net The Java Netw orking Package contains classes that enable programs to
communicate via networks (see Chapter 18, Networking).
java.text The Java Tex t Package contains classes and interfaces that enable a Java
program to manipulate numbers, dates, characters and strings. The
package provides many of Java’s internationalization capabilities that
enable a program to be customized to a specific locale (e.g., an applet may
display strings in different languages, based on the user’s country).
java.util The Java Utilities Package contains utility classes and interfaces, such as
date and time manipulations, random-number processing capabilities with
class Random, storing and processing large amounts of data and breaking
strings into smaller pieces called tokens with class StringTokenizer (see
Chapter 20; Data Structures, Chapter 21, Java Utilities Package and Bit
Manipulation; and Chapter 22, Collections).
javax.swing The Java Sw ing GUI Com ponents Package contains classes and interfaces
for Java’s Swing GUI components that provide support for portable GUIs.
javax.swing.event The Java Sw ing Event Package contains classes and interfaces that enable
event handling for GUI components in package javax.swing.
Fig. 6.6 Java API packages (a subset).
20
21. Java基本知識介紹
• 和C/C++ 有很大不同,Java不允許入下的寫法:
if (a) { 如此才對 if ( a != null ) {
while( i ) { … while ( i != 0 ) { …
} }
} }
不允許其他型態的變數值轉換成boolean型態來使用,
這在C++/C是很常用的方法
21
40. Java 物件(Object)
• 建立一個物件:以關鍵字new 來建立物件。
Point p = new Point( 2.0, -3.5 );
Date d = new Date();
• 使用物件:每一個物件都有屬於自己的成員與方
法的複本(copy),可以使用點字元(.)來讀取
物件中的成員與方法。
Point p = new Point(2, 3);
double x = p.x;
p.y = p.x * p.x;
double d = p. distanceToOrigin() ;
40
43. 物件導向設計概念(II)
• 類別階層(Class hierarchy)
– Direct superclass
• Inherited explicitly (one level up hierarchy)
– Indirect superclass
• Inherited two or more levels up hierarchy
– Single inheritance
• Inherits from one superclass
– Multiple inheritance
• Inherits from multiple superclasses
43
44. 物件導向設計概念(III)
• 抽象化
– 物件的共通性
• “is-a” vs. “has-a”
– “is-a”
• 繼承
• 把子類別物件當作父類別的物件
• Example: Car is a Vehicle
– Car has Vehicle properties/behaviors
– “has-a”
• 組成
• 物件包含其他類別的物件當作成員
• Example: Car has a steering Wheel
44
45. 父類別與子類別
• Superclasses and subclasses
– 一個類別的物件是(“is a”)另一類別的物件
• Example: Rectangle is quadrilateral.
– Class Rectangle inherits from class Quadrilateral
– Quadrilateral: superclass
– Rectangle: subclass
– 父類別典型代表較大集合的類別
• Example:
– superclass: Vehicle
» Cars, trucks, boats, bicycles, …
– subclass: Car
» Smaller, more-specific subset of vehicles
45
74. // 和 前一個 example 比較,
// 以區域類別的方式,來建立並傳回一個java.util.Enumeration 物件
public java.util.Enumeration enumerate() {
// 定義一個區域類別,並實作 Enumeration 介面
class Enumerator implements java.util.Enumeration {
Linkable current;
public Enumerator() { current = head; }
public boolean hasMoreElements() { return ( current != null ); }
public Object nextElement() {
if ( current == null ) throw new java.util.NoSuckElementException();
Object value = current;
current = current.getNext();
return value;
}
}
// 傳回一個Enumerator 類別的實體
return new Enumerator();
}
74
75. 區域類別的有效領域 及 範圍
class A { protected char a = ‘a’; }
class B { protected char b = ‘b’; }
public class C extends A {
private char c = ‘c’;
public static char d= ‘d’;
public void createLocalObject( final char e ) {
final char f = ‘f’;
int I = 0;
class Local extends B {
char g = ‘g’;
public void printVars() {
// (this.) g, f, e, (C.this.) c, (C.this.) d, b, a 都可以被區域類別使用
// 只有 變數 I 不能被區域類別使用
System.out.println( … );
}
}
Local L = new Local(); // 建立一個區域類別
L.printVars(); // 並呼叫它的printVars()方法
}
// 這裡已經脫離了區域類別的範圍,因此 我們不能再使用它了
}
75
76. 區域類別 與 區域變數 的領域
public class Weird {
public static interface IntHolder { // 靜態成員介面
public int getValue();
}
public static void main( String [] args ) {
IntHolder [] holders = new IntHolder[10];
for ( int I = 0; I < 10; I++ ) {
final int fi = I;
class MyIntHolder implements IntHolder { // 定義 區域類別
public int getValue() { return fi; }
}
holders[I] = new MyIntHolder(); // 區域類別在此時實體化
}
// 這裡已經脫離了區域類別的範圍,因此 我們不能再使用它了
// 但holders[] 已將 fi 的值都存起來了
for ( int I = 0; I < 10; I++ ) System.out.println( holders[I].getValue() );
}
}
76
84. Members in class Object
• 既然所有的類別都來自於基底類別,因此也都繼
承基底類別內所定義的成員。
• 也就是說,每個內別都可以用到這幾個共同的方
法。
84
85. Members in class Object
public 這方法的回傳值是一String物件,且這方法是可以被
toString() override的,藉由 “+” 來連結、改寫字串。因此,
回傳的內容可自行設定。
此方法的目的是在基底類別中宣告 toString() 已自動
提供編譯器一個字串標籤來識別物件。
public 比較兩個物件是否相等(equivqlent),注意!這裡
equals() 不是 “==” 這裡的equivqlent是比較兩個是否為各
自獨立但型態、內容相同的物件。
public final 這方法會回傳 一個 型態為Class 的類別,用來識別目
getClass() 前的物件。
85
86. Members in class Object
public 這方法會對目前的物件計算出一個整數型態的hash
hashCode() code數值,並回傳之。
其目的是被用來當作索引值來儲存於套件(package)
中的hash table,以利爾後的編譯。
public final 這方法可用來喚醒那與物件結合的執行緒。
notify()
public final 這方法可用來喚醒所有與物件結合的執行緒。
notifyAll()
public final 這方法可使一個執行緒進入等候狀態,讓物件中其他
wait() 相關的動作先執行。
86
87. Members in class Object
protected (任何物件型態)物件實體的複製,非參照的複製。
clone() 注意! 有實作 Cloneable 介面的類別,其物件才能被
複製。
protected 當一個物件被destroyed時,這方法會被呼叫來清除之。
finalize()
在我們自行延伸定義的類別中,getClass(), notify(), notifyAll(),
wait() 不能被覆蓋來改寫。
87
88. Members of the class Class
• 當程式執行的時候,JVM 會自動建立並載入 每一個類別或
介面的 instances of the class Class。
• 因為是由JVM自動產生,所以這類別中沒有public 的建構
子,所以 我們無法自行建立型態為 Class 的物件。
• Class 中定義有很多的方法,使得我們能夠曉得一個類別
的詳盡內容。其中最重要的:
88
89. Members of class Class
在 class Object 中提供了 getClass() 這方法來獲得一個物件的類別。
而藉由使用 class Class 中的方法,將可以瞭解到一個類別的物件到
底包含了哪些東西。
forName() 這方法可以用來獲得、或測試某物件的類別名稱。
將某物件的名稱以字串的方式傳入,這方法會把這
物件的類別型態的名稱回傳。
newInstance() 這方法會呼叫 class Class 的內定建構子,並回傳
一個型態為 Object 的物件。使用時要強制轉型回
instance 的類別型態。
注意!這方法必須要同時配合使用 Exception
handler,否則編譯時會出錯。
89
90. Members of class Class
getSuperClass() 呼叫這方法會為傳一個父類別型態的類別。
例如: Animal Dog
System.out.println(dog.getClass().getsuperClass
().getName() );
if your class is not a derived class, this method
will return a Class object for the class Object .
isInterface() return true, 若目前的物件是一個介面的型態。
getInterface() return 一個陣列:內容是這類別物件所有實作的介面。
toString 回傳一字串,用來表示這物件。
90
91. Casting Objects
• 當兩物件之間有繼承關係時,可將一物件放大轉型成
為上層型態的物件(upwards through its direct and
indirect superclass)。
• 當一物件放大轉換成為某一繼承型態的物件時,Java
會依然保留住原有型態的物件資料。
因此,爾後這物件能夠在縮小轉回原來的型態。
此為之前所介紹的:polymorphism!
91
92. A Casting Objects Scenario
class Object
is derived from
class Animal
is derived from is derived from is derived from
class Cat class Dog class Duck
is derived from
class Spaniel
92
93. When to Cast Objects
• 在同一個類別繼承關係中,可以將某一物件放大轉型後,
又縮小轉回來。
• 需要轉型的理由:要使用到某個只存在特定類別中的欄位
或方法。
• 大部分的情況應該要避免使用 casting
– 因為容易造成可能的轉換錯誤和程式的不嚴謹
– 若是 class 設計良好將會減少 casting 的次數
93
94. 了解 Stream(串流)
Stream
Stream
program Data
Data
Input
Stream Stream
Output
Stream Monitor
Stream
Keyboard
Stream printer
94