精彩Java 2程式設計 <吳逸賢、吳目誠 編著>

Slides:



Advertisements
Similar presentations
单元二:面向对象程序设计 任务二:借书卡程序设计.
Advertisements

JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
第6章 類別與物件 – 封裝 6-1 物件導向的基礎 6-2 Java的類別與物件 – 封裝 6-3 類別的建構子
大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
計算機程式語言實習課.
08 CSS 基本語法 8-1 CSS 的演進 8-2 CSS 樣式規則與選擇器 8-3 連結HTML 文件與CSS 樣式表
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
11 繼承類別 11.4 建立者與破壞者 單一建立者與破壞者 11-20
C++入門 以Dev C++為例.
File Access 井民全製作.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
Chapter 5 遞迴 資料結構導論 - C語言實作.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
第十一章 結構.
LINQ 建國科技大學 資管系 饒瑞佶.
Java簡介.
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
JAVA 程式設計與資料結構 第七章 繼承與Interface.
JAVA vs. SQL Server 建國科技大學 資管系 饒瑞佶 2013/4 V1.
列舉(enum).
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第八章 利用SELECT查詢資料.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
方法.
C語言簡介 日期 : 2018/12/2.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
安裝JDK 安裝Eclipse Eclipse 中文化
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
程式設計(二) 進階類別 郭文真 Sabrina Kuo.
精彩Java 2程式設計 <吳逸賢、吳目誠 編著>
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
第一單元 建立java 程式.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
Ch20. 計算器 (Mac 版本).
第 19 章 XML記憶體執行模式.
JAVA 程式設計 資訊管理系 - 網路組.
輸入&輸出 函數 P20~P21.
挑戰C++程式語言 ──第8章 進一步談字元與字串
LINQ資料查詢技術.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
樣版.
C qsort.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
OOP9 類別Class.
MiRanda Java Interface v1.0的使用方法
函數應用(二)與自定函數.
陣列與結構.
12 虛擬函數 12.1 多載與超載 12-2 多載函數 12-2 超載函數 虛擬函數 12-6 同名異式 12-7
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
Quiz1 繳交期限: 9/28(四).
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
JAVA 程式設計與資料結構 第三章 物件的設計.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
作業系統實習課(二) -Scheduler-Related System Calls-
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Array(陣列) Anny
SQLite資料庫 靜宜大學資管系 楊子青.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
13 繼承類別 13.1 繼承概論 基礎類別與衍生類別 繼承型式 13-2
台大資訊工程學系 資訊系統訓練班 第119期 吳晉賢
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

精彩Java 2程式設計 <吳逸賢、吳目誠 編著> B1 類別與物件 精彩Java 2程式設計 <吳逸賢、吳目誠 編著>

目錄 B1-1 認識類別與物件 B1-2 建立類別 B1-3 巢狀類別 B1-4 物件陣列 B1-5 練習與實作

B1-1 認識類別與物件 物件與類別的初體驗 物件的屬性與方法 查閱物件的屬性與方法

物件與類別的初體驗: 物件(Object)是物件導向程式語言的基本元件。 類別(Class)是產生物件的模板,不同的模板可以產生不同特性的物件。 字串命令String就是一種類別(class),而利用String類別就可以產生具有String特性的物件。

程式碼如下:

下面是使用日期類別Date建立d1物件的程式碼:

下面是使用整數Integer類別建立v1物件的程式碼:

下面是使用倍精確度Double類別建立v2物件的程式碼:

物件的屬性與方法: 在物件導向程式語言中,將專屬於物件的函數稱之為方法(Methods)。 專屬於物件的變數稱為屬性(Properties)或稱為範疇(Field)。 當我們建立一個整數物件v1如下: Integer v1=new Integer(95); 則v1物件包含MAX_VALUE、MIN_VALUE、TYPE等三個屬性。

測試整數物件屬性的程式碼如下:

程式編譯與執行結果如下:

物件的屬性與方法的重要事項: 物件和屬性間使用“.”隔開,格式如下: 物件名稱.屬性名稱

測試整數物件屬性的程式碼如下:

程式編譯與執行結果如下:

測試字串物件的方法(method),其程式碼如下:

程式編譯與執行結果如下:

