Microsoft PowerPoint htm

Similar documents
運算子多載 Operator Overloading

Microsoft Word - 投影片ch11

The Embedded computing platform

javaexample-02.pdf

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

EJB-Programming-4-cn.doc

Chapter 9: Objects and Classes

EJB-Programming-3.PDF

Microsoft Word - 物件導向編程精要.doc

Microsoft Word - ch04三校.doc

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

Microsoft PowerPoint - chap08.ppt

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

投影片 1

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

chp6.ppt

投影片 1

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

投影片 1

Microsoft Word - 01.DOC

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Chapter 9: Objects and Classes

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

Microsoft Word - chap10.doc

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

untitled

Strings

untitled

PowerPoint Presentation

運算子多載 Operator Overloading

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点


Microsoft Word - 投影片ch15

无类继承.key

Microsoft Word - JAVA Programming Language Homework I ans

Microsoft Word - chap12.doc

3.1 num = 3 ch = 'C' 2

Microsoft PowerPoint htm

《大话设计模式》第一章

JavaIO.PDF

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

Microsoft Word - Learn Objective-C.doc

Java

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

Microsoft PowerPoint - L17_Inheritance_v4.pptx

一、

软件工程文档编制

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

Microsoft Word - 第6章.doc

Microsoft PowerPoint - chap07.ppt

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

提纲 1 2 OS Examples for 3

Microsoft Word - ACG chapter00c-3ed.docx

Strings

Microsoft Word - ACL CH06

北 风 网 讲 师 原 创 作 品 ---- 仅 供 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

epub83-1

The golden pins of the PCI card can be oxidized after months or years

javac: 负 责 的 是 编 译 的 部 分, 当 执 行 javac 时, 会 启 动 java 的 编 译 器 程 序 对 指 定 扩 展 名 的.java 文 件 进 行 编 译 生 成 了 jvm 可 以 识 别 的 字 节 码 文 件 也 就 是 class 文 件, 也 就 是 ja

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

Excel VBA Excel Visual Basic for Application

untitled

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

PowerPoint Presentation

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

JBuilder Weblogic

(procedure-oriented)?? 2

<4D F736F F F696E74202D20B5DA3035D5C220C3E6CFF2B6D4CFF3B8DFBCB6B3CCD0F2C9E8BCC6>

c_cpp

D C 93 2

Scott Effective C++ C++ C++ Roger Orr OR/2 ISO C++ Effective Modern C++ C++ C++ Scoot 42 Bart Vandewoestyne C++ C++ Scott Effective Modern C++ Damien

附录J:Eclipse教程

全国计算机技术与软件专业技术资格(水平)考试

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

ebook39-5

RunPC2_.doc

mvc

Microsoft PowerPoint - 14Threads.ppt

建立Android新專案

新版 明解C++入門編

Microsoft Word - 投影片ch13

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

Swing-02.pdf

目 錄 壹 青 輔 會 結 案 附 件 貳 活 動 計 劃 書 參 執 行 內 容 一 教 學 內 容 二 與 當 地 教 師 教 學 交 流 三 服 務 執 行 進 度 肆 執 行 成 效 一 教 學 課 程 二 與 當 地 教 師 教 學 交 流 三 服 務 滿 意 度 調 查 伍 服 務 檢

Chapter 9: Objects and Classes

Microsoft PowerPoint - course2.ppt

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Transcription:

Java 程式設計基礎班 (5) 莊坤達台大電信所網路資料庫研究室 Email: doug@arbor.ee.ntu.edu.tw Class 5 1 回顧 繼承概念 Java Interface Class 5 2

套件或包裹 (Package) 套件 (a group of classes) 很類似函式庫 (library ), 組織管理一群類別 編譯單位 : Java 類別中的程式碼就是一個編譯單位 (compilation unit) 要把一個定義好的編譯單位歸類於某個套件, 作法是在其程式碼的第一行敘述寫進 : package mydefine.tools; package mydefine.*; 一個編譯單位只能歸類在一個套件 package 必須依照相對應的目錄而存在 ( 有路徑概念 ) Class 5 3 封裝 (encapsulation)- 資料隱藏 封裝 (encapsulation): 把類別中的資料作適度的隱藏, 只讓可以信賴的使用者使用 ( 類別中的方法 ) 當類別中的所有欄位都隱藏起來的時候, 類別中的方法就可以定義這個類別的物件可能執行的運算 這樣就不會讓你所設計的 API, 在使用上很錯亂, 無法規範 如此, 我們可以來規範存取的權限 : 套件存取權 類別存取權 成員存取權 繼承後的存取權控制 Class 5 4

封裝與可視性 (Visibility) 在同一套件中, 所有的編譯單位 ( 類別 ) 都是彼此可看見對方的 有好的 (friendly) 類似 C++ 中的 friend 基本上, 類別對屬於不同套件的類別沒有存取權 若要使用到屬於不同套件的類別中的欄位與方法, 則類別裡面必須先要 :(import 類別的參照 ) import mydefine.tools.texteditor ; import mydefine.tools.* ; 有時在 import 之後, 會有類別同名的情況, 使用時要指明 packagename.classname.methodname Class 5 5 可視性 - 存取控制權 Java 提供類別中的欄位與方法四種基本的存取控制權 : 沒明定 (default) : 內定的存取權限, 可以被同一個套件中的類別看見 使用 public: 可被任何套件中的類別使用, private: 只能在定義它的該類別中使用, 就算是繼承它的子類別也看不見 protected: 可以被同一個套件中的類別看見 使用, 也可以被其子類別看見, 包括放在不同套件中的子類別 Class 5 6

可視性 - 存取控制權 protected 的可視範圍介於 public 與 private 之間 附註 : 早期的 JDK 版本支援 private protected 的寫法 : 讓 private 的方法與欄位可以被繼承它的子類看見 使用 Class 5 7 可視性 - 存取控制權 ( 續 ) package mydefine.tools class TextComponent protected int linecount; private protected char [] text; private protected void move cursor(); visible only public be visible class TextEditor visible class TextArea extends class BookTextArea extends Class 5 8

可視性 - 存取控制權 ( 續 ) 存取類別 成員可見等級 public protect ed packa ge privat e 相同類別內 o o o o 相同套件內 o o o x 不同套件中的子類別 o o x x 非子類別 不同套件中 o x x x Class 5 9 使用資料隱藏與封裝的 Circle 類別 請見例 1 Class 5 10

內部類別 (Inner Class) - 概論 Java 1.1 之後, 除了先前所套討的一般的類別與介面之外, 額外定義了四種型態的內部類別 (inner class) 靜態成員類別或介面 (static member class) 成員類別 區域類別 匿名類別 Class 5 11 靜態成員類別 為了使用上的方便, 一個靜態的類別 ( 或介面 ) 可以被定義在另一個類別中, 為一靜態成員 ( 類別或介面 ), 與外部類別的靜態方法與欄位的位階相似 內部的介面僅可以被定義為靜態成員 一個類別裡可已有多個靜態的成員類別或介面 因為是靜態不與任何實體有關連, 所以沒有 this 物件 只可以使用同一 ( 外部 ) 類別中的靜態方法與欄位 ( 包含同一外部類別中的靜態類別與介面 ), 不能使用與實體有關連的成員 可以存取同一個外部類別中的 private 成員 Class 5 12

Example 3-8: 定義並使用一個靜態成員介面 public class LinkedStack { public static interface Linkable { // 內部成員類別 : 靜態成員介面 public Linkable getnext(); // 注意! 這樣的作法, 其它的套件看不到 public void setnext( Linkable node ); Linkable head; public void push( Linkable node ) { // 動態實體方法, public Object pop() { // 靜態的成員類別或介面無法使用到 // 此類別實作了靜態成員介面 class LinkableInteger implements LinkedStack.Linkable { int I; public LinkableInteger( int I ) { this.i = I; LinkedStack.Linkable next; public LinkedStack.Linkable getnext() { return next; // 實作的方法 public void setnext( LinkedStack.Linkable node ) { next = node; Class 5 13 靜態成員類別 靜態成員類別的名稱不能與定義它的外部類別同名! 靜態成員類別或介面只可以被 一般 的類別 與其它的靜態成員類別或介面所定義 換句話說, 不能被其他三種 :( 實體 ) 成員 區域類別 匿名類別中被定義 靜態成員類別的語法 : import LinkedStack.*; Class 5 14

( 實體 ) 成員類別 對 ( 外部 ) 類別中的其他欄位與方法的存取方式, 相似於先前所提及的實體方法或欄位 所以可以存取定義的類別中所有的欄位與方法 成員介面不能夠以方式定義 成員類別不能含有任何 static 欄位 方法或類別 ( 但, 允許同時使用以 static final 宣告的常數欄位 ) 注意, 介面不能被定義為成員類別 因為 : 介面不能被實體化! 因此跟所處的類別實體沒有關連 成員類別的名稱不能與定義它的外部類別同名! Class 5 15 Example 3-9: 將 Enumerationru 介面實作成為成員類別 public class LinkedStack { public static interface Linkable { 內容主體省略 // 靜態成員介面 private Linkable head; public void push( Linkable node ) { // 動態實體方法, public Object pop() { // 靜態的成員類別或介面無法使用到 // 實體方法, 傳回值為一 java.util.enumeration 物件 public java.util.enumeration enumerate() { return new Enumerator(); // 定義一個成員類別, 並實作 Enumeration 介面 protected class Enumerator implements java.util.enumeration { Linkable current; public Enumerator() { current = head; // 建構子, 可使用 private 欄位 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; Class 5 16

成員類別 上述的範例中, public Enumerator() { current = head; / / 使用到了 private 欄位 public Enumerator() { this.current = this.head; // compiled error! 因為 this.head 的 this 會被認為是成員類別 public Enumerator() { this.current = LinkedStack.this.head; 成員類別的可視度為 protected, 表示在其他套件中有使用到 LinkedStack 類別的程式區塊, 將看不到 無法存取這成員類別, 但是若是繼承 LinkedStack 的子類別將可以存取它 Class 5 17 成員類別 回想! 欄位與方法的遮蔽 可以使用關鍵字 super 來意被遮蔽的成員 (Java 1.2 新增的功能 ) 建議 : 儘可能的避免在成員類別中宣告與所處類別相同名稱的欄位與方法, 以避免爾後要使用 this 與 super, 也可降低寫程式的複雜程度 Class 5 18

區域類別 區域類別 (local class) 是定義在 Java 程式區塊中的一個內部類別 區域類別只在該程式區塊中是可見的 區域類別不是成員類別 因為不是類別的成員, 所以區域類別不能被宣告為 public protected private 或 static 區域類別與實體相關連, 所以可以存取該 ( 外部 ) 類別所定義的所有成員, 也當然包括 private 成員 區域類別的名稱不能與跟它所處的類別同名! 介面不能被定義為區域類別 Class 5 19 區域類別 區域類別不能含有任何 static 欄位 方法或類別 ( 但, 允許同時使用以 static final 宣告的常數 ) 區域類別可以自行定義欄位與方法 ( 只在該區域類別中有效 ) 區域類別只能使用在定義它的程式區塊中被宣告為 final 的區域變數 方法參數與例外參數 因為 : 區域類別的實體生命可能比定義它的方法的執行時間還長, 為此, 區域類別所使用的區域變數必須要是被宣告為 final, 以確保此區域變數永遠一致 Class 5 20

Example 3-10: 定義並使用區域類別 // 和 example 3-9 比較, // 以區域類別的方式, 來建立並傳回一個 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(); Class 5 21 區域類別的有效領域及範圍 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() 方法 // 這裡已經脫離了區域類別的效領, 因此我們不能再使用它了 Class 5 22

區域類別與區域變數的領域 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() ); Class 5 23 匿名類別 匿名 (anonymous) 類別是一種沒有名稱的類別, 它結合了將類別定義的語法和物件實體化的語法, 換句話說, 就是將類別的定義與物件實體化的語法寫在一起 匿名類別出現的型態, 就很像是一般 Java 的表示式 ( 一段很長的表示式 ) 且可以包含在另一個表示式中 以 new 運算子來定義並且實體化之 相較於區域類別 : 其形式是 Java 的程式區塊中的一段敘述 主要用來 : 定義且使用一個只會在這裡並只被使用一次的類別 (one-shot class) Class 5 24

Example 3-11: 使用匿名類別來定義並實作 Enumeration public java.util.enumeration enumerate() { // 將匿名類別定義為 return 表示式中 ( 敘述 ) 的一部份 return new java.util.enumeration { // 以 new 來實體化 Linkable current; { 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; ; // 注意! 要加上分號作為 return 表示式的結束 Class 5 25 匿名類別 因為匿名類別沒有名稱, 因此也就不可能在類別主體中定義建構子 以實體初始函式來代替建構子 匿名類別一單都適用來延伸較簡單且不需要任何建構子引數的類別 因此匿名類別定義語法中的小括號裡通常是空的 匿名類別與區域類別的限制是相同的 因為不是類別的成員, 所以區域類別不能被宣告為 public protected private 或 static Class 5 26

匿名類別 只允許同時使用以 static final 宣告的常數 ( 不能含有任何 static 欄位 方法或類別 ) 介面不能被定議程這種型態 Class 5 27 何時必須使用匿名類別 匿名類別的行為和區域類別一樣 選擇使用匿名類別的時機 : 類別主體很短 只需要一個類別的實體, 他處不需要 類別在定義後馬上就要使用 類別的名稱是程式易於瞭解的 Class 5 28

內部類別附註 靜態成員類別有時亦被稱為 巢狀最上層類別 (nested top-level classes) 巢狀類別 有時已被用來表示內部類別 Class 5 29 Object : The Universal Superclass 所有類別的源頭都來自 class Object 所有我們定義的類別對 Java 而言都來自於一個標準的基底類別 Object 當我們自行定義一個類別時, 實際上已經 ( 自動 ) 繼承了基底類別 如此, 所有的類別物件, 都可以 ( 放大 ) 轉型為 Object 物件 也因為有共同的基底, 物件可以被當做一個參數來傳遞 ( 只要接收端知道該還原轉型為何即可 ) A variable of type Objects can hold an object of any class. Class 5 30

Members in class Object 既然所有的類別都來自於基底類別, 因此也都繼承基底類別內所定義的成員 也就是說, 每個內別都可以用到這幾個共同的方法 Class 5 31 Members in class Object public tostring() public equals() public final getclass() 這方法的回傳值是一 Sting 物件, 且這方法是可以被 override 的, 藉由 + 來連結 改寫字串 因此, 回傳的內容可自行設定 此方法的目的是在基底類別中宣告 tostring() 已自動提供編譯器一個字串標籤來識別物件 比較兩個物件是否相等 (equivqlent), 注意! 這裡不是 == 這裡的 equivqlent 是比較兩個是否為各自獨立但型態 內容相同的物件 這方法會回傳一個型態為 Class 的類別, 用來識別目前的物件 Class 5 32

Members in class Object public hashcode() 這方法會對目前的物件計算出一個整數型態的 hash code 數值, 並回傳之 其目的是被用來當作索引值來儲存於套件 (package) 中的 hash table, 以利爾後的編譯 public final notify() public final notifyall() public final wait() 這方法可用來喚醒那與物件結合的執行緒 這方法可用來喚醒所有與物件結合的執行緒 這方法可使一個執行緒進入等候狀態, 讓物件中其他相關的動作先執行 Class 5 33 Members in class Object protected clone() protected finalize( ) ( 任何物件型態 ) 物件實體的複製, 非參照的複製 ps: 哪些有 class 需告定義的 注意! 有實作 Cloneable 介面的類別, 其物件才能被複製 當一個物件被 destroyed 時, 這方法會被呼叫來清除之 在我們自行延伸定義的類別中,getClass(), notify(), notifyall(), wait() 不能被覆蓋來改寫 Class 5 34

決定物件的型態 給定 : 我們有一變數 pet, 其型態為 Animal 且 pet 可能參照到某個型態為 Dog, Cat, Duck 的物件 若我們要找出到底參照到的為何者 : Class objecttype = pet.getclass(); // get the class type System.out.println( objecttyoe.getname() ); // output the class name getname() 這方法定義在類別 Class 中, 它會回傳一個目前所參照到物件的識別字串 System.out.println( pet.getclass().getname() ); name // output the class Class 5 35 An Example to Show Derived Class 見 exercise5_1 Class 5 36

Members of the class Classlass 當程式執行的時候,JVM 會自動建立並載入每一個類別或介面的 instances of the class Class 因為是由 JVM 自動產生, 所以這類別中沒有 public 的建構子, 所以我們無法自行建立型態為 Class 的物件 Class 中定義有很多的方法, 使得我們能夠曉得一個類別的詳盡內容 其中最重要的 : Class 5 37 Members of class Class 在 class Object 中提供了 getclass() 這方法來獲得一個物件的類別 而藉由使用 class Class 中的方法, 將可以瞭解到一個類別的物件到底包含了哪些東西 forname() newinstance() 這方法可以用來獲得 或測試某物件的類別名稱 將某物件的名稱以字串的方式傳入, 這方法會把這物件的類別型態的名稱回傳 這方法會呼叫 class Class 的內定建構子, 並回傳一個型態為 Object 的物件 使用時要強制轉型回 instance 的類別型態 注意! 這方法必須要同時配合使用 Exception handler, 否則編譯時會出錯 Class 5 38

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() getinterface() return true, 若目前的物件是一個介面的型態 return 一個陣列 : 內容是這類別物件所有實作的介面 tostring 回傳一字串, 用來表示這物件 Class 5 39 Casting Objects 當兩物件之間有繼承關係時, 可將一物件放大轉型成為上層型態的物件 (upwards through its direct and indirect superclass) 當一物件放大轉換成為某一繼承型態的物件時,Java 會依然保留住原有型態的物件資料 因此, 爾後這物件能夠在縮小轉回原來的型態 此為之前所介紹的 :polymorphism! Class 5 40

A Casting Objects Scenario class Object is derived from class Animal is derived from is derived from is derived from class Cat Cat class Dog Dog class Duck is derived from class Spaniel Class 5 41 Casting Objects 沒有繼承關係的物件之間不能轉換, 但若真的非要以 類似轉型的方式 來使用到某個物件的資料時, 可以用建構子重載的方式來建立一個物件 : public Duck { public Duck( Spaniel aspaniel ) { super( Duck ); // call the base constructor name = aspaniel.getname(); breed = Barking Coot ; Class 5 42

When to Cast Objects 在同一個類別繼承關係中, 可以將某一物件放大轉型後, 又縮小轉回來 需要轉型的理由 : 要使用到某個只存在特定類別中的欄位或方法 In general, you should avoid explicitly casting objects as much as possible, since it increases the potential for an invalid cast and can therefore make your programs unreliable. Most of the time you should find that if you design your classes carefully, you can minimize the need for casting. Class 5 43 Identifying Objects Duck aduck; //declare a duck if( pet instanceof Duck ) { aduck = (Duck)pet; aduck.layegg(); if( pet instanceof Duck ) ((Duck)pet).layEgg(); Class 5 44

Identifying Objects compare to the getclass()? The instanceof operator checks whether a cast of the object referenced by the left operand to the type specified by the right operand is legal. The result will be true if the object is the same type as the right operand, or of any subclass type. Class 5 45