Object-Oriented Java Programming 2018/9/22
Outline Java overview The Concepts of Object-Oriented Programming Java programming Object-Oriented concepts with Java 2018/9/22
本單元主要將介紹Java的基本性質與特性 Java Overview Java Overview 本單元主要將介紹Java的基本性質與特性 2018/9/22
Java Introduction 網際網路(Internet)與全球資訊網(World Wide Web, WWW)的崛起與普及。 Java Overview Java Introduction 網際網路(Internet)與全球資訊網(World Wide Web, WWW)的崛起與普及。 Web-based 的應用程式開始出現。 Java對Internet帶來的影響: Java易於發展網際網路程式。 Java在client-side所帶來的改變。 Java發展的方向逐漸走向server-side。 Java2 for enterprise。 Java的應用層面擴及家電產品領域。 2018/9/22
The Features of Java Java為Sun公司所提出,並具有下列幾種特性: Simple 簡單 Java Overview The Features of Java Java為Sun公司所提出,並具有下列幾種特性: Simple 簡單 object-oriented 物件導向 Interpreted 直譯byte-code architecture neutral and portable 架構中立且可攜 dynamic and distributed 動態及分散性 robust and secure 堅固及安全情 multi-threaded 多執行緒 2018/9/22
Simple Java具有簡潔的語法與程式結構 Java就像是簡潔版的C++語言 Java Overview Simple Java具有簡潔的語法與程式結構 Java就像是簡潔版的C++語言 透過Java語言simple特性,可以使得程式發展者更專注於program或business logic 2018/9/22
Java Overview Object-Oriented Java為一完全物件導向語言,在Java的世界中,除了基本型態以外(如int, long等),其餘存在的個體皆為物件。 Java的繼承觀念有別於C++的多重繼承(multiple inheritance),採用單一繼承(single inheritance)的方式。在Java中,所有物件的祖先皆為Object(此處為類別名稱)。 Object B A 圖一 2018/9/22
Interpreted Java與傳統電腦語言(如C,C++等)不同。 Java Overview Interpreted Java與傳統電腦語言(如C,C++等)不同。 compile-time:source code compile成為byte-code,而非native code。 run-time:直譯(Interpreted)執行byte-code。 Java在經過編譯(compile)後並不會真正產生該電腦的機器碼(machine code),而是產生一種中立碼“byte-code”。 Java程式的執行,是在該電腦上的Java虛擬機器(Java Virtual Machine,JVM)裡執行。而JVM的工作是即時直譯byte-code並載入系統執行。 2018/9/22
Java Architecture Java source Java compiler Java byte-code JVM OS Java Overview Java Architecture Java source Java compiler Java byte-code JVM Hardware OS 圖一 2018/9/22
Architecture Neutral and Portable (1/2) Java Overview Architecture Neutral and Portable (1/2) 由於所有的Java程式都必須透過JVM才能夠執行,所以想要執行Java程式的機器上,都必須先安裝JVM。 因為JVM會先將byte-code轉換成該機器的machine code再執行,所以不同類型的機器都有其專屬的JVM來負責解譯byte-code的工作。因此Java程式可以透過byte-code在不同平台的JVM上被解譯執行,而達到“Write Once, Compile Once, Run Anywhere”。 Java programs Windows OS/2 UNIX 圖一 2018/9/22
Architecture Neutral and Portable (2/2) Java Overview Architecture Neutral and Portable (2/2) 2018/9/22
Dynamic and Distributed Java Overview Dynamic and Distributed 任何Java程式皆可以在run-time時期才被載入JVM。 在Java程式中所定義的物件,只有在真正使用到時,其類別檔案(.class)才會被載入,進而產生該物件的實體(Instance)。 網路通訊為Java全力支援的主要功能之一,Java提供了許多高階的網路功能。如 URL Remote Method Invocation (RMI) CORBA 2018/9/22
Robust and Secure Robust: Secure: Strongly typing 嚴格型態。 Java Overview Robust and Secure Robust: Strongly typing 嚴格型態。 Lack of pointer 沒有使用指標。 Garbage collection 垃圾收集。 Exception handling 例外處理。 Secure: Lack of memory access directly 沒有直接存取記憶體。 Byte code verification 位元碼確認。 Applets in the sandbox。 Security Manager 安全管理。 2018/9/22
Multi-threaded Java在language level就支援multi-threads Java Overview Multi-threaded Java在language level就支援multi-threads 一般的網路或是多媒體應用程式大都會採用multi-threads的技術來增進效能,multi-threads的技術已變成程式設計的重要基本技術之一。 2018/9/22
Applications and Applets Java Overview Applications and Applets Applications指可被獨立執行的Java程式。 只要JVM的版本愈新,能執行的application版本就愈新。 Applets指需透過瀏覽器才能執行的Java程式。 Applet的版本常受限於瀏覽器的支援。 Netscape Communicator 4.7 supports JDK 1.1.5。 Internet Explorer 4.02 SR1 and later supports JDK 1.1 partly。 2018/9/22
Java technology Applets. Java 2D & Java 3D. Rich UI with Swing. Java Overview Java technology Applets. Java 2D & Java 3D. Rich UI with Swing. Multimedia with Java Media Framework. Web programming with Java Servlets & Java Server Pages (JSP). Database programming with JDBC. Java networking with RMI, CORBA, and low-level TCP/IP. Network security with Java Cryptographic Extension (JCE). Business components with Enterprise JavaBeans (EJB). Electronic products with Personal Java & Embedded Java. And many in the Java site (http://java.sun.com/). 2018/9/22
The Concepts of Object-Oriented Programming 本單元將介紹與Java 有關的物件導向基本概念 2018/9/22
Procedure v.s. Object 程序導向: 物件導向: 我們賦予程序能力,希望程序為我們做什麼。 思考的著眼點在問題的解決流程。 The Concepts of Object-Oriented Programming Procedure v.s. Object 程序導向: 我們賦予程序能力,希望程序為我們做什麼。 思考的著眼點在問題的解決流程。 從資料角度而言,資料是被動的。 物件導向: 物件有什麼能力,我們就做什麼。 思考的著眼點在問題所需用到的物件以及物件之間的互動。 從資料角度而言,物件是主動的。 2018/9/22
Types of Language Procedure-Oriented Language: The Concepts of Object-Oriented Programming Types of Language Procedure-Oriented Language: Basic. Cobol. C. Pascal. Object-Oriented Language: C++. Object Pascal. Object-C. Smalltalk. Java. 2018/9/22
Classes and Objects 物件導向的世界是由物件(objects)所組成。而任一物件主要具有兩個特徵 The Concepts of Object-Oriented Programming Classes and Objects 物件導向的世界是由物件(objects)所組成。而任一物件主要具有兩個特徵 行為(behaviors) 狀態(states) 每個物件透過其行為來改變自身的狀態。 以物件導向(Object-Oriented)的觀點而言,這些分類稱為類別(Class),而屬於這個類別的實體(instance) ,就是物件(Object)。 類別(classes)則是物件的抽象描述,定義物件應該具有的行為與狀態。換句話說,類別是物件的樣版(template)。 舉例而言,大圓、中圓、小圓都是屬於類別,而大圓、中圓和小圓則是圓類別的物件或實體。 2018/9/22
Relationship of Classes and Objects The Concepts of Object-Oriented Programming Relationship of Classes and Objects 貓 波斯貓 喜馬拉雅貓 暹邏貓 2018/9/22
State 狀態(states)是用來描述物件目前的一些資訊,例如貓的顏色,體積的大小,情緒,感覺及毛的長短等。 The Concepts of Object-Oriented Programming State 狀態(states)是用來描述物件目前的一些資訊,例如貓的顏色,體積的大小,情緒,感覺及毛的長短等。 狀態通常為靜態的,必須透過一些對應的行為來改變,比方一隻貓,牠的情緒,可以用玩毛球來,改變情緒;或牠的餓飽,可以用吃飯來將餓的狀態改變為飽的狀態。 2018/9/22
Behavior 行為(behavior)是物件用來改變狀態的方法。 The Concepts of Object-Oriented Programming Behavior 行為(behavior)是物件用來改變狀態的方法。 在物件導向的世界裡,要改變物件的某一狀態,必須去要求該物件自己進行某一行為來改變,而不能從外界對其狀態做直接的更動。 這些行為都是物件與生俱來,不是經由不自然的刻意賦予而得之。 2018/9/22
Behaviors and States Class: Stetes: Behaviors: 貓 毛色 大小 餓飽 吃 睡 玩 生氣 The Concepts of Object-Oriented Programming Behaviors and States Class: 貓 Stetes: 毛色 大小 餓飽 Behaviors: 吃 睡 玩 生氣 2018/9/22
The Concepts of Object-Oriented Programming Encapsulation 封裝(Encapsulation) - 資訊隱藏,也就是將program logic隱藏起來,留下適當的管道供外界存取使用。 被封裝在物件裡的狀態是不能被直接改變,必須透過物件所提供的行為來更改,而這個提供給外界物件來呼叫的行為我們稱為方法(method)。 透過封裝,我們僅需知道物件有哪些方法可以使用,而無須去了解他們內部的運作情形,並保護資料的完整性。 介面宣告部分 實做部分 圖一 2018/9/22
Message 在物件導向的世界中,物件與物件之間的彼此互相合作是由訊息傳遞(message passing)的機制來推動。 The Concepts of Object-Oriented Programming Message 在物件導向的世界中,物件與物件之間的彼此互相合作是由訊息傳遞(message passing)的機制來推動。 通常傳遞訊息的物件被稱為傳送物件(sender),而接收訊息的物件則被稱為接收物件 (receiver)。 Message Sender Receiver 圖一 2018/9/22
Inheritance 貓 喜馬拉雅貓 暹邏貓 波斯貓 繼承(Inheritance)可以讓我們從一些已經設計好的類別來產生新的類別。 The Concepts of Object-Oriented Programming Inheritance 繼承(Inheritance)可以讓我們從一些已經設計好的類別來產生新的類別。 繼承是物件導向裡自然發生的行為。 子類別(subclass)可以局部修改(modification)其父類別(superclass)的行為,以符合自己的需求。亦可以以完全覆寫(override)的方式,將其父類別的某些行為完全改變。 貓 喜馬拉雅貓 暹邏貓 波斯貓 圖一 2018/9/22
Multiple Inheritance and Single Inheritance The Concepts of Object-Oriented Programming Multiple Inheritance and Single Inheritance 在自然界裡,繼承可以是多重的,也就是說一個子類別可以同時擁有多個父類別的特性,如孩子可以繼承其父親與母親的特徵。 在物件導向的世界中,有兩派主張: Multiple Inheritance 與 Single Inheritance。 Multiple Inheritance可以使子類別具有多父類別的特性,但是其繼承關係也變的複雜,容易發生問題;而Single Inheritance雖然只能讓子類別擁有一個父類別的特性,亦即其繼承關係為一單根的樹狀結構(single-rooted tree),比較容易維護。 Java僅支援Single Inheritance,但是Java另外提供了Interface的方式,讓子類別可以另行增加新的行為,而又不會破壞原繼承關係。 2018/9/22
Polymorphism 多型(polymorphism)顧名思義即多種型態。 The Concepts of Object-Oriented Programming Polymorphism 多型(polymorphism)顧名思義即多種型態。 多型代表的意義是指多個不同類別的物件可以接受同樣的訊息,但卻表現出各自不同的行為。 Ad-hoc polymorphism(method overloading) Sub-type polymorphism (method overriding) 多型對物件導向觀念的建立極為重要。 多型的概念可包含多種的變化,如C++支援的overloading,但它的使用容易造成程式的複雜化。Java並不支援overloading而僅保留繼承式的多型。 2018/9/22
這個單元我們正式進入Java程式設計的部分,介紹Java程式的基本語法與開發過程。 Java Programming Java Programming 這個單元我們正式進入Java程式設計的部分,介紹Java程式的基本語法與開發過程。 2018/9/22
Java Programming Prepare for Java 由於Java的原始程式碼(source code) 為純文字格式,所以只要是可以用來編寫純文字檔的編輯器,都可以用來撰寫Java source code,如Windows裡的記事本等。 我們必須安裝Java的發展套件,才能對已編寫好的Java source code進行編譯與執行。通常我們都會使用SUN公司的JDK(Java Development Kit) ,SUN JDK也是目前最標準的Java編譯與執行環境,不過JDK本身並不包含source code的編寫環境。 除了JDK以外,還有其他公司推出的Java整合開發環境(Integrated Development Environment, IDE): Jbuilder, Visual Age for Java, Java Workshop, Visual J++ ,Forte 使用Visual J++時請特別注意,其可能會破壞Java的跨平台性。 2018/9/22
Java Programming JDK Installation 2018/9/22
Environment Configuration Java Programming Environment Configuration 圖一 path=c:\jdk\bin;%path%; JDK 1.2以後,系統classpath不再需要設定,但3rd party 的classpath仍須設定。 存成j.bat(或任何bat檔)。 也可以存在c:\autoexec.bat裡。 2018/9/22
Compile the Program javac HelloWorld.java。 Java Programming Compile the Program 圖一 javac HelloWorld.java。 我們會得到一個以class為附檔名的HelloWorld.class檔。 2018/9/22
javac.exe java.exe javac.exe是Java的編譯器(compiler)。 Java Programming javac.exe javac.exe是Java的編譯器(compiler)。 與大部分的程式語言相同,Java程式碼要先經過編譯才能執行。 java.exe java.exe是Java的直譯載入器(interpreter)。 任何編譯過的Java程式都要靠直譯器來執行。 2018/9/22
HelloWorldApplet 程式取名為HelloWorldApplet.java。 import java.awt.*; Java Programming HelloWorldApplet import java.awt.*; import java.applet.Applet; public class HelloWorldApplet extends Applet { public void paint(Graphics g) { g.drawString("Hello World!", 50, 25); } 程式取名為HelloWorldApplet.java。 2018/9/22
HTML File 存成HelloWorldApplet.html檔(檔名可自取)。 code是applet的檔名。 Java Programming HTML File <html> <applet code="HelloWorldApplet.class" width=150 height=30> </applet> </html> 存成HelloWorldApplet.html檔(檔名可自取)。 code是applet的檔名。 width與height分別是applet出現在瀏覽器的寬度與高度。 2018/9/22
Browses the Applet(1) appletviewer HelloWorldApplet.html。 Java Programming Browses the Applet(1) 圖一 appletviewer HelloWorldApplet.html。 或用瀏覽器載入HelloWorldApplet.html。 2018/9/22
Hello World 程式取名為HelloWorld.java。 Java程式碼的附檔名一律為java。 請特別注意英文大小寫。 Java Programming Hello World public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } 程式取名為HelloWorld.java。 Java程式碼的附檔名一律為java。 請特別注意英文大小寫。 2018/9/22
Main Method Main method為程式的起始位置。 public class HelloWorld { Java Programming Main Method public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } Main method為程式的起始位置。 2018/9/22
Modifiers public: 表示這個類別的main()方法可以被所有物件使用。 Java Programming Modifiers public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } public: 表示這個類別的main()方法可以被所有物件使用。 static: 表示main()是一個class method。 void: 表示main()沒有傳回值。 2018/9/22
Parameters in Main Method Java Programming Parameters in Main Method public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } Main()裡的參數表示傳入主程式的參數。 參數用一個String陣列表示。 如:java Aprogram name 1 2018/9/22
Print “Hello World!” System為package “java.lang”中的一個class。 Java Programming Print “Hello World!” public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } System為package “java.lang”中的一個class。 out為System的一個instance,它也是static variable。 println()是out物件的一個method。 我們常用System.out.println()來輸出資訊至螢幕。 2018/9/22
Java Programming Result 圖一 先compile java的程式HelloWorld.java,產生可執行的bytecode,即HelloWorld.java檔 輸入java來啟動java的執行環境,並載入bytecode檔 HelloWorld.java來執行 2018/9/22
Basic of Java Language Java語言的兩個重要特性: Java Programming Basic of Java Language Java語言的兩個重要特性: Case sensitivity 每個敘述都是以分號( ; )做結尾。 上面的三則例子中,第三個在編譯時會發生錯誤,原因在於它並沒有以分號做結束,Java的編譯器就無法將它辨識成正確的敘述. 在例一和例二裡,變數名稱為I和i,對Java而言,這兩個就是不同的變數。 int I = 4; int i = 10; int j = 5 2018/9/22
Comments Java有兩種註解的方式: 區塊註解:在“/*” 與 “*/中的部分皆是註解。 單行註解:以“//”來標示此行為註解。 Java Programming Comments Java有兩種註解的方式: 區塊註解:在“/*” 與 “*/中的部分皆是註解。 單行註解:以“//”來標示此行為註解。 /* This is a block comments. */ // This is a single line comment. 2018/9/22
Define Variables Java定義變數的方式與C和C++相同。 Java Programming Define Variables Java定義變數的方式與C和C++相同。 由於Java是採用Unicode作為編碼系統,所以在Java中的每個字元都是為16 bits的寬度。 使用Unicode的好處是可以用一種編碼方式來處理世界上許多的主要語言的文字,因此也可以用中文來作為變數名稱。 int I = 4; long d = 500000; char s = ‘q’; char 變數 = ‘s’; 2018/9/22
Data Type Java內建數種基本資料型態: Java的基本資料型態的長度不會因平台的不同而有所改變。 Java Programming Data Type Java內建數種基本資料型態: boolean: true or false。 char: 16 bits unicode 字元。 byte: 8 bits 有號數,-128 ~ 127。 short: 16 bits 有號數,-32,768 ~ 32,767。 int: 32 bits 有號數,-2,147,483,648 ~ 2,147,483,647。 long: 64 bits 有唬數。 float: 32 bits 浮點數。 double: 64 bits 浮點數。 Java的基本資料型態的長度不會因平台的不同而有所改變。 2018/9/22
Integer Literals int i = 1234; //十進位 int i = 01234; //八進位(664) Java Programming Integer Literals int i = 1234; //十進位 int i = 01234; //八進位(664) int i = 0XFFFF; //十六進位(65535) long l = 13L; long l = 13; //int 13 convert to long 13 int i = 13; byte b = i; // compile time error byte b = (byte)i; // okay 2018/9/22
Floating-point Literals Java Programming Floating-point Literals double d = 8.31; double e = 3.00e+8; float f = 8.31F; float g = 3.00e+8F; 2018/9/22
Character Literals char a = ‘a’; char newline = ‘\n’; // 換行字元 Java Programming Character Literals char a = ‘a’; char newline = ‘\n’; // 換行字元 char smily = ‘\u9999’; // 香 2018/9/22
Operators(1/2) ++, --: 增加, 減少. +, -: 加法, 減法 !: 邏輯的否定 Java Programming Operators(1/2) ++, --: 增加, 減少. +, -: 加法, 減法 !: 邏輯的否定 *, /, %: 悉法, 除法, 餘數 +: 字串連接 2018/9/22
Operators(2/2) <, <=, >, >=: 數字比較 ==, !=: 數值或物件的相等與不相等 Java Programming Operators(2/2) <, <=, >, >=: 數字比較 ==, !=: 數值或物件的相等與不相等 &&: 捷徑的AND ||: 捷徑的OR =: 指定 *=, /=, %=, +=, -=: 運算子指定 -如 i+=1 i=i+1 2018/9/22
Code Block 在Java中,每一個不同的程式碼區塊必須用大括號包含住。 每個大括號必須左右對應。 Java Programming Code Block 在Java中,每一個不同的程式碼區塊必須用大括號包含住。 每個大括號必須左右對應。 在if-else、while、do-while和for等的敘述中,當條件成立時所要執行的敘述多於一個時,也必須以大括號包含住所有的敘述。 public class Apple implements TheColor { ... public Apple(String s) { if(s != null){ setColor(s); System.out.println(s); } 2018/9/22
Scope 區塊內的變數僅能在該區塊及其子區塊內使用。 類別的實體變數(instance variables)可以在該類別的任一區塊內使用。 Java Programming Scope 區塊內的變數僅能在該區塊及其子區塊內使用。 類別的實體變數(instance variables)可以在該類別的任一區塊內使用。 public class Apple implements TheColor { ... String color; public Apple(String s) { } public String getColor() { return color; 2018/9/22
Condition statements Java提供有條件判斷式的statement:if - else statement Java Programming Condition statements Java提供有條件判斷式的statement:if - else statement if-else的敘述中,一個if的敘述可以有0個至多個的else敘述。 if敘述中的條件式的傳回值(return value)必須為boolean 型態 switch-case 是另一種條件式,通常是用於多種情況中要選擇一個的時候。 在switch條件式的傳回值必須是int型態。 2018/9/22
if IF 結構: if (condition(s)) { statement(s); } [ else { Java Programming if IF 結構: if (condition(s)) { statement(s); } [ else { statement(s); }] public class IfExample { public static void main(String[] args) { int i = 0; if (i == 2) { System.out.println(“Into IF condition!!”); } else { System.out.println(“Into ELSE condition!!”); } 2018/9/22
switch(1/2) SWITCH 結構 Switch (int_expression) { case int_expression : Java Programming switch(1/2) SWITCH 結構 Switch (int_expression) { case int_expression : statement; [ case int_expression ; ... default : statement; ] } 2018/9/22
switch(2/2) public class SwitchExample { Java Programming switch(2/2) public class SwitchExample { public static void main(String[] args) { int i = Integer.parseInt(args[0]); switch (i) { case 0 : System.out.println(“This is CASE” + I + “!!”); break; case 1 : default : System.out.println(“This is Default CASE!!”); } 2018/9/22
Loop statements Java提供三種迴圈的敘述:for, while, do-while。 Java Programming Loop statements Java提供三種迴圈的敘述:for, while, do-while。 Java也提供了兩種敘述來控制迴圈的流程:break, continue。 通常,for迴圈大都使用於已知迴圈執行次數的情形;而while與do-while則用於僅知道迴圈終止條件時。 一般而言,break與continue都會搭配if-else的敘述來達成對迴圈流程的控制。 2018/9/22
for FOR 結構 For (initialization; conditional; incrementor) { Java Programming for FOR 結構 For (initialization; conditional; incrementor) { statement(s); } public class ForExample { public static void main(String[] args) { int i; for (i = 0; i < 5; i++) { System.out.println(i); } 2018/9/22
while WHILE 結構 While (conditional) { statement(s); } Java Programming while WHILE 結構 While (conditional) { statement(s); } public class WhileExample { public static void main(String[] args) { int i = 0; while (i < 5) { System.out.println(i++); } 2018/9/22
do-while DO-WHILE 結構 do { statement(s); } while (conditional); Java Programming do-while DO-WHILE 結構 do { statement(s); } while (conditional); public class DoWhileExample { public static void main(String[] args) { int i = 0; do { System.out.println(i++); } while (i < 5); } 2018/9/22
break (1/2) break會強制跳出迴圈。 Java Programming break (1/2) break會強制跳出迴圈。 若break被多重的迴圈所包含住,則當break被執行時,僅會跳出包含break的最裡層迴圈。 public class BreakExample { public static void main(String[] args) { int i = 0; while (i < 5) { System.out.println(i); if (i == 3) break; i = i + 1; } 2018/9/22
break (2/2) break可以加上break point。 public class BreakExample2 { Java Programming break (2/2) break可以加上break point。 public class BreakExample2 { public static void main(String[] args) { int i = 0, j = 0; break_point: while (i < 5) { while (j < 5) { System.out.println(i); System.out.println(j); if (i == 3 && j == 3) break break_point; j = j + 1; } i = i + 1; 2018/9/22
continue (1/2) 當continue被執行時,其以後的敘述都將被忽略,而直接回到迴圈的開頭再重新執行。 Java Programming continue (1/2) 當continue被執行時,其以後的敘述都將被忽略,而直接回到迴圈的開頭再重新執行。 當有多重迴圈包含住continue時,continue僅對最裡層的迴圈生效 public class ContinueExample { public static void main(String[] args) { int i = 0; while (i < 5) { System.out.println(i); if (i == 3) continue; i = i + 1; } 2018/9/22
continue (2/2) continue可以加上continue point。 Java Programming continue (2/2) continue可以加上continue point。 public class ContinueExample2 { public static void main(String[] args) { int i = 0, j = 0; conti_point: while (i < 5) { while (j < 5) { System.out.println(i); System.out.println(j); if (i == 3 && j == 3) contiune conti_point; j = j + 1; } i = i + 1; j = 0; 2018/9/22
Java Programming void and return 在Java的method宣告中,如果一個method不需回傳值則宣告void。若有回傳值,此傳值的宣告可以是任何物件,而在method當中就必須要有return的程式碼 void noReturn() { ... } int returnInteger() { int i = 1; return i; 2018/9/22
Array(1/2) 在Java中,任何型態皆可以宣告成陣列。 int[] I = new int[1024]; i[0] = 0; Java Programming Array(1/2) 在Java中,任何型態皆可以宣告成陣列。 int[] I = new int[1024]; i[0] = 0; char c[] = {‘a’, ‘b’, ‘c’}; Button[] b = new Button[10]; b[0] = new Button(“Button”); String[] s = new String[3]; S[0] = new String(“This is String array”); 2018/9/22
Array(2/2) 在Java的陣列中有一常數length,可以幫助我們得知目前該陣列的大小。 Java Programming Array(2/2) 在Java的陣列中有一常數length,可以幫助我們得知目前該陣列的大小。 public class ArrayExample { public static void main(String[] args) { String[] s = new String[5]; for (int i = 0; i < s.length; i++) s[i] = String.valueOf(i).toString(); System.out.println(s[i]); } 2018/9/22
String 在Java中,字串被設計成為一種類別型態,而並非如C或C++是採用字元陣列的方式來存取,所以可以對字串提供更多的操作方式。 Java Programming String 在Java中,字串被設計成為一種類別型態,而並非如C或C++是採用字元陣列的方式來存取,所以可以對字串提供更多的操作方式。 字串物件有兩種產生方式:一般正統的物件產生方式與直接指定字串內容。 Java字串的另一特點,字串可以利用加號來串接。 public class TestString { public static void main(String[] args) { String s1 = new String("大"); String s2 = "家"; String s3 = s1 + s2 + "好"; System.out.println(s3); } 2018/9/22
StringBuffer 當字串需要做頻繁的修改以及串接時,使用StringBuffer較有效率 Java Programming StringBuffer 當字串需要做頻繁的修改以及串接時,使用StringBuffer較有效率 public class TestStringBuffer { public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); String s1 = new String("大"); buffer.append(s1); String s2 = "家"; buffer.append(s2); buffer.append("好"); System.out.println(buffer.toString()); } 2018/9/22
Package Package是用來對class進行分類管理,通常功能與用途相近的class會被放置於相同package。 Java Programming Package Package是用來對class進行分類管理,通常功能與用途相近的class會被放置於相同package。 對於已經撰寫好、分類好的package,要使用其中的class時,必須用import將該package所要使用的class引入。 import java.awt.*; import java.applet.Applet; 2018/9/22
Standard Packages(1/2) java.lang java.io java.util java.text java.awt Java Programming Standard Packages(1/2) java.lang 包含了主要的Java語言的發展元件如Object, String, Thread等 java.io 提供了系統input, output的資料流(Stream)的基本元件以及基本的檔案系統元件 java.util 提供了多種的工具型元件,其中collection framework提供了存取管理資料的元件,util package中更提供關於時間、字串分解等工具元件 java.text 提供了有關於Internationalization, localization的格式元件 java.awt AWT,即Abstract Window Toolkit,則是提供實做視窗介面的元件 java.applet 提供發展applet的物件 2018/9/22
Standard Packages(2/2) java.beans java.rmi java.net java.math java.sql Java Programming Standard Packages(2/2) java.beans 提供了Java component software元件 java.rmi RMI,及Remote Method Invocation,提供實做分散環境的程式 java.net 提供了基本實做網路程式的元件,如sockets, URLs等 java.math 提供數學運算之物件 java.sql 即JDBC package,提供了使用關連性資料庫的相關元件 java.security 提供了關於加密、認證、數位簽章等安全相關的Java元件 2018/9/22
API Document(1/2) 進入 Java 2 Platform API Specification 的路徑 2018/9/22 Java Programming API Document(1/2) 進入 Java 2 Platform API Specification 的路徑 2018/9/22
Java Programming API Document(2/2) 2018/9/22
The Object-Oriented Concept with Java Object-Oriented Java Programming The Object-Oriented Concept with Java 這個單元我們介紹Java在language level的物件導向語法。 2018/9/22
Classes and Objects 在真實世界中,無論是概念上或實際的東西都可以稱為一個物件 Object-Oriented Java Programming Classes and Objects 在真實世界中,無論是概念上或實際的東西都可以稱為一個物件 類別(class)是狀態與行為的集合,透過設計class來描述物件的狀態與行為,所以class可以說是物件的藍圖或物件的模子,而物件則是依照class的設計而製造出來的實體 以圓來作例子,一個圓可以用圓心位置(x, y )和半徑(r)來表示其狀態,而一個圓則有計算圓周及計算面積等行為 public class Circle { public double area, x, y, r; public double circumference () { return 2 * 3.14159 * r; } public double area() { area = 3.14159 * r * r; return area; 2018/9/22
Object Creation 物件的產生有三大步驟: Object-Oriented Java Programming Object Creation 物件的產生有三大步驟: 宣告(declaration): String str。String是class-name,str是我們為物件取的object-name。此時物件並未正式建立。 物件建立(instantiation): str = new String()。用new來建立一個新的物件,new後面接的是建構子(constructor)。 初始化(initialization): str = new String(“test”)。一個物件被建立後,要進行初始化,使該物件為我們想要的物件。 String str; str = new String(“test”); String s = new String(“test2”); 2018/9/22
Defining a constructor Object-Oriented Java Programming Defining a constructor 我們可以對圓做出下面的初始化動作之描述 public class Circle { public double area, x, y, r; public Circle(double x, double y, double r) { this.x = x; this.y = y; this.r = r; } 我們現在可以使用它來初始化物件 Circle c = new Circle(1.0, 1.0, 1.0); 2018/9/22
this this 代表目前所在的這個物件 相等於 : public double area, x, y, r; Object-Oriented Java Programming this this 代表目前所在的這個物件 public double area, x, y, r; public Circle(double x, double y, double r) { this.x = x; this.y = y; this.r = r; } 相等於 : public double area, x, y, r; public Circle(double xx, double yy, double rr) { x = xx; y = yy; r = rr; } 2018/9/22
Multiple constructors Object-Oriented Java Programming Multiple constructors 如果想以不同的方法來初始化一個物件時,就可以使用多重建構子(Multiple constructors) public Circle() { x = 2.0; y = 2.0; r = 2.0; } public Circle(double x, double y, double r) { this.x = x; this.y = y; this.r = r; 2018/9/22
Method overloading 我們如何來分辨不同的建構子呢?在Java中它利用方法中參數的個數型別位置等來分辨不同的建構子如下 Object-Oriented Java Programming Method overloading 我們如何來分辨不同的建構子呢?在Java中它利用方法中參數的個數型別位置等來分辨不同的建構子如下 Circle c = new Circle(); Circle c = new Circle(1.0, 1.0, 1.0); 此種方式也可以使用在其他的method中,並不限於建構子 2018/9/22
Design a Class(1/2) States Behaviors Object-Oriented Java Programming Design a Class(1/2) States 也就是設計Java物件的fields,用來描述一個物件的data或是屬性 Behaviors 也就是Java物件的methods,用來描述一個物件的functions或是行為 在語言層面,Java有兩個較為特殊的methods: main method – 程式的進入點 constructor method – 建立一個class的實體 2018/9/22
Design a Class(2/2) Class的Constructor-name要跟class-name一樣。 Object-Oriented Java Programming Design a Class(2/2) Class的Constructor-name要跟class-name一樣。 Constructor 無傳回值。 Constructor可以overloading。 public class Circle { public double area, x, y, r; public Circle() { x = 2.0; y = 2.0; r = 2.0; } public Circle(double x, double y, double r) { this.x = x; this.y = y; this.r = r; } public double area() { area = 3.14159 * r * r; return area; } 2018/9/22
Accessing object data 當一個物件被建構出來後,我們可以使用它內部的資料 ,使用方法如下 : Object-Oriented Java Programming Accessing object data 當一個物件被建構出來後,我們可以使用它內部的資料 ,使用方法如下 : Circle c = new Circle(); c.x = 2.0; // Assign 2.0 to c.x c.y = 2.0; // Assign 2.0 to c.y 2018/9/22
Using object methods 當要使用一個物件的方法時, 方式和使用一個物件的資料相同,如下 : Object-Oriented Java Programming Using object methods 當要使用一個物件的方法時, 方式和使用一個物件的資料相同,如下 : Circle c = new Circle(); c.r = 1; double a = c.area(); // Use method area() of object c 2018/9/22
TestClass public class TestClass { Object-Oriented Java Programming TestClass public class TestClass { public static void main(String[] args) { Circle c = new Circle(5.0,5.0,5.0); System.out.println(c.r); //輸出半徑 System.out.println(c.area()); //輸出面積 } 2018/9/22
Object-Oriented Java Programming Class variables 若要將一個變數給所有的物件使用,在Java中則使用Class variable (Static variable)來達到這個目的 我們使用關鍵字static來定義一個Class variable static int num_circle = 0; public Circle(double xx, double yy, double rr) { x = xx; y = yy; r = rr; num_circle = num_circle + 1; } 2018/9/22
Accessing class variables Object-Oriented Java Programming Accessing class variables 當我們讀取一個class variable時 我們是直接對class讀取而不是透過一個物件,例如 System.out.println(Circle.num_circles); 2018/9/22
Constants 若要定義一個常數(constant variables)時,我們使用static 和final這二個關鍵字來宣告 Object-Oriented Java Programming Constants 若要定義一個常數(constant variables)時,我們使用static 和final這二個關鍵字來宣告 static final double PI = 3.14159; 若宣告為常數Java compiler會幫我們把有這常數的計算式先行計算而不留給 Java interpreter 如下例 Double circumference = 2 * Circle.PI * radius; 常數並不能改變,所以下述的式子是錯誤的 Circle.PI = 4; 2018/9/22
Class methods Class methods我們使用關鍵字static來宣告 Object-Oriented Java Programming Class methods Class methods我們使用關鍵字static來宣告 public static double area(double r) { return 3.14159 * r * r; } Class methods同樣是透過Class來呼叫並不需要透過物件來呼叫 2018/9/22
When to class variables and methods Object-Oriented Java Programming When to class variables and methods 當我們要定義工具型或公用的functions或variables時,就可以使用class method或variable,例如定義在 java.lang.Math class的methods,或java.lang.System所使用到的系統層級工具 而class variable或functions則相當於global variables或functions 但設計時要特別注意這些global functions所可能涉及的物件或物件架構 若為了增進運算效率,亦可以使用class variable 2018/9/22
Object-Oriented Java Programming Unused Objects in Java 當一個物件不再使用時,可將它的參考(reference)指定成null,以利garbage collector回收。 這不是必須步驟,只是有時如此可以增加資源使用效率。 Java是利用JVM裡garbage collector來將記憶體中沒有被任何參考所指到的物件的記憶體空間回收。 2018/9/22
Assigning null null是指該參考目前並無指向任何實體。 Object-Oriented Java Programming Assigning null null是指該參考目前並無指向任何實體。 被指定為null的物件變數,其在記憶體中的實體會被garbage collector回收。 public void printString(String s) { System.out.println(s); s = null; } 2018/9/22
Object-Oriented Java Programming Garbage collection Garbage Collector是Java用來維護計算資源的技術,主要的功能是回收不再使用卻佔用資源的物件。 Java Interpreter 可以找出沒有被其他物件或變數參考到的物件,並安全的將其摧毀。 Garbage Collector並可以偵測及摧毀形成‘cycle’的objects String processString(String s) { StringBuffer b = new StringBuffer(s); return b.toString(); } 在上面的例子,我們建構一個 StringBuffer物件, 在回傳String物件後, StringBuffer物件就沒有再被其他物件參考,所以我們將其回收 2018/9/22
Object finalization 我們用建構子來初始化一個物件。同樣的,我們用一個解構子來做終結一個物件前的善後處理。 Object-Oriented Java Programming Object finalization 我們用建構子來初始化一個物件。同樣的,我們用一個解構子來做終結一個物件前的善後處理。 Garbage collector自動的釋放不需要再用到的資源。但是有一些資源, 像是 file descriptors或sockets 。 Garbage Collector並不能自動的回收,所以我們必須使用解構函式來處理。 下面的例子是由java.io.FileOutputStream中所節錄出來 : protected void finalize() throws IOException { if (fd != null) if (fd == fd.out || fd == fd.err) flush(); else close(); } 2018/9/22
Notes about object finalization Object-Oriented Java Programming Notes about object finalization 解構子(finalizer)是一個instance method並不是static method,它不需要參數,不用回傳值,必須叫 finalize()。 Java interpreter可能在收回所有物件資源前結束程式, 所以有些解構子並沒有被呼叫,而這一些資源就由作業系統來釋放 Java並不確定解構子何時會被執行及其執行的順序 2018/9/22
Basic notations in class diagram(1) Object-Oriented Java Programming Basic notations in class diagram(1) Class +state1 -state2 +method1() : int -method2() : void Class : Class name Interface : Interface name AbsClass : abstract class name state1, state2 : field name Method1(), method2() : method name int, void : return value Method3() : abstract method + : public - : private # : protected 2018/9/22
Basic notations in class diagram(2) Object-Oriented Java Programming Basic notations in class diagram(2) 圖一 圖二 圖三 圖一:inheritance 圖二:association 圖三:instantiation 2018/9/22
Inheritance in Java 再利用(Reuse)是軟體發展的一個重點。 Object-Oriented Java Programming Inheritance in Java 再利用(Reuse)是軟體發展的一個重點。 例如我們有一個新類別叫GraphicCircle。因為這一個新類別利用Cirle這個類別的屬性特徵。所以 Circle類別是GraphicCircle類別的祖先(ascendant) ,而GraphicCircle類別則是Circle類別的後代(descendant ) 。 在物件導向的世界中, 我們稱祖先為父類別(superclass),後代為子類別(subclass) 。 子類別繼承所有父類別的特性,但子類別亦可以override父類別的特性。 2018/9/22
Object-Oriented Java Programming Extending a class public class GraphicCircle extends Circle { Color outline, fill; public void draw(DrawWindow dw) { dw.drawCircle(x, y, r, outline, fill); } Extends這一個關鍵字說明 GraphicCircle是Circle的子類別,它繼承了所有Circle的資料和方法 draw()這一個方法就顯現出資料的繼承 –在此方法中用到了Circle裡的 x, y, 及r GraphicCircle 同樣的繼承了 Circle所有的方法,所以如果我們有一個GraphicCircle物件叫 gc,我們可以以下式計算它的面積 double area = gc.area(); 每一個 GraphicCircle物件同時也是合法的Circle物件 Circle c = gc; 2018/9/22
Note for extending a class Object-Oriented Java Programming Note for extending a class 一個子類別繼承所有父類別的特性,除了用關鍵字private所定義的資料和方法 2018/9/22
Casting 子類別的物件因為繼承所有父類別非私有(non-private)的資料及方法,所以可以安全的強制轉型成為父類別的型態。 Object-Oriented Java Programming Casting 子類別的物件因為繼承所有父類別非私有(non-private)的資料及方法,所以可以安全的強制轉型成為父類別的型態。 但是若將父類別強制轉型成為子類別則可能發生錯誤。 如下例我們可以將 GraphicCircle物件gc轉型成 Circle物件 c : Circle c = (Circle)gc; 2018/9/22
final classes 如果一個類別用final此關鍵字來宣告代表說它不能給予任何子類別所繼承 2018/9/22 Object-Oriented Java Programming final classes 如果一個類別用final此關鍵字來宣告代表說它不能給予任何子類別所繼承 2018/9/22
Subclass constructors Object-Oriented Java Programming Subclass constructors 我們假定 GraphicCircle 的建構子如下 public GraphicCircle(double x, double y, double r, Color outline, Color fill) { this.x = x; this.y = y; this.r = r; this.outline = outline; this.fill = fill; } 在這個建構子中,初始化了所有GraphicCircle所繼承的變數資料,我們可以發現前面三行和 Circle的建構子有著相同的程式碼,這對我們來說這是一種時間的浪費 此外如果Circle類別有私有變數,我們將無法用上面的方式來初始化,所以我們必須在GraphicCircle建構子中利用 Circle的建構子來對GraphicCircle 物件作初始化的工作 2018/9/22
The good way for subclass constructors Object-Oriented Java Programming The good way for subclass constructors 我們使用關鍵字super 來達到我們的目的 public GraphicCircle(double x, double y, double r, Color outline, Color fill) { super(x, y, z); this.outline = outline; this.fill = fill; } 使用上有幾個限制 super() 只能用於建構子中 呼叫父類別的敘述必須在建構子的第一行敘述中它必須在所有的變數宣告之前 2018/9/22
The default constructor Object-Oriented Java Programming The default constructor 當我們沒有定義任何的建構子時,Java會自動的幫我們加上一個這一個內定的建構子,單純只呼叫父類別的建構子,並不做其他的動作 例如,我們沒有為 GraphicCircle類別定義建構子時, Java會為其自動加上super()來呼叫父類別的建構子 public GraphicCircle() { super(); } 2018/9/22
Shadowed variables 當子類別有著和父類別相同名稱的變數時,所繼承的變數將會被隱藏 Object-Oriented Java Programming Shadowed variables 當子類別有著和父類別相同名稱的變數時,所繼承的變數將會被隱藏 如下面的例子GraphicCircle類別中的r,將會隱藏繼承於Circle類別的r : public class GraphicCircle extends Circle { Color outline, fill; float r; public GraphicCircle(double x, double y, double rad, Color outline, Color fill) { super(x, y, rad); this.outline = outline; this.fill = fill; } public void setResolution(float resolution) { r = resolution; } public void draw(DrawWindow dw) { dw.drawCircle(x, y, r, outline, fill); 2018/9/22
Makes the shadowed variables shine Object-Oriented Java Programming Makes the shadowed variables shine 當我們要存取被子類別所隱藏的父類別變數時,我們使用下面的方式 super.r 我們也可以透過轉型來存取到被隱藏的變數 ((Circle)this).r 2018/9/22
Object-Oriented Java Programming Method overriding 若在子類別中有method名稱和父類別中的相同時,則子類別中的方法就會overrides父類別中的方法。當我們呼叫這個方法時則使用的是它的新定義,而不是在父類別中的舊定義 Method overriding是物件導向技術中重要的一環,例如,我們要產生一個Ellipse類別,它繼承於Circle類別下。我們知道Ellipse和Circle計算面積的方法不同,因此我們要修改area()的面積計算方式,即Method overriding 有一點需要注意overriding和overloading是不同的,Method overloading 是指在同一個類別中,定義多個name相同的methods 2018/9/22
Overriding is not shadowing Object-Oriented Java Programming Overriding is not shadowing Method overriding和variable shadowing並不一樣,我們可以利用轉型存取到shadowed variables,但是我們並不能利用這種方式來呼叫被覆蓋的method,例如 class A { int i = 1; int f() { return i; } } class B extends A { int i = 2; int f() { return -i; } B b = new B(); b.i // 2 b.f() //-2 A a = (A)b; a.i // 1 a.f() // -2 2018/9/22
Invoking an overridden method Object-Oriented Java Programming Invoking an overridden method class A { int i = 1; int f() { return i; } } class B extends A { int i; // This variable shadows I in A int f() { // This method overrides f() in A i = super.i + 1; // It retrieves A.I this way return super.f() + i; // And it invokes A.f() this way 我們利用super來呼叫被覆蓋的方法. 2018/9/22
More on invoking an overridden method Object-Oriented Java Programming More on invoking an overridden method 當用super來呼叫被overridding的方法時,它只能取得上一層的方法 舉例來說,A類別定義一個方法叫 f(),B是A的子類別,而C又是B的子類別。若在C類別中呼叫被overridding的方法f()時,我們只能呼叫在B類別中定義的f(),而非A類別中的定義 以method orerride來說,super的statement 就無需出現在overriden mehtod的第一行中 2018/9/22
final methods 若宣告一個final mehtod,來它就不能夠被override Object-Oriented Java Programming final methods 若宣告一個final mehtod,來它就不能夠被override 若以static和 private所宣告的method也不能被覆蓋 2018/9/22
Visibility modifiers Private Package Protected Public 相同類別 Yes Object-Oriented Java Programming Visibility modifiers Private Package Protected Public 相同類別 Yes 相同套件的子類別 相同套件的非子類別 No 不同套件的子類別 不同套件的非子類別 2018/9/22
Rules of thumb for using visibility modifiers Object-Oriented Java Programming Rules of thumb for using visibility modifiers 我們應盡可能使用non-public的方式來宣告variable,並透過access method來處理,以保護資料 若variable或method為一個物件應有之狀態或行為,抑或常用之工具等,我們則可以宣告為public 而 protected的宣告,是為了避免不同繼承屬性之classes來使用此variable或method,所以只有直屬的class可以使用,不論其package為何 若我們對於variable或method並不宣告visibility modifier的話,就會成為protected package宣告是為了歸類相同領域、屬性之classes 2018/9/22
Object-Oriented Java Programming Abstract Class 我們通常會從所要使用的各種物件中,找出其共通的特徵與行為, 來設計出一個父類別,以供子類別使用。比如說我們有Circle Rectangle, Square, Ellipse, Triangle等類別而這一些類別有共通的地方我們將其抽取出來作成一個抽象類別(abstract classes) shapes。 具有抽象意義的父類別是不能用來產生物件實體,而這類的類別都會被宣告成abstract。 抽象類別通常會有未實做的抽象方法(abstract method);而有未實做的抽象方法的類別“一定”必須宣告成abstract class。 繼承自抽象類別的子類別必須實做其父類別的抽象方法,否則自己也將成為一個抽象類別。 2018/9/22
Implementing abstract methods Object-Oriented Java Programming Implementing abstract methods 我們使用關鍵字 abstract 來宣告抽象類別和抽象方法 : public abstract class Shape { public abstract double area(); public abstract double circumference(); } public class Circle extends Shape { protected double r = 1.0; protected static final double PI = 3.14159; public double area() { return PI * r * r; ) public double circumference() { return 2 * PI * r; 2018/9/22
Interface Java提供了Interface的機制來彌補其不支援多重繼承的缺失。 Object-Oriented Java Programming Interface Java提供了Interface的機制來彌補其不支援多重繼承的缺失。 Interface僅能有方法的宣告,而無實做,實做的部分由實做此一interface的子類別處理。 一個subclass只能有一個superclass但是可以有多個interfaces。 Interface 能夠包含由static和final.所宣告的常數 2018/9/22
Implementing an interface(1/2) Object-Oriented Java Programming Implementing an interface(1/2) 子類別是實做(implements) interface並不是繼承(extends)它 。 Java實做interface的語法:A implements B表示class A實做interface B。 一個class可以同時實做多個interfaces。 實做一個interface時,必須將該interface裡所宣告的method真正實做完成。 public interface Drawable { public static final float alphaValue = 0.5; public void setColor(Color c); public void draw(DrawWindow dw); } 2018/9/22
Implementing an interface(2/2) Object-Oriented Java Programming Implementing an interface(2/2) public class Circle extends Shape implements Drawable { protected double r = 1.0; protected static final double PI = 3.14159; private Color c; public double area() { return PI * r * r; ) public double circumference() { return 2 * PI * r; } public void setColor(Color c) { this.c = c; } public void draw(DrawWindow dw) { dw.drawCircle(r, c, alphaValue); } 2018/9/22
Extending interfaces Interface的繼承 A extends B public interface A{ Object-Oriented Java Programming Extending interfaces Interface的繼承 A extends B public interface A{ public void methodA(); public void methodB(); } public interface B extends A{ public void methodC(); } 2018/9/22
More about interface 將interface視為定義共同的行為 public interface A{ Object-Oriented Java Programming More about interface 將interface視為定義共同的行為 public interface A{ public void methodA(); public void methodB(); } public class B implements A{ public void methodA() {//B theory} public void methodB() } public class C implements A{ public void methodA() {//C theory} public void methodB() } 2018/9/22
Object-Oriented Java Programming Example Class hierarchy: 2018/9/22
Superclass - Animal 先定義superclass:Animal。 Animal因為沒有定義腳的數目,是抽象類別。 Object-Oriented Java Programming Superclass - Animal 先定義superclass:Animal。 Animal因為沒有定義腳的數目,是抽象類別。 public abstract class Animal { String name; abstract public int leg(); } 2018/9/22
Extends a Class Java的繼承語法:A extends B表示A繼承自B。 透過繼承,子類別可以: 其超類別的方法。 Object-Oriented Java Programming Extends a Class Java的繼承語法:A extends B表示A繼承自B。 透過繼承,子類別可以: 新增, 局部修改, 完全修改, 其超類別的方法。 當繼承的父類別是抽象類別時,必須覆寫(override)其抽象方法。 2018/9/22
Subclass - Dog Dog繼承自Animal。 Dog有四隻腳、一個頭。 Object-Oriented Java Programming Subclass - Dog Dog繼承自Animal。 Dog有四隻腳、一個頭。 public class Dog extends Animal { public Dog(String name) { this.name = name; } public int leg() { return 4; public int head() { return 1; 2018/9/22
Subclass - Fish Fish繼承自Animal。 Fish沒有腳。 Object-Oriented Java Programming Subclass - Fish Fish繼承自Animal。 Fish沒有腳。 public class Fish extends Animal { public Fish(String name) { this.name = name; } public int leg() { return 0; 2018/9/22
Subclass - SuperDog SuperDog繼承自Dog。 Object-Oriented Java Programming Subclass - SuperDog SuperDog繼承自Dog。 SuperDog有六隻腳,因此改寫(override)Dog的leg()。 SuperDog有一個頭。 public class SuperDog extends Dog { public SuperDog(String name) { super(name); } public int leg() { return 6; public int head() { return 1; 2018/9/22
TestOfAnimal import java.util.*; public class TestOfAnimal { Object-Oriented Java Programming TestOfAnimal import java.util.*; public class TestOfAnimal { public static void main(String[] args) { Animal animal; Stack stack = new Stack(); stack.push(new Dog("Dog")); stack.push(new Fish("Fish")); stack.push(new SuperDog("SuperDog")); for(int i = 0; i < 3; i++) { animal = (Animal)stack.pop(); System.out.println(animal.name + " is " + animal.getClass() + " " + animal.leg() + " legs"); } 2018/9/22
TheColor public interface TheColor { Object-Oriented Java Programming TheColor public interface TheColor { public final String myName="TheColor"; public String getColor(); public void setColor(String s); } 2018/9/22
Apple Implements TheColor Object-Oriented Java Programming Apple Implements TheColor public class Apple implements TheColor { String color; public Apple(String s) { setColor(s); } public String getColor() { return color; public void setColor(String s) { color = s; Apple類別實做TheColor介面。 2018/9/22
Orange Implements TheColor Object-Oriented Java Programming Orange Implements TheColor public class Orange implements TheColor { String color; public Orange(String s) { setColor(s); } public String getColor() { return color; public void setColor(String s) { color = s; Orange類別實做TheColor介面。 2018/9/22
TestTheFruit 程式把Orange與Apple物件都轉形成TheColor。 Object-Oriented Java Programming TestTheFruit public class TheFruitColor { public static void main(String[] args) { Apple a = new Apple("red"); Orange o = new Orange("yellow"); java.util.Stack s = new java.util.Stack(); s.push(a); s.push(o); for(int i = 0; i < 2; i++) { TheColor c = (TheColor)s.pop(); System.out.println(c.getColor()); } 程式把Orange與Apple物件都轉形成TheColor。 2018/9/22