810 likes | 1.01k Views
Java 0526. Chin-Yi Tsai cyt@pmlab.iecs.fcu.edu.tw http://140.134.26.25/~cyt. Outline. Java 簡介 SDK, Documentation, Tools, and Hello World!!! 類別與物件 Java Programming 基本概念. Java 簡介. Java 語言是美國昇陽電腦公司 (Sun Micro System) 所發展出的程式語言。 http://java.sun.com Java 的第一版是於 05/1995 正式發表的
E N D
Java0526 Chin-Yi Tsai cyt@pmlab.iecs.fcu.edu.tw http://140.134.26.25/~cyt
Outline • Java簡介 • SDK, Documentation, Tools, and Hello World!!! • 類別與物件 • Java Programming基本概念
Java簡介 • Java語言是美國昇陽電腦公司(Sun Micro System) 所發展出的程式語言。 • http://java.sun.com • Java 的第一版是於 05/1995 正式發表的 • 昇陽於 JDK 1.2 版發表的時候也正式將其改名為 Java 2。自從 Java 2 發表以後,昇陽也將 Java 分成三種版本 • J2ME • J2SE • J2EE
Outline • Java簡介 • SDK, Documentation, Tools, and Hello World!!! • 類別與物件 • Java Programming基本概念
Java特色 • 簡單(Simple) • C及C++語言相似 • 不必接受艱深的訓練就可以開始設計程式 • 物件導向(Object-Oriented) • 封裝性 • 繼承性 • 實現物件導向的概念及其各種良好的特性是Java的設計理念之一 • 分散式(Distributed) • Java具有網路功能的程式庫(Library) • 電腦網路的發展使得資訊應用朝向分散式的環境發展 • 跨平台 • 多執行緒
SDK, Documentation, Tools, and Hello World!!! • 編輯器 • 記事本 • Ultra Edit • EditPlus
java.lang.System.out static Hello World!!! 程式進入點 /******************************* * HelloWorld.java * *******************************/ public class HelloWorld { publicstatic void main(String args[]) { System.out.println("Hello World!!!"); } } 不必先new一個實體即可使用
JDK主要程式 • javac:java的編譯器;source code->byte code • javac HelloWorld.java HelloWorld.class • java:java的解譯器 • java HelloWorld • appletviewer:java的解譯器,可以執行HTML檔案中的applet程式 • 在HelloWorld.html檔案中加入 • <applet code=HelloWorld.class width=300 height=400></applet> • appletviewer HelloWorld.html • 其他:javadoc,jdb,javah,javap,etc.
Java程式的執行(classpath) Set classpath=%classpath%;d:\myJava E:\Hello.java D:\myJava\iecs.java import iecs; public class Hello{ public static void main(String args[]){ iecs myIECS=new iecs(); System.out.println(myIECS.Information()); } } public class iecs{ public iecs(){ } public String Information(){ return " Hello World!!!"; } } D:\myJava\java iecs.java E:\javac Hello.java E:\java Hello Hello World!!!
Java程式的執行(package) Set classpath=%classpath%;d:\myJava E:\Hello.java D:\myJava\edu\fcu\iecs\iecs.java import edu.fcu.iecs.*; public class Hello{ public static void main(String args[]){ iecs myIECS=new iecs(); System.out.println(myIECS.Information()); } } D:\myJava\jar cvf myJava.jar edu Set classpath=%classpath%;d:\myJava\myJava.jar package edu.fcu.iecs; public class iecs{ public iecs(){ } public String Information(){ return " Hello World!!!"; } } D:\myJava\edu\fcu\iecs\java iecs.java E:\javac Hello.java E:\java Hello Hello World!!!
Outline • Java簡介 • SDK, Documentation, Tools, and Hello World!!! • 類別與物件 • Java Programming基本概念
類別與物件 • 在物件導向的程式語言中,類別是一個不可或缺的機制,它擔負著架構物件的重責大任,它的主要用途是在規劃物件的內部構造,表示物件與物件間的關係,聯絡管道及運作方式。 • 物件是以類別來建立的 • C c1 = new C();
instantiate Class Object 類別與物件 (cont’d) • 什麼是instance? • 在物件導向程式語言中的 instance,其實就是物件(object)的同義複詞。 • 物件的產生是以類別為範本而產生的,這個由類別產生物件的過程在科技文獻中則常被稱物化 (instantiate)。 • 物件因此也被稱為 instance。
類別與物件 (cont’d) • 物件變數 • 在物件產生後,每個物件各自擁有一份 自己的 copy。 • 物件 對其本身 “物件變數” 的修改並不會影響到其他物件中 “物件變數” 的內容。
01. class N { 02. int i = 10; // 物件變數 03. } 04. 05. class Ex5_4_1 { 06. 07. public static void main(String[] args) { 08. N n1, n2; 09. 10. n1 = new N(); 11. n2 = new N(); 12. 13. System.out.println("Before: n1.i = " + n1.i); 14. System.out.println("Before: n2.i = " + n2.i); 15. 16. n1.i = 5; // 改變 n1 中的物件變數 i 為 5 17. 18. System.out.println("After: n1.i = " + n1.i); 19. System.out.println("After: n2.i = " + n2.i); 20. } 21. } 執行結果: Before: n1.i = 10 Before: n2.i = 10 After: n1.i = 5 After: n2.i = 10
類別變數 • “類別變數” (class variables) 的性質: • “類別變數” 則是同屬一個 “類別” 的每一個 物件。 • 每一個以這個 “類別” 所產生的 “物件” 都會共享同一個變數中的資料。 • 當一個物件改變了它的 “類別變數” 中的值,此項改變立刻會由同樣 “類別” 的物件得知。 • 如何宣告“類別變數” ? • 加上 “static” 關鍵字。
01. class N { 02. static int i = 10; // 定義一個類別變數 03. } 04. 05. class Ex5_4_4 { 06. public static void main(String[] args) { 07. N n1, n2; 08. 09. n1 = new N(); 10. n2 = new N(); 11. 12. System.out.println("Before: n1.i = " + n1.i); 13. System.out.println("Before: n2.i = " + n2.i); 14. 15. n1.i = 5; // 改變 n1 中的類別變數 i 為 5 16. 17. System.out.println("After: n1.i = " + n1.i); 18. System.out.println("After: n2.i = " + n2.i); 19. } 20. } 執行結果: Before: n1.i = 10 Before: n2.i = 10 After: n1.i = 5 After: n2.i = 5
Encapsulation (資訊封裝) • 物件中的資源如何被有效的管理及包裝。更進一步來說,就是如何將某些物件中的資源隱藏在物件中,又有哪些資源應該開放給外界使用? • Access Modifiers (存取限制描述子): • Public / Private
Public • 如果我們需要將物件內部的資料或功能開放給物件的使用者使用,只需在欲開放的資源前加上 【public】 這個關鍵字即可。 01. class C { 02. int j; 03. public int i; 04. } 05. 06. class Ex5_6_1 { 07. public static void main(String[] args) { 08. C c = new C(); 09. c.i = 10; 10. c.j = 20; 11. 12. System.out.println("c.i = "+c.i+", c.j = "+c.j); 13. } 14. } 執行結果: c.i = 10, c.j = 20 直接存取
Private • 任何的變數或是方法在宣告前加上 private 後,它就不可再被他人使用,因為此資源的所有權已完全屬於該類別所有,只有在該類別內部才可對其作存取動作。任何外部的存取均會導致錯誤發生。 01. class C { 02. private int i; // 私有資源 03. 04. void f() { 05. i = 5; // 只能在類別內部存取變數 i 06. } 07. } 08. 09. class Ex5_6_2 { 10. public static void main(String[] args) { 11. C c = new C(); 12. 13. c.i = 5; // 編譯錯誤! c.i 是 private 資源,禁止存取! 14. } 15. } 不同類別
this 代表自己 產生物件之後的自己 • this • 物件變數中所謂的物件。 • 設計類別時,需要一個方式或是代號來指稱這個尚不存在的物件。 • 在 Java 中就以 this 來代表類別未來所會產生的物件。
01. classC { 02. private int i; 03. public C (int i) { 04. this.i = i; 05. } 06. } 07. 08. class Ex5_6_6 { 09. public static void main(String[] args) { 10. C c = new C(10); 11. } 12. } 類別中的i 傳進來的i
this 還有一個功能,就是在類別中代表自己 01. classBag { 02. private C[] cList; 03. private int count; 04. public Bag() { cList = new C[5]; } 05. 06. public void add(C c) { 07. cList[count++] = c; 08. } 09. 10. public void printOutList() { 11. for (int i=0; i<count; i++) 12. System.out.println(cList[i].getNumber()); 13. } 14. }
16. class C { 17. private static Bag bag = new Bag(); // 類別物件 18. private int i; // 物件變數 19. 20. public C() { addToList(); } 21. 22. public C(int i) { 23. this.i = i; 24. addToList(); 25. } 26. 27. private void addToList() { 28. bag.add(this); // 將自己加入物件 bag 中! 29. } 30. 31. public int getNumber() { return i; } 32. 33. public static void printList() { 34. bag.printOutList(); 35. } 36. }
38. class Ex5_6_9 { 39. public static void main(String[] args) { 40. for (int i=0; i<3; i++) { 41. new C(i); // 產生 3 個物件並自動加入 List 中 42. } 43. 44. C.printList(); // 將 List 印出 45. } 46. } 執行結果: 0 1 2
Object-Oriented Programming • 封裝 • 資訊隱藏 • 繼承性 • 多型:同一個函式在多個類別中 • 繼承 • Overloading(同名但參數相異) • 介面
private int ID; private String name; getInformation() setup(…) reset() 封裝、資訊隱藏 Class MyObject{ private int ID; private String name; public void getInformation(){ System.out.println(ID+”:”+name); } public void setup(int ID,String name){ this.ID=ID; this.name=name; } private void reset(){ } } MyObject
封裝、資訊隱藏 public class Test{ public static void main(String argv[]){ MyObject MyObj=new MyObject(); MyObj.setup(123,”ChinYiTsai”); System.out.println(MyObj.ID+”:”+MyObj.name); MyObj.getInformation(); MyObj.reset(); } }
繼承性 A B C D E F
public class Parent{ Parent(){ } public void funcation1(){ System.out.println(“Parent”); } } public interface MyInterface{ } public class Child extends Parent { public void function1(){ System.out.println(“child”); } public void function2(){ System.out.println(“child child”); } } implements MyInterface
繼承性 A public class A{ public void A1(){} public void A2(){} } A1 A2 B public class B extends A{ public B3(){} } A1 A2 B3 C public class C extends B{ public void B3(){…} public void C4(){} } A1 A2 B3 C4
不可以被繼承 • final • public static final int FINAL • public final class Test • static • public static int ID; • public static boolean isStatic(intmod) • private • private int ID • private funtion1()
Class and Object 存取控制
public class MyObject { private int ID; private String name; public void getInformation(){ System.out.println(ID+”:”+name); } public void setup(int ID,String name){ this.ID=ID; this.name=name; } private void reset(){ } } public class Test { public static void main(String argv[]){ MyObject MyObj=new MyObject(); MyObj.setup(123,”ChinYiTsai”); System.out.println(MyObj.ID+”:”+MyObj.name); MyObj.getInformation(); MyObj.reset(); } }
類別轉換 • 子類別型別的物件可視為父類型別的物件 • Object o=new Object() • String s=new String() • o=s (子->父) ; s=(String)o (父->子)
變數 Overriding (覆蓋) • 變數 Overriding (覆蓋) • 在繼承時,如果我們定義的變數名稱與父類別中的變數名稱相同時會如何?這個問題,我們稱之為變數的覆蓋問題。 • 事實上,當變數產生覆蓋問題時,在父類別中的變數宣告並不會因此而消失。它只是隱藏起來,暫時無法使用而已。
01. class C { 02. int i = 10; 03. } 04. 05. class D extends C { 06. int i = 5; // 父類別中的整數變數 i,將被此變數覆蓋! 07. } 08. 09. class Ex6_2_10 { 10. public static void main(String[] args) { 11. D d = new D(); 12. System.out.println("d = "+d.i); 13. } 14. } 執行結果: d = 5
01. class C { 02. int i = 10; 03. } 04. 05. class D extends C { 06. int i = 5; 07. } 08. 09. class Ex6_2_11 { 10. public static void main(String[] args) { 11. D d = new D(); 12. System.out.println(“d = “+d.i); 13. // 物件 d 中的變數 i 14. System.out.println("d = " + ((C)d).i ); 15. // 將物件 d 轉型為類別 C! 16. } 17. } 那麼,要如何存取類別 C 中被覆蓋的變數 i 呢? 執行結果: d = 5 d = 10
注意 • 不論變數的型態是否一致,只要變數的名稱相同,父類別的變數就會被子類別的變數宣告所隱藏。 class C { int i = 10; } class D extends C { String i = "hi"; } class Ex6_2_12 { public static void main (String[] args) { D d = new D(); System.out.println(d.i); System.out.println( ((C) d).i); } } 執行結果: hi 10
Method Overriding (方法覆蓋) 及 Method Overloading (方法重載) • 方法覆蓋 overriding • 就是將父類別中的物件方法遮蓋起來。使得以子類別所產生的物件不能再使用父類別中已經被覆蓋的物件方法。 • 方法重載 overloading • 就是將一個方法名稱藉由不同參數個數及參數形態的設定來賦予一個方法名稱多種的意義。 垂直 水平
class C { public int k=5; public static String f() { // 類別方法 return "C.f()"; } } class D extends C { public static String f() { // 類別方法 return "D.f()"; } } class Ex6_2_13 { public static void main (String[] args) { D d = new D(); System.out.println(D.f()); // 子類別中的類別方法 System.out.println(((C)d).f()); // 父類別中隱藏的類別方法 } } 執行結果: D.f() C.f()
對於被覆蓋的方法,Java 提供了一個保留字 super,用來提供子類別呼叫父類別中被覆蓋的方法。 class C { int i; C() { i = 5; } int getI() { return i; } } class D extends C { // 使用 super.getI() 呼叫父類別中被覆蓋的方法! int getI() { return super.getI() * 10; } } class Ex6_2_20 { public static void main(String[] args) { D d = new D(); System.out.println(d.getI()); } } 輸出結果: 50
super 也可以被用來呼叫父類別中的建構子。 • 在 super 後加上一對括號及所要呼叫的建構子所需的參數。 • 如果在括號中完全沒有任何參數,super() 則會呼叫父類別 中的預設建構子。
輸出結果: 20 class C { private int i; C(int i) { this.i = i; } public int getInt() { return i; } } class D extends C { D() { super(20); // 呼叫父類別中以整數為參數的建構子。 } } class Ex6_2_21 { public static void main(String[] args) { D d = new D(); System.out.println(d.getInt()); } }
父類別與子類別之間的初始化動作是如何執行的呢?父類別與子類別之間的初始化動作是如何執行的呢? • 在我們經由繼承而得到一個新的類別之後,Java 會自動在其預設建構子的第一行插入一行程式: • super();
C D E 執行結果: C's constructor D's constructor E's constructor class C { C() { System.out.println("C's constructor"); } } class D extends C { D() { System.out.println("D's constructor"); } } class E extends D { E() { System.out.println("E's constructor"); } } class Ex6_2_22 { public static void main(String[] args) { E e = new E(); } }
如果在類別中並沒有設計預設建構子,那麼 Java 要如何插入 super() 呢? C's constructor D's constructor: 10 class C { C() { System.out.println("C's constructor"); } } class D extends C { D(int i) { System.out.println("D's constructor: "+i); } } class Ex6_2_23 { public static void main (String[] args) { D d = new D(10); } }