Microsoft PowerPoint htm

Similar documents
運算子多載 Operator Overloading

The Embedded computing platform

Microsoft Word - 投影片ch11

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

软件工程文档编制

投影片 1

Microsoft PowerPoint - ch6 [相容模式]

javaexample-02.pdf

Microsoft Word - chap12.doc

Microsoft Word - 01.DOC

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

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

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

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

Java

Microsoft Word - ch04三校.doc

untitled

Chapter 9: Objects and Classes

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

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

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

Strings

C/C++程序设计 - 字符串与格式化输入/输出

Microsoft PowerPoint - P766Ch06.ppt

Strings

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

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

EJB-Programming-4-cn.doc

3.1 num = 3 ch = 'C' 2

chp6.ppt

基于CDIO一体化理念的课程教学大纲设计

FY.DOC


untitled

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

c_cpp

投影片 1

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

(procedure-oriented)?? 2

Microsoft Word - chap10.doc

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

投影片 1

JavaIO.PDF

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

ch_code_infoaccess

第3章.doc

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

新版 明解C++入門編

Microsoft Word - JAVA Programming Language Homework I ans

JBuilder Weblogic

一、

文档 3

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

《大话设计模式》第一章

IoC容器和Dependency Injection模式.doc

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

資料結構之C語言重點複習

CC213

java2d-4.PDF

CC213

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

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

第二章 簡介類別

概述

運算子多載 Operator Overloading

<4D F736F F D C4EAC6D5CDA8B8DFB5C8D1A7D0A3D5D0C9FAC8ABB9FACDB3D2BBBFBCCAD4CEC4BFC6D7DBBACDCAD4BEEDBCB0B4F0B0B82DD6D8C7ECBEED2E646F63>

untitled

Adobe® Flash® 的 Adobe® ActionScript® 3.0 程式設計

C/C++语言 - C/C++数据

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

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

Microsoft PowerPoint - course2.ppt

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

CU0594.pdf

无类继承.key

Transcription:

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

Java 物件的建立與初始化 建構子 (Constructor) 重載建構子 this 關鍵字的使用 欄位與方法的初始值設定 靜態初始函式 實體初始函式 Class 4 3 重載 (overloaded) 的方法 重載方法 : 可以在同一個類別中定義許多同名的方法 overloaded method 是多重變形法則中的一種 多重參數變形 / 多型 (parametric polymorphism) 當要執行到某個重載的方法時, 編譯器會針對傳入的參數型態對應到正確的方法 ( 所以是在編譯的時候就會決定 ) 每個同名的方法都會有不同數量或不同型態的參數 ( 這樣才不會造成混淆 ), 藉此來區別之! 重載的方法只會出現在同一個類別裡面 ( 不包括繼承的子類別 ) Class 4 4

重載 (overloaded) 的方法 Java PrintStream 的 print() 就是一個多重載的方法,print() 可以印出基本型態與物件 class PrintStream { void print( Object arg ) { void print( String arg) { void print( char [] arg ) { Class 4 5 Java 物件的建立與初始化 欄位與方法的初始值設定 public static final double PI = 3.14; public double r = 1.0; public class TestClass { public int len = 10; public [] int = new int [len]; public TestClass() { for ( int i = 0; i < len; I++ ) { table[i] = i; Class 4 6

Java 物件的建立與初始化 靜態初始函式 跟類別方法一樣, 不能使用 this 或是該類別中任何的實體欄位或方法 public class TrigCircle { private static final int NUMPTS = 500; private static double sines [] = new double[numpts]; static { double x = 0.0, delta_x; double delta_x = (Circle.PI/2) / (NUMPTS - 1); for( int m = 0; x = 0.0; m++, x =+ delta_x ) { sines[m] = Math.sin(x); Class 4 7 Java 物件的建立與初始化 實體初始函式 private static final int NUMPTS = 500; private int [] data = new int [NUMPTS]; { for( int m = 0; m < NUMPTS; m++ ) { data [m] = m; 較少以這方式來初始化實體方法 Just for your information! Class 4 8

Java 物件的摧毀與終結 不同於 C/C++ 使用 free() or delete operator 來釋放掉物件所佔用的記憶體空間, Java 會自動作資源回收 (garbage collection) 若需要手動終結, 可使用 finalize() finalize() 是實體方法, 沒有任何引數或傳回值 每個類別只能有一個終結函式 protected void finalize() throws Throwable { tempfile.delete(); // 假設有 tempfile 這暫存檔 Class 4 9 Java 子類別與繼承 (Inheritance) Java 只允許單一繼承, 但提供以介面 (interface) 的方式, 來替代 C++ 中的多重繼承 遮蔽 (shadowed) 超類別的欄位當一系列繼承的物件有相同名稱的方法時, 下層的方法會永遠遮蔽上層的方法 改寫或覆蓋 (overrided) 超類別的方法若不想被改寫, 只要宣告它為 final 即可 final 也可以用在類別上, 如此它將不會再有子類別 Class 4 10

Java 子類別與繼承 對於類別靜態欄位與方法, 只能被遮蔽, 不能被改寫 Class 4 11 類別的延伸 public class Circle { public static final double PI = 3.14159; public static double radstodegrees(double rads) { return rads * 180 / PI; public double r; public double area() { return PI * r * r; public double circumference() { return 2 * PI * r; [next] Class 4 12

public class PlaneCircle extends Circle { // 自動繼承 Circle 的類別靜態欄位與方法 PI = 3.14159 與 radstodegrees() // 也繼承了 Circle 中的實體方法 area() 與 circumference() // 定義新的子類別欄位與方法 public double cx, cy; public PlaneCircle(double r, double x, double y) { super( r ); this.cx = x; this.cy = y; public boolean isinside( double x, double y ) { double dx = x cx, dy = y cy; double distance = Math.sqrt( dx*dx + dy*dy ); return ( distance < r ); Circle PlaneCircle Class 4 13 子類別與繼承 Another Simple Example class Animal { float weight; void eat() { class Mammal extends Animal { int heartrate; // inherits weight from Animal class void breathe() { // inherits eat() class Cat extends Mammal { boolean longhair; // inherits weight and hearrates void purr() { //inherit eat() and breathe() Animal Mammal Cat Class 4 14

超 ( 父 ) 類別及類別階層 public PlaneCircle( double r, double x, double y ) { super( r ); // 引用超類別的建構子 Cricle () this.cx = x; this.cy = y; 依賴超類別建構子 super() 這種用法來作繼承物件的初始化, 有一些規則 : super() 必須出現在子類別的建構子中 必須出現在第一行敘述裡, 也必須出現在變數宣告之前 super( 參數 ) 括號內所傳的參數需與父類別建構子內的參數一致 Class 4 15 超 ( 父 ) 類別及類別階層 ( 續 ) 如果建構子的第一行敘述中沒有使用 this() 或 super() 來明確呼叫及他的建構子, 則 Java 會自動暗中插入 super() 呼叫, 這個預設的建構子除了呼叫超類別建構子之外, 什麼事都不做 public PlaneCircle() { super(); Class 4 16

超 ( 父 ) 類別及類別階層 結語 ( 每個被啟用的建構子會有三個程序 ): 如果建構子的第一行敘述是一個普通的敘述, 不是 this() 或 super(), 則 Java 會自動加入一個 super() 來啟動父類別的預設建構子, 由它所傳回的初始化實體來進行子類別接下來的敘述 如果建構子的第一行敘述即呼叫了 super(), 則 Java 會啟用這個選定好的父類別建構子, 由其所傳回的已初始化實體來進行接下來的敘述 若建構子第一行敘述是呼叫 this(), 則 Java 會啟用特定的重載建構子 ( 並暗中呼叫父類別建構子 ), 然後回來進行接下的敘述 Class 4 17 遮蔽 (shadowed) 超類別的欄位 對於實體的欄位與方法 : 當一系列繼承的物件有相同名稱的方法時, 下層的方法會永遠改寫上層的方法 若不想被改寫, 只要宣告它為 final 即可 欄位 (data) 只會被遮蔽 若一個父類別的欄位或方法是 static 時, 在子類別中, 也只能以 static 的欄位方法來遮蔽 對於類別靜態欄位與方法 : 只能被遮蔽, 不能被改寫 Class 4 18

遮蔽超類別的欄位 class IntegerCalculator { int sum; class DecimalCalculator extends IntegerCalculator { double sum; // shadowed the var. sum from super class this.sum double super.sum int Class 4 19 public class PlaneCircle extends Circle {.. r // PlaneCircle 的欄位 this.r // PlaneCircle 的欄位 super.r // Circle 的欄位強制轉換! ((Circle) this).r // 指到 Circle 的欄位 若有三個類別 : A, B extends A, C extends B x // C 的 x 欄位 this.x // 指的是 C 的 x 欄位 super.x // 指的是 B 的 x 欄位 ((B) this).x // 指的是 B 的 x 欄位 ((A) this).x // 指的是 A 的 x 欄位 super.super.x // 沒這樣的寫法喔, 只能得到父親, 看不到祖父的!! 若有一個實體物件 c, 則我們有如下的寫法 : c.x // 指的是 C 的 x 欄位 ((B).c).x // 指的是 B 的 x 欄位 ((A) c).x // 指的是 A 的 x 欄位 Circle PlanCircle Class 4 20

改寫 (overrided) 超類別的方法 物件導向程式語言的特色 多重變形法則 (Polymorphism) simple example: Class 4 21 class A { int I = 1; int f() { return I; static char g() { return A ; class B extends A { int I = 2; int f() { return -I; static char g() { return B ; public class OverrideTest { B b = new B(); // 建立 B 物件 System.out.println(b.I); // 意指 :B.I 印出 -2 System.out.println(b.f()); // 意指 :B.f() 印出 -2 System.out.println(b.g()); // 意指 :B.g() 印出 B System.out.println(B.g()); // 引用 B.g() 較好的方法 A a = (A) b; // 意指 : 將 b 強制轉型為 A 的物件 System.out.println(a.I); // 意指 :A.I 印出 1 System.out.println(a.f()); // 意指 :B.f() 印出 -2 System.out.println(a.g()); // 意指 :A.g() 印出 A System.out.println(A.g()); // 引用 A.g() 較好的方式 Class 4 22

改寫方法與動態連結 重載的方法 (overload) 會在編譯時就決定 改寫的方法 (overwrite) 會在執行的時會才動態確定 若我們同時擁有 Circle 與 PlaneCircle 物件, 各自定義了 area() 這方法, 當直譯器在執行的時候, 會做動態查詢的動作, 已決定使用哪以方法 這方式, 基本上與 C++ 中的虛擬函數做的事情是一樣的 Class 4 23 介面 (Interface) 問題 : 若一個類別已經延伸某個父類別, 但我們又想加進其它的欄位或方法? 答案 : 因為只能有單一繼承, 解決的方法是 實作介面 Class 4 24

介面 (Interface) 介面 : 是一種參考型態 ( 會與實作這介面的類別有親密關係 ) 定義一個介面 (= 等待實作的 API): 介面內所有的方法都是 abstract( 即使沒加上 abstract 修飾元 ) 介面只能包含抽象 ( 實體 ) 方法與 static final 欄位 介面是 public 的, 其內的抽象方法也一定都要是 public, 就算沒明寫也都內定是 public 介面不包含建構子, 所以不能被實體化 Class 4 25 介面 (Interface) example: public interface Centered { static final double original_point = 0.0; public abstract void setcenter(double x, double y); public double getcenterx(); public double getcentery(); // 一般的介面都會取名為 [a-z]*able Class 4 26

實作一個介面 實作一個介面 implements 若實作兩個以上的介面以, 逗號區隔 一個類別若要 implements 某個介面, 就一定要把所有的抽象方法都作出來 Class 4 27 實作一個介面 example A interface Scalable { static final BIG = 0, MEDIUM = 1, SMALL = 2; void setscale( int size ); Class Box implements Scalable { void setscale( int size ) { Switch( size ) { case BIG: case MEDIUM: case SMALL: Class 4 28

實作一個介面 example B, importance! public class CenteredRectangle extends Rectangle implements Centered { private double cx, cy; public CenteredRectangle( double cx, double cy, double w, double h ) { super( w, h ); this.cx = cx; this.cy = cy; // implements all abstract methods in interface Centered public void setcenter( double x, double y ) { cx = x; cy = y; public double getcenterx() { return cx; public double getcentery() { return cy; Class 4 29 使用一個介面 example C, importance! 像上一個程式範例, 若我們實作了 CenteredCircle CenteredSquare 且 Circle Square Rectangle 都繼承了 Shape( 抽象類別的範例程式 ), 所以 CenteredRectangle CenteredCircle CenteredSquare 都是 Shape 的實體 ; 同時, 也是 Centered 型態的實體 // 建立一個陣列儲存一些形狀, 不需要強制轉換 ( 放大 ) Shape [] shapes = new Shape [3]; shapes [0] = new CenteredCircle( 1.0, 1.0, 1.0 ); shapes [1] = new CenteredSquare( 2.5, 2, 3 ); shapes [2] = new CenteredRectangle( 2.3, 4.5, 3, 4 ); [ next page ] Class 4 30

使用一個介面 double totalaera = 0; double totaldistance; for ( int I = 0; I < shapes.length; I++ ) { totalarea = totalarea + shapes[i].area(); if ( shapes[i] instanceof Centered ) { Centered c = (Centered) shapes[i]; // Shape Centered 縮小轉換 double cx = c.getcenterx(); double cy = c.getcentery(); totaldistance += Math.sqrt( cx*cx + cy*cy ); System.out.println( Average area: + totalaverage/shapes.length ); System.out.println( Average distance: + totaldistance/shapes.length ); Class 4 31 多重介面 public class SuperDuperSquare extends Shape implements Centered, UpperRightCornered, Scalable { 別忘了! 每個實作的介面中所有抽象方法都要實體化! Class 4 32

介面的延伸 ( 子介面 ) 子介面 (subinterface): 一個介面可以繼承父介面 (superinterface) 中所有的抽象方法與常數, 並且可以定義新的抽象方法與常數 不同於類別的繼承, 一個介面可以同時繼承多個的介面 public interface Positionable extends Centered { public void setupperrightcorner( double x, double y ); public double getupperrightx(); public double getupperrighty(); public interface Transformable extends Scalable, Translatable, Rotatable { public interface SuperShape implements Positionable, Transformable { Class 4 33 介面的延伸 ( 子介面 ) Herein, we can define one interface based on another by using the keyword extends to identify the base interface name. This is essentially the same from we use to derive one class from another. Some care is necessary if we do implements multiple interfaces. All methods and constants that are members of these interfaces will be incorporated. If both super-interfaces have a method with the same signature, that is, with identical name and parameters, they must also have the same return type, otherwise the compiler will report errors. ( 若兩個父介面定義了同一個特徵, 則這兩個特徵的回傳值必須也相同 : 編譯器必須把他們視為同一個特徵 )This is because it would be impossible for a class to implement both, as they have the same signature. Class 4 34

介面的延伸 ( 子介面 ) class Dog implements PetOutput void sound() { interface PetOutPut void sound(); class Cat implements PetOutput void sound() { class Duck implements PetOutput void sound() { class Spaniels extends Dog Class 4 35 標示介面 ( 空介面 ) 一個類別可以 implements 某個介面 ( 空介面 ), 不需實作任何方法 在這樣的情形之下, 該類別的任何實體便成為該介面的合法實體 example: 先前提過 : 不是任何物件參照都是可以被 clone(), 只有 implements cloneable 介面的物件始能被 clone() 在 java.lang 的定義中, cloneable 介面是個空介面 裡頭沒有定義任何抽象方法, 其目的只是用來辨別 : 某物件是否允許以 clone() 的方式來複製內部資料 Class 4 36

介面與抽象類別的階層 public class CenteredRectangle extends Rectangle implements Centered { Class Hierarchy Interface Hierarchy Shape Rectangle CenteredRectangle Centered Class 4 37 抽象類別? 介面? 對一介面, 所有的類別都可以實作它, 即使該類別延伸的某個完全不相干的父類別 介面只是一個 API, 使用需要實作它, 每 implements 一次, 就得完全地 重複地實作所有的抽象方法 這情況會在, 多重介面的情況下更加繁複 類別的繼承特性可讓子類別免於繁複的實作動作 但是, 類別的繼承上規定了單一繼承的限制, 這有時會功能設計上的困擾 還好, 抽象類別內可以有非抽象的方法, 這提供了部分的彈性 : 爾後可以調整抽象類別內所提供的方法 Class 4 38

抽象類別? 介面? 相容性! 當一個介面被定義完後, 會成為公用的 API, 爾後若在該介面中又加進一個新的方法, 則先前使用該介面的來實作的類別將會出現相容性的問題 抽象類別允許爾後可以加入非抽象的方法於該類別中, 且無須對之前繼承該抽象類別的類別進行任何的修改 Class 4 39