Ch08 巢狀類別 物件導向程式設計(II).

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具.
第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
项目6 通用堆栈.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
面向对象程序设计(Java) 徐志红
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
第二章 JAVA语言基础.
類別與物件 Class & Object.
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
Ch07 介面與多重繼承 物件導向程式設計(II).
JAVA程序设计 (03) JAVA Programming
第5章 进一步讨论对象和类.
第三章 控制结构.
再回首: Java关键字 数据类型:byte boolean char double float int long short ,
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
程式設計實作.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
第四章 在 C# 中实现 OOP 概念.
Java语言程序设计 第七部分 多线程.
Java基础 JavaSE异常.
Classes Lecturer: 曾學文.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第六章 类的扩展与继承.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
本單元介紹何謂變數,及說明變數的宣告方式。
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
Ch10 類別與物件-方法 Java程式設計(2).
程式設計實作.
Java程序设计 第9章 继承和多态.
Ch01 物件與類別複習 物件導向系統實務.
類別的繼承 Vehicle Car.
SPOTO TM JAVA课程 JAVA中的OO语法
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
异常及处理.
Php class 組員: 賴羿陵 林昱廷 莊正暉 張雅晴
Java程序设计 第2章 基本数据类型及操作.
第5讲 使用类和对象编程(三) 内部类 实例 程序控制结构 选择语句.
Ch02-基礎語法.
C/C++/Java 哪些值不是头等程序对象
第一單元 建立java 程式.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Interfaces and Packages
第二章 Java语法基础.
辅导课程十一.
第二章 Java基本语法 讲师:复凡.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
辅导课程十二.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

Ch08 巢狀類別 物件導向程式設計(II)

巢狀類別-說明 在Java類別之中可以擁有其它類別的成員,這種類別稱為「巢狀類別」(Nested Classes)。 巢狀類別強調類別之間的關係,成員類別稱為「內層類別」(Inner Classes)。 例如:Employee巢狀類別擁有成員類別Phone的內層類別,Employee是巢狀類別的「外層類別」(Enclosing Class)。

巢狀類別-圖例 Employee物件的圖例,如下圖所示:

巢狀類別-範例 class Employee // Employee外層類別 { ………… class Phone // Phone內層類別 …………… }

巢狀類別-特點 巢狀類別強調類別間的關係,例如:員工擁有連絡電話的資料,所以Phone類別屬於Employee類別的一部分。 巢狀類別的內層類別也屬於外層類別的成員,所以其它成員可以存取或呼叫內層類別的成員變數和方法,就算是宣告成private的都一樣可以存取,反之內層類別的方法也可以直接存取其它成員變數和呼叫成員方法。 在Java程式檔案只允許一個宣告成public的類別,如果巢狀類別宣告成public,內層類別也能夠擁有public的存取權限。

範例1 class Employee0603 { String name; Phone0603 list; Employee0603(String name, String home, String cell) { this.name = name; list = new Phone0603(home, cell); } void printEmployee() { System.out.println("在Employee類別內"); System.out.println("===== 員工 ====="); System.out.println("姓名: " + name); System.out.println("利用呼叫內部物件的屬性來取得電話 ==>"); System.out.println("電話(住家): " + list.home); System.out.println("行動電話: " + list.cell); System.out.println("利用呼叫內部物件的方法printPhone來取得電話 ==>"); list.printPhone(); String getName() { return name; } class Phone0603 { String home; String cell; public Phone0603(String phone1, String phone2) { home = phone1; cell = phone2; void printPhone() { System.out.println("利用呼叫外部的物件方法==>"); System.out.println("姓名: " + getName()); System.out.println("電話(住家): " + home); System.out.println("行動電話: " + cell); class Ch06_03 { public static void main(String [] args) Employee0603 e1 = new Employee0603("ToTo", "07-111-1111", "0911-111-111"); System.out.println("呼叫物件方法printEmployee"); e1.printEmployee(); System.out.println("呼叫e1物件中的list物件的方法printPhone"); e1.list.printPhone(); System.out.println("呼叫e1物件中的list物件的屬性home和cell"); System.out.println("電話(住家): " + e1.list.home); System.out.println("行動電話: " + e1.list.cell); }

內層類別的使用-範例(1/2) 例如:Customer巢狀類別,如下所示: class Customer // Customer外層類別 { ……… class Address // Address內層類別 }

內層類別的使用-範例(2/2) 在Java程式需要先建立Customer物件,才能建立Address物件,如下所示: Customer c1 = new Customer(“ToTo", 29001234); Customer.Address home = joe.new Address(); 上述程式碼先使用new運算子建立joe參考的Customer物件,接著使用Customer.Address宣告物件變數home,然後使用joe.new建立Address物件,最後指定成員變數值,如下所示: home.address = "台北縣五股鄉成泰路一段"; home.zip = 248;

範例2 class Employee0604 { String name; Employee0604(String name) class Ch06_04 { public static void main(String [] args) Employee0604 e1 = new Employee0604("ToTo"); Employee0604.Phone0604 p1 = e1.new Phone0604("07-111-1111", "0911-111-111"); System.out.println("呼叫物件方法printEmployee"); e1.printEmployee(); System.out.println("呼叫p1物件中的方法printPhone"); p1.printPhone(); System.out.println("呼叫p1物件中的屬性home和cell"); System.out.println("電話(住家): " + p1.home); System.out.println("行動電話: " + p1.cell); } class Employee0604 { String name; Employee0604(String name) { this.name = name; } void printEmployee() { System.out.println("在Employee類別內"); System.out.println("===== 員工 ====="); System.out.println("姓名: " + name); } String getName() { return name; } class Phone0604 { String home; String cell; Phone0604(String phone1, String phone2) { home = phone1; cell = phone2; void printPhone() { System.out.println("利用呼叫外部的物件方法==>"); //System.out.println("姓名: " + getName()); System.out.println("電話(住家): " + home); System.out.println("行動電話: " + cell);

巢狀類別(內部類別) 位於另一個類別之內的類別稱之為內部類別(inner classes),或稱為巢狀類別(nested classes) 靜態內部類別 非靜態內部類別 區域內部類別

靜態內部類別 使用static修飾字宣告的內部類別,稱為靜態內部類別(static inner classes)。 靜態內部類別和類別內其它靜態成員一樣,都屬類別所有,所以類別方法可以直接使用靜態內部類別建立物件。 若某個類別欲使用另一個類別的靜態內部類別時,必須以點運算子(dot operator)指明靜態內部類別所屬的類別,才可使用

內層類別的使用-說明 巢狀類別的內層類別屬於外層類別的成員物件,所以不能宣告成static(???)的類別變數和方法,而且只有外層類別的物件存在時,內層類別才會存在。

範例3 class Employee0605 { String name; Phone0605 list; Employee0605(String name, String home, String cell) { this.name = name; list = new Phone0605(home, cell); } void printEmployee() { System.out.println("在Employee類別內"); System.out.println("===== 員工 ====="); System.out.println("姓名: " + name); System.out.println("利用呼叫內部物件的屬性來取得電話 ==>"); System.out.println("電話(住家): " + list.home); System.out.println("行動電話: " + list.cell); System.out.println("利用呼叫內部物件的方法printPhone來取得電話 ==>"); list.printPhone(); String getName() { return name; } static class Phone0605 { String home; String cell; public Phone0605(String phone1, String phone2) { home = phone1; cell = phone2; void printPhone() { System.out.println("利用呼叫外部的物件方法==>"); //System.out.println("姓名: " + getName()); System.out.println("電話(住家): " + home); System.out.println("行動電話: " + cell); class Ch06_05 { public static void main(String [] args) Employee0605 e1 = new Employee0605("ToTo", "07-111-1111", "0911-111-111"); System.out.println("呼叫物件方法printEmployee"); e1.printEmployee(); System.out.println("呼叫e1物件中的list物件的方法printPhone"); e1.list.printPhone(); System.out.println("呼叫e1物件中的list物件的屬性home和cell"); System.out.println("電話(住家): " + e1.list.home); System.out.println("行動電話: " + e1.list.cell); }

範例4 class Employee0606 { String name; Employee0606(String name) { this.name = name; } void printEmployee() { System.out.println("在Employee類別內"); System.out.println("===== 員工 ====="); System.out.println("姓名: " + name); } String getName() { return name; } static class Phone0606 { String home; String cell; Phone0606(String phone1, String phone2) { home = phone1; cell = phone2; void printPhone() { System.out.println("利用呼叫外部的物件方法==>"); //System.out.println("姓名: " + getName()); System.out.println("電話(住家): " + home); System.out.println("行動電話: " + cell); class Ch06_06 { public static void main(String [] args) Employee0606 e1 = new Employee0606("ToTo"); Employee0606.Phone0606 p1 = new Employee0606.Phone0606("07-111-1111", "0911-111-111"); System.out.println("呼叫物件方法printEmployee"); e1.printEmployee(); System.out.println("呼叫p1物件中的方法printPhone"); p1.printPhone(); System.out.println("呼叫p1物件中的屬性home和cell"); System.out.println("電話(住家): " + p1.home); System.out.println("行動電話: " + p1.cell); }

非靜態內部類別 沒有static修飾的內部類別稱為非靜態內部類別(non-static inner classes)。 非靜態內部類別和其它物件成員一樣,都必須建立物件才能使用。 以非靜態內部類別所建立的實體,實際上都必須與外部類別的實體結合在一起。因為沒有外部類別所建立的實體,就沒有非靜態內部類別的建構子

區域內部類別 定義於方法內的類別,稱為區域內部類別(local inner classes)。 區域內部類別不屬於外部類別的類別成員,也不是物件成員,其性質就像區域變數一樣,只能在定義的方法內使用,而且必須先定義才能使用。 區域內部類別不使用public、protected、private和static等修飾字。 區域內部類別可以取用外部方法中以final宣告的變數,不是以final宣告的變數不能取用

修飾字(1/3) 存取權限修飾字

修飾字(2/3) 被修飾者可用的存取權限修飾字 修飾字 類別 屬性 建構子 方法 內部類別 public  protected (default) private

修飾字(3/3) 被修飾者可用的修飾字 修飾字 類別 屬性 建構子 方法 內部類別 abstract  final native static strictfp synchronized transient volatile

類屬(is a) 和擁有(has a) class A extends B implements C, D { E e; F f; A(){ e = new E(); f = new F(); } 類屬(is a)關係為物件和類別(或介面)之間的關係。A型別的物件可以類屬於類別A、類別B、介面C和介面D。 擁有(has a)關係為物件和物件之間的關係。A型別的物件擁有E型別的物件及F型別的物件。

內部類別與繼承 父類別包含內部類別時,子類別也可以繼承內部類別,如同繼承其它成員一樣。 內部類別可以有繼承關係,而且沒有特別限制。

範例5:內部類別繼承其它類別 class EX8_23 { //靜態內部類別,繼承Super23 static class Sub1 extends Super23 {} //一般內部類別,繼承Super23 class Sub2 extends Super23 {} public static void main(String [] args) { System.out.println( new EX8_23.Sub1() ); System.out.println( new EX8_23().new Sub2() ); //區域類別,繼承Super23 class Sub3 extends Super23 {} System.out.println( new Sub3() ); } } //Super23類別定義 class Super23 { Super23() { System.out.print("Super23建構子被呼叫了\t"); } }

匿名類別(Anonymous classes)是區域內部類別的一種,顧名思義匿名類別沒有名稱,所以也不能定義建構子。 匿名類別的目的只是要建立一個物件,物件建立之後就不會再使用該類別。 匿名類別常當作覆蓋或實作抽象方法之用。

匿名類別 匿名類別的功能就是只建立一個物件,所以類別主體的定義和建立物件是一氣呵成的。 繼承類別建立匿名類別: 實作介面建立匿名類別: new 父類別(參數列) { // 類別主體 } 實作介面建立匿名類別: new 介面() { // 類別主體 }

範例6:匿名類別 class EX8_25 { public static void main(String [] args) { Sup s = new Sup() { //實體初始化區塊 { System.out.println(this); } void m() //覆蓋方法 { System.out.println(“覆蓋過的m方法”); } void n() //匿名類別自訂的方法 { System.out.println(“自訂的n方法”); } }; s.m(); //s.n(); //錯誤 } //Sup類別定義 class Sup { void m() { System.out.println("Sup實體的m方法");