物件和方法間使用“.”隔開,且在方法名稱後加上“()”括號當結尾,的格式如下: 物件和方法的重要事項: 物件和方法間使用“.”隔開,且在方法名稱後加上“()”括號當結尾,的格式如下: 物件名稱.方法名稱() 有時方法需要傳遞參數,然而使用不同方法所傳回的資料型態也各不相同,此時,必須宣告相同型態的變數來接收傳回值。

查閱物件的屬性與方法: Java程式語言具有豐富的類別(class),而每一種類別所產生的物件,都具有各自所屬的方法(method)和屬性(properties)。 Sun的網站有豐富的Java語言相關資訊,包括各類技術文件、程式範例、學習指引、常見問題解答等等。

連線到Sun的Java討論區的查詢視窗如下: (http://forum.java.sun.com)

查閱到String類別所建立物件可以使用的方法如下:

B1-2 建立類別 傳統程式語言的結構 定義一個陽春的類別 包含屬性和方法的類別 建構函數 使用方法傳回變數值 函數成員的覆載與參數傳遞 類別中的靜態變數

傳統程式語言的結構: 在傳統程序導向語言中,只能使用結構(struct)命令來定義新的資料型態。

以下的C語言程式碼,可以定義新的資料型態posxy,這個資料型態中包含四個整數變數x1、x2、y1、y2: 傳統程式語言的結構的程式碼如下: 以下的C語言程式碼,可以定義新的資料型態posxy,這個資料型態中包含四個整數變數x1、x2、y1、y2: struct posxy { int x1 ; int x2; int y1; int y2; };

利用新的資料型態posxy,就可以宣告新變數如下: 宣告新變數: 利用新的資料型態posxy,就可以宣告新變數如下: posxy *a1; a1=new posxy;

就可以存取a1變數中的成員,包括x1、x2、y1、y2等,其程式碼如下: a1->y1=52; a1->y2=356;

傳統程序導向語言與物件導向語言的差別: 物件導向語言提供新型的資料型態—類別(class)。 在類別中,不但可以宣告變數成員(屬性),還可以設定處理資料的函數(方法)。

對於初學者來說,可以將類別當作結構來使用,進而漸漸熟悉類別。 例如以下的程式碼: 定義一個陽春的類別: 對於初學者來說,可以將類別當作結構來使用,進而漸漸熟悉類別。 例如以下的程式碼: class pos_xy { public int x1; public int x2; public int y1; public int y2; };

程式碼說明: 在public區宣告的變數就成為類別的屬性,而利用新的類別pos_xy,就可以宣告新元件如下: pos_xy obj1= new pos_xy(); 就可以存取物件obj1的屬性,包括x1、x2、y1、y2等,其程式碼如下: obj1.x1=100; //設定物件的x1屬性 obj1.x2=200; //設定物件的x2屬性 obj1.y1=52; //設定物件的y1屬性 obj1.y2=356; //設定物件的y2屬性

以下就是定義一個新類別與產生新物件的程式碼舉例:

程式編譯與執行結果如下:

包含屬性和方法的類別: 完整的類別宣告格式如下: class classname { private …//私有成員(member),無法從類別外部存取 public …//公有成員(member),任何位置都可以存取 protected …//公有成員(member),同一封包中,任何位置都可以存取 };

上述格式中,包括private、public和protected等三種成員,private資料成員或函數: 程式碼說明: 上述格式中,包括private、public和protected等三種成員,private資料成員或函數: private資料成員或函數,外部程式不能直接存取。 public資料成員或函數,任何外部程式可以直接存取。 protected資料成員或函數,在同一封包中,類別外部程式可以直接存取。 public資料成員在建立元件時可以做為屬性,而函數就變成物件的方法。

以下就是定義包含屬性與方法的類別程式碼:

定義包含屬性與方法的類別程式碼說明: 類別程式碼中,包括x1、x2、y1、y2等四個屬性,也包括addnum_x1和addnum_y1兩個方法。

以下是使用pos_xy類別建立物件與操作物件的程式碼:

透過方法來存取變數內容而將類別宣告修改如下:

以下是使用pos_xy2類別建立物件與操作物件的程式碼:

下面是完整的程式碼:

程式編譯與執行結果如下:

建構函數: 建構函數(Constructor Function)是類別資料成員中的特殊函數,它的名稱與類別名稱相同。 當使用類別建立新的物件時,會自動執行建構函數一次,利用這個特性,可以用來設定變數的初值或進行記憶體的配置工作。 建構函數不能傳回值,所以不必宣告函數的型態。 在類別中可以宣告建構函數,名稱必須與類別名稱相同。

以下就是在類別中加入建構與解構函數的程式碼:

建立含有建構函數的類別後,建立類別的物件程式碼如下: pos_xy3 obj3=new pos_xy3(20); //呼叫建構函數,設定初值

建構函數具有覆載(overload)特性的程式碼如下:

上述的類別中,有pos_xy4()和pos_xy4(int a)等兩個建構函數。 程式碼說明: 上述的類別中,有pos_xy4()和pos_xy4(int a)等兩個建構函數。 當建立物件時,沒有傳遞參數,則會使用pos_xy4()建構函數,程式碼如下: pos_xy4 obj4=new pos_xy4(); 若程式碼修改如下: pos_xy4 obj4=new pos_xy4(20); 則會呼叫建構函數pos_xy4(int a)。

對於已經建立的物件,只要設定為null,就可以將物件解構,並釋放出記憶體,程式碼如下: 將物件解構: 對於已經建立的物件,只要設定為null,就可以將物件解構,並釋放出記憶體,程式碼如下: obj4=null;

使用方法傳回變數值: 若要取得私有變數的值,必須在函數成員中使用return命令。

使用方法傳回變數值的類別程式碼:

上述程式碼中,使用get_x1()方法傳回的值為50。 程式碼說明: 在上面的類別程式碼中有get_x1()、get_x2()、get_y1()、get_y2()等四個方法可以傳回值,建立物件和傳回值的程式碼如下: pos_xy5 obj5=new pos_xy5(); int a=obj5.get_x1(); //傳回值 System.out.println("屬性x1:"+a); 上述程式碼中,使用get_x1()方法傳回的值為50。

函數成員的覆載與參數傳遞: 覆載(overload)是物件導向程式語言的基本特性,類別中的函數成員也可以設計成為具有覆載功能。

函數成員的覆載與參數傳遞的程式碼如下:

程式碼說明: 在上面的類別程式碼中有兩個相同名稱的函數成員get_x1()。 pos_xy6 obj6=new pos_xy6(); int a=obj6.get_x1(3); System.out.println("屬性x1:"+a); 呼叫get_x1()方法時,傳遞了一個整數值,所以會自動執行get_x1(int a)函數成員,使得傳回值為53。

類別中的靜態變數: 類別中資料成員可以宣告成為靜態變數。 含有靜態變數的類別必須獨立於函數之外,就像宣告全域變數時,必須在函數之外宣告一樣。 使用含有靜態變數之類別所建立的物件,彼此可以共同存取同一個靜態變數。

設定一個靜態變數來記錄總共產生了多少個物件的程式碼如下:

程式碼說明: 在上面的main程式碼中,產生了兩個類別sta的物件,使得靜態變數的值變成2。

B1-3 巢狀類別 一般類別與巢狀類別 以建構函數建立內部類別物件 匿名類別

一般類別與巢狀類別: 一般類別與巢狀類別(Nested Class)的執行功能並沒有差異,只是表示方法的不同。

例如以下的程式碼,類別b1_03_01與類別pos_xy6彼此沒有從屬關係:

將類別pos_xy6變成為類別b1_03_01的一個成員的程式碼如下:

程式碼說明: 當一個類別是另一個類別的成員時,這個類別就稱為巢狀。也就是說,類別pos_xy6是一個巢狀類別。 類別pos_xy6的型態宣告為static,當巢狀類別沒有宣告為static時,則稱為內部類別(inner class)。

以建構函數建立內部類別物件: 前面的程式例中,並沒有建立整個程式類別的物件,也可以將整個程式當作一個類別,而在main()程式中建立整個程式類別的物件。

建立整個程式類別的物件,程式改寫如下:

程式碼說明: b1_03_02()是類別b1_03_02的建構函數。 在main()程式中建立obj物件時,就會自動呼叫建構函數b1_03_02(),以產生內部類別pos_xy6的物件。 類別pos_xy6與前一小節不同,沒有將型態宣告為static,而這種類別就是前一小節提到的內部類別(inner class)。

匿名類別: 不具名稱的內部類別(inner class)就稱之為匿名類別(Anonymous class),或稱為匿名內部類別(Anonymous inner class)。 匿名類別必須繼承一個已經存在的類別,藉由繼承來定義匿名類別的內容。

包含匿名類別的程式碼如下:

B1-4 物件陣列 物件與自定資料型態 建立物件陣列 物件陣列的排序

物件與自定資料型態: 陣列(Array)是指用來表示一群相同型態變數的資料型態,而相同型態的物件也可以使用陣列的方式來表示。

如何宣告變數來儲存下面三年甲班第一次月考的國文和數學成績?

成績表說明: 上列成績表包含id、name、chinese、math等四個欄位。 id和name兩個欄位必須使用字串變數來儲存。 chinese和math可以使用整數或浮點數變數來儲存。

利用陣列技巧宣告如下: String id[]={"A01","A02","A03","A04","A05", "A06","A07","A08", "A09","A10"}; String name[]={"Jack","John","Mary","Sam", "Paul","Mike","Cici","Coco","Bob","Kai"}; int chinese[]={90,85,75,88,95,92,80,90,95,92}; int math[]={95,92,88,79,90,82,83,67,79,94};

程式碼說明: 第一位學生的資料分別放在id[0],name[0],chinese[0],math[0]等元素中。 第二位學生的資料分別放在id[1],name[1],chinese[1],math[1]等元素中,以此類推!

利用class命令建立一個類別來儲存學生基本資料,如下所示:

利用這個類別產生每一位學生的資料物件,產生物件的方式有下列兩種:

以下是完整的程式碼:

程式編譯與執行結果如下:

建立物件陣列: 陣列(Array)是指用來表示一群相同型態變數的資料型態,所以用來儲存學生資料的物件,也可以使用陣列方式來表示,以增加程式撰寫的靈活度。 要建立物件陣列,首先要建立物件陣列指標,例如: std_data std[]=new std_data[10]; 接著再分別指定每一個物件指標對應的物件內容,例如: std[0]=new std_data("A01","Jack",90,95);//陣列元素0指向的物件 std[1]=new std_data("A02","John",85,92);//陣列元素1指向的物件

以下是完整的程式碼舉例:

程式編譯與執行結果如下:

物件陣列中的內容也可以進行排序(由大到小或由小到大),根據排序的結果交換物件的內容。 物件陣列的排序: 物件陣列中的內容也可以進行排序(由大到小或由小到大),根據排序的結果交換物件的內容。 要交換std[0]和std[1]物件內容,必須使用一個相同型態的物件做為暫存區,下面就是交換std[0]和std[1]物件內容的程式碼: std_data std_ temp; std_temp=std[0]; std[0]=std[1]; std[1]=std_temp;

以下就是由大到小排列學生成績的完整程式碼:

程式編譯與執行結果如下:

B1-5 練習與實作 三角形面積 矩形的周長和面積 使用密碼查詢餘額 計算存款利息

三角形面積: 撰寫一個triangle類別,使用public公有成員宣告base、high變數,建立類別的物件並設定底為12、高為18,計算顯示出三角形面積。 利用上述條件,再撰寫一個使用private私有成員宣告求得三角形面積的程式。

問題解析與程式設計: 建立一個triangle類別(class)包含宣告public的變數屬性和計算三角形面積的area()方法。 利用triangle類別建立obj物件,設定obj物件的base、high變數屬性為12和18,即可得知三角形的底和高。 最後呼叫物件的area()方法(method),顯示出三角形的面積。

定義類別的方式如下: //定義類別triangle三角形 class triangle { //也可以僅使用int宣告 public int base; //公有成員 public int high; //公有成員 public int area(){ return (base*high)/2; } //方法 };

設定obj物件的方式如下: //建立 triangle 類別的物件 triangle obj=new triangle(); obj.base=12;  //設定物件的base屬性 obj.high=18;  //設定物件的high屬性

呼叫物件的area()方法(method): System.out.println("三角形面積:"+obj.area());

完整程式碼:

使用private私有成員方式來建立類別內的變數屬性: 須透過方法(method)來存取宣告變數的值和設定存取所建立類別的物件。

程式的解析如下: 在triangle類別(class)內包含了宣告private的變數屬性、存取宣告變數(set_base、set_high)的方法、計算三角形面積的area()方法。 利用triangle類別建立obj物件,設定obj物件的set_base、set_high方法屬性為12和18,即可得知三角形的底和高。

定義triangle類別方式如下: private int base; //私有成員 private int high; //私有成員 public void set_base(int a){ base=a; } //方法 public void set_high(int a){ high=a; } //方法 public int area(){ return (base*high)/2; }//方法

建立obj物件的方法如下: //建立 triangle 類別的物件 triangle obj=new triangle(); obj.set_base(12); //設定set_base方法的屬性 obj.set_high(18); //設定set_high方法的屬性

矩形的周長和面積: 利用建構函數和傳回變數的兩種方式,撰寫一個rectangle類別,並在建構函數內設定矩形的長12、寬18,分別計算顯示出矩形的周長和面積。

問題解析與程式設計: 建立一個rectangle類別(class),並設定屬性length、wide變數為私有成員及計算矩形的周長和面積的方式。 透過rectangle建構函數給予length、wide變數的初值。 使用方法傳回變數值。

建立一個rectangle類別(class)的程式碼如下: private int length; //私有成員 private int wide; //私有成員 public int girth(){ return 2*(length+wide); } //方法 public int area(){ return length*wide; } //方法

透過rectangle建構函數給予length、wide變數的初值: //建構函數 triangle(){ base=12;high=18; }

使用方法傳回變數值的程式碼如下: //傳回三角形面積值 int a=obj.area();

完整程式碼:

使用密碼查詢餘額: 模擬一般提款機的查詢餘額功能,讓使用者輸入密碼(1234)後,即會顯示帳號(A0002)、戶名(John)、存款(581000)等資料,若輸入其他密碼,則顯示密碼錯誤。 請以巢狀類別的方式,建立user_data紀錄使用者資料的類別和建構函數,並宣告id、name、password、money變數屬性。

問題解析與程式設計: 建立一個user_data類別(class)包含宣告變數id、name、password、money的屬性,以及建構函數。 建立物件obj儲存放置使用者的id、name、password、money資料。 判斷輸入的密碼是否等於預設的密碼(1234),正確則顯示明細資料,否則顯示密碼錯誤。

下列為建構函數的程式碼: user_data(String str1,String str2,String str3, double v1) { id=str1;name=str2;password=str3;money=v1; }

建立物件obj放置使用者資料方式如下: //建立obj物件儲存user的資料 user_data obj=new user_data("A00002", "John","1234",581000);

判斷輸入的密碼是否等於預設的密碼: if(obj.password.compareTo(key)==0){ System.out.println("帳號:"+obj.id+“ \n戶名:"+obj.name+"\n存款:"+obj.money); }else { System.out.println("密碼錯誤!!"); }

完整程式碼:

計算存款利息: 利用物件陣列的方法記錄下表欄位資料,然後計算一路發銀行的客戶存款利息,設定利率為5%,並顯示出每位客戶的帳號、戶名、金額、利息。 請以巢狀類別的方式,建立cus_deposit紀錄銀行客戶資料的類別,並宣告id、name、money和rate()方法。

銀行客戶資料表:

問題解析與程式設計: 建立一個cus_deposit類別(class)包含宣告變數id、name、money的屬性和計算利息的rate()方法,以及建構函數。 宣告物件陣列和儲存陣列資料。 透過rate()方法來取得計算利息的值,並顯示陣列資料的內容。

下列為宣告計算利息的rate()方法的程式碼: public double rate(){ return money*0.05; }

宣告物件陣列和儲存陣列資料的方式如下: //宣告包含10個物件的物件陣列 cus_deposit cus[]=new cus_deposit[10]; cus[0]=new cus_deposit("A0001","Jack",150000); cus[1]=new cus_deposit("A0002","John",210000); : cus[9]=new cus_deposit("A0010","Kai",1920000);

透過rate()方法來取得計算利息的值,並顯示陣列資料的內容的程式碼如下: for(int i=0;i<10;i++){ cus[i].rate(); System.out.println("id="+cus[i].id+"\t name="+cus[i].name+"\t money=“ +cus[i].money+ "\t rate="+cus[i].rate()); }

完整程式碼: