Ch10 類別與物件-方法 Java程式設計(2).

Slides:



Advertisements
Similar presentations
主要内容 Java 的常用包 Java 的常用包 “ == ” 和 “ equals ” 的用法 “ == ” 和 “ equals ” 的用法 基本数据类型与引用类型 基本数据类型与引用类型 String 和 StringBuffer String 和 StringBuffer 对象的克隆( clone.
Advertisements

软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
第3-2章 类与 对象 Java类的特性 教学内容: 类的私有成员与公共成员 方法的重载 构造方法 实例成员与静态成员 重点: 重载 难点:
单元二:面向对象程序设计 任务二:借书卡程序设计.
第四章 类、对象和接口.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目6 通用堆栈.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
Chapter 6 字串與時間處理.
第二章 JAVA语言基础.
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
Ch07 介面與多重繼承 物件導向程式設計(II).
JAVA程序设计 (03) JAVA Programming
1 Department of Computing.
第三章 控制结构.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
Ch08 巢狀類別 物件導向程式設計(II).
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
Ch03 類別與物件 物件導向系統分析與設計.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
常用工具类.
Java基础 JavaSE异常.
Classes Lecturer: 曾學文.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
Ch03 方法 物件導向程式設計(II).
程式設計實作.
第2章回顾 标识符:不用记,动手 关键字:if, else, switch, for, while, do, break, continue, void, …… 局部变量和成员变量 ①变量作用域 ②内存布局 基本数据类型 ①4类8种 ②互相转换 流程控制语句 ①分支 if……else, switch.
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
Java程序设计 第9章 继承和多态.
類別的繼承 Vehicle Car.
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
异常及处理.
Ch02-基礎語法.
C/C++/Java 哪些值不是头等程序对象
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
第三课 标识符、关键字、数据类型.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
CH10. 屬性與方法.
C++复习2----类与对象.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Interfaces and Packages
第三章 数据抽象.
Review 1~3.
第二章 Java基本语法 讲师:复凡.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第 5 章 继承、多态和虚函数 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

Ch10 類別與物件-方法 Java程式設計(2)

方法(1) 定義 修飾字、形式參數列和return敘述為非必要。 資料型別和方法名稱為必要。 方法的資料型別必須和回傳值相同。   <修飾字> 資料型別 方法名稱(<形式參數列>)   {   // 方法中的敘述   <return 回傳值;>   } 修飾字、形式參數列和return敘述為非必要。 資料型別和方法名稱為必要。 方法的資料型別必須和回傳值相同。

方法(2) 方法的命名規則 一般方法名稱的前面部份會是一個動詞,動詞應全為小寫。 動詞後的字,第一個字母為大寫 若方法是為了設定或取得private屬性,則分別使用「set屬性名稱」和「get屬性名稱」。

方法(3) 呼叫方法的語法 參數列的工作是把參數傳給方法。 參數列為選擇性的功能,視方法定義的形式參數列而定。 物件名稱.方法名稱(<參數列>) 參數列的工作是把參數傳給方法。 參數列為選擇性的功能,視方法定義的形式參數列而定。

如果,你不想讓一些資料隨便被人更改,或是一些固定值,或是你的生日不變 範例1 class Ch03_01 { public static void main(String [] args) { Date today = new Date(); today.set_day(21); today.set_month(3); today.set_year(2007); System.out.println("今天的日期是: " + today.get_year() + "-" + today.get_month() + "-" + today.get_day()); } class Date { private int day; private int month; private int year; void set_day(int a) { day = a; } void set_month(int a) { month = a; } void set_year(int a) { year = a; } int get_day() { return day; } int get_month() { return month; } int get_year() { return year; } 資訊隱藏 想想,private使用的好時機 如果,你不想讓一些資料隨便被人更改,或是一些固定值,或是你的生日不變 Ch03/Ch03_01.java

方法(4) 形式參數式中,以逗號分隔各個形式參數 static修飾方法時,該方法為類別方法 抽象方法沒有實作,無方法主體 public int getArea(int w, int h) { return w*h; } static修飾方法時,該方法為類別方法 抽象方法沒有實作,無方法主體 abstract <修飾字> 資料型別 方法名稱(<形式參數列>);

方法的呼叫(1) 呼叫方法時的程式走向

方法的呼叫(2) 參數只傳遞數值

方法的呼叫(3) 傳值和傳參照 基本型別(boolean、byte、short、int、long、char、float及double)是以傳值的方式回傳。 自訂型別(陣列或物件)是以傳參照的方式回傳資料。

方法的型別與回傳值 方法的型別就是回傳值的型別 使用void宣告的方法,返回時不回傳任何值 修飾字 資料型別 方法名稱(形式參數列) { // 方法中的敘述 return 回傳值; } 使用void宣告的方法,返回時不回傳任何值 return;

Today和birthday兩個物件實體是不是同一個? 範例2 class Ch03_02 { public static void main(String [] args) Date2 today = new Date2(); Date2 birthday = new Date2(); birthday = today; today.set_day(21); today.set_month(3); today.set_year(2007); System.out.println("今天的日期是: " + today.get_year() + "-" + today.get_month() + "-" + today.get_day()); System.out.println("today: " + today); System.out.println("birthday: " + birthday); System.out.println("生日是: " + birthday.get_year() + "-" + birthday.get_month() + "-" +birthday.get_day()); } Ch03/ch03_02.java

範例2_1訂做另一個真正的today(法一) class Ch03_02_01 { public static void main(String [] args) Date3 today = new Date3(); Date3 birthday = new Date3(); today.set_day(21); today.set_month(3); today.set_year(2007); birthday.set_day(today.get_day()); birthday.set_month(today.get_month()); birthday.set_year(today.get_year()); System.out.println("今天的日期是: " + today.get_year() + "-" + today.get_month() + "-" + today.get_day()); System.out.println("today: " + today); System.out.println("birthday: " + birthday); System.out.println("生日是: " + birthday.get_year() + "-" + birthday.get_month() + "-" +birthday.get_day()); } Ch03/ch03_02_01.java

範例2_2訂做另一個真正的today(法二)—傳參照 class Ch03_02_02 { public static void main(String [] args) Date4 today = new Date4(); Date4 birthday; today.set_day(21); today.set_month(3); today.set_year(2007); birthday = duplicateObj(today); System.out.println("今天的日期是: " + today.get_year() + "-" + today.get_month() + "-" + today.get_day()); System.out.println("today: " + today); System.out.println("birthday: " + birthday); System.out.println("生日是: " + birthday.get_year() + "-" + birthday.get_month() + "-" +birthday.get_day()); } static Date4 duplicateObj(Date4 ori) Date4 b = new Date4(); b.set_day(ori.get_day()); b.set_month(ori.get_month()); b.set_year(ori.get_year()); System.out.println("ori : " + ori); System.out.println("b : " +b); return b; Ch03/ch03_02_02.java

活化手、腦練習(1) 建立一個類別,類別內有一個sort方法,它可以將傳入的一個陣列,排序後(由小到大)傳回給另一個陣列 Ch03/Ex03_01.java

變數領域(1) 大括弧是變數領域的藩籬 若一個變數於某個區塊內宣告,則區塊內從宣告點以下為變數的領域。 區塊外不為變數的領域。 { int j=1; } j++; //錯誤,無法識別變數j

變數領域(2)

變數領域(3) 屬性也稱為欄位變數。 方法內的變數稱為自動變數或區域變數。 自動變數和欄位變數同名是合法的情況,不過兩者若同名,則欄位變數會因為被遮蔽而無法在方法內被「看到」。 欲在方法內看到同名的屬性時,可以使用this 關鍵字,指出使用的是物件本身的屬性。 this.屬性名稱

變數領域(4)

範例3 class Ch03_03 { int a = 10; public static void main(String [] args) Ch03_03 objA = new Ch03_03(); System.out.println("objA.a = " + objA.a); objA.myMethod(1); } void myMethod( int a) System.out.println("myMethod內的a : " + a); a = this.a; System.out.println("重設a,後myMethod內的a : " + a); System.out.println("myMethod內的this.a : " + this.a); Ch03/Ch_03_03.java

方法多載 同一類別中,若定義數個相同名稱的方法,而各方法所需的參數不同時,稱為方法多載(Overloading)。 多載方法是以傳入的參數個數及參數型別做為呼叫的判斷依據。 多載方法的形式參數的個數及型別相同時,為非法定義。 多載的目的是因應不同的傳遞資料,讓方法更有彈性。

範例4 class Ch03_04 { public static void main(String [] args) 圓形 大餅 = new 圓形(); 矩形 阿方 = new 矩形(); System.out.println("圓形的面積是 : " + 求面積(大餅)); System.out.println("矩形的面積是 : " + 求面積(阿方)); } static double 求面積(圓形 圓) return (圓.圓周率 * 圓.半徑 * 圓.半徑); static double 求面積(矩形 矩) return (矩.長度 * 矩.length); class 圓形 final double 圓周率 = 3.14; double 半徑 = 2; class 矩形 double 長度 = 2; double length = 1; 範例4 C03/C03_04.java

活化手腦練習(2) 建立多載方法myAdd,依照傳入的不同資料型別的資料作加的動作。 資料型別包括:int, float, double, String Ch03/Ex03_02.java

建構子 使用new及建構子建立物件 物件名稱 = new 類別名稱(); 呼叫建構子

預設的建構子 沒有定義建構子的類別時,編譯器會自動設給一個沒有形式參數的建構子。 預設的建構子是沒有內容的,不會對物件的屬性有任何影影響。 定義類別時,若有定義任何建構子,則編譯器不會設給預設建構子

定義建構子(1) 建構子的名稱一律同類別名稱,而且不宣告回傳資料型別。 建構子的修飾字可以為public、protected、private或無修飾字。 建構子修飾字不使用static和abstract。 修飾字 類別名稱(形式參數列) { //程式敘述 }

定義建構子(2) 建構子也可以多載 class SomeClass { public SomeClass() //不使用參數建立物件 } public SomeClass(int x, int y) //使用參數建立物件

建構子的呼叫(1) 建立物件時呼叫建構子 方法可以和建構子同名。有回傳型別者為方法;反之,無回傳型別者為建構子。 類別名稱 物件名稱 = new 類別名稱(形式參數列);

範例5:呼叫多載建構子 class Ch03_05 { public static void main(String [] args) Rectangle rect1 = new Rectangle(); System.out.println("rect1的面積為:" + rect1.getArea()); Rectangle rect2 = new Rectangle(3,4); System.out.println("rect2的面積為:" + rect2.getArea()); } class Rectangle int height; int width; Rectangle() { height = 1; width = 1; Rectangle(int height, int width) { this.height = height; this.width = width; int getArea() { return height * width; Ch03/Ch03_05.java

範例5:呼叫多載建構子(static) 結果??? class Ch03_05_01 { public static void main(String [] args) Rectangle1 rect1 = new Rectangle1(); System.out.println("rect1的面積為:" + rect1.getArea()); Rectangle1 rect2 = new Rectangle1(3,4); System.out.println("rect2的面積為:" + rect2.getArea()); } class Rectangle1 static int height; static int width; Rectangle1() { height = 1; width = 1; Rectangle1(int height, int width) { this.height = height; this.width = width; int getArea() { return height * width; 結果??? Ch03/Ch03_05_01.java

建構子的呼叫(2) 使用this():建構子多載時,建構子呼叫其它建構子的限制: 必須使用 this() 取代類別名稱()。 只能在第一個敘述呼叫。 不能造成建構子遞迴。

範例6:利用this()呼叫多載建構子 class Ch03_06 { public static void main(String [] args) { System.out.println("call Date06() 結果:"); new Date06(); System.out.println("call Date06(2007) 結果:"); new Date06(2007); System.out.println("call Date06(2007,3) 結果:"); new Date06(2007,3); System.out.println("call Date06(2007,3,28) 結果:"); new Date06(2007,3,28); } class Date06 { private int day; private int month; private int year; Date06(int year, int month, int day) { this.year = year; this.month = month; this.day = day; showDate(); } Date06(int year, int month) { this(year, month, 28); } Date06(int year) { this(year, 3,28); } Date06() { this(2007, 3, 28); } void showDate() { System.out.println(year + "-" + month + "-" + day); } Ch03/Ch03_06.java

範例7:建立客戶資料(1) 系統需求 建立客戶資料 顯示客戶資料 客戶編號(id) 等級(rank) 生日(birthday) Customer Int id Char rank Date birthday showData

範例7:建立客戶資料(2) Class Ch03_07 class Ch03_07 { public static void main(String [] args) { new Customer(1, 'H' , 3, 28, 2007); new Customer(2, 'L', 3, 29, 2007); } Class Date07 class Date07 { private int year; private int month; private int day; Date07(int year, int month, int day) { this.year = year; this.month = month; this.day = day; String showDate() { return (year +"-" + month + "-" +day); } Class Customer class Customer { private int id; private char rank; private Date07 birthday; Customer(int id, char r, int m, int d, int y) this.id = id; rank = r; birthday = new Date07(y, m, d); showData(); } void showData() System.out.println("[客戶資料]=========="); System.out.println("編號: " + id); System.out.println("等級: " + rank); System.out.println("生日: " + birthday.showDate()); Ch03/Ch03_07.java

範例7:建立客戶資料(3)

範例8:建立班級學生資料(1) 系統需求: 建立學生資料 顯示學生資料、班上學生數、導師 學號(id) 操行成績(score) 導師(tecaherNo) 班上學生數(count) 顯示學生資料、班上學生數、導師 Student Int id Double score String teacherNo Int count Print Student() getStudentCount

範例8:建立班級學生資料(2) Class Ch03_08 class Ch03_08 { public static void main(String [] args) { Student std1 = new Student(1, 68.0); System.out.println("學生1號: "); std1.printStudent(); Student std2 = new Student(2, 77.0); System.out.println("學生2號: "); std2.printStudent(); System.out.println("============"); System.out.println("學生人數: " + Student.getStudentCount()); System.out.println("導師: " + Student.teacherNo); System.out.println("將導師換成wang"); Student.teacherNo = "wang"; } Class Student class Student { int id; double score; static String teacherNo = "王大瑾"; static int count; Student(int id, double s) { this.id = id; score = s; count++; } static int getStudentCount() { return count; } void printStudent() System.out.println("學號: " + id); System.out.println("操行成績: " + score);

範例8:建立班級學生資料(3)

動動腦時間(1) class Ch03_08 { public static void main(String [] args) { Student std1 = new Student(1, 68.0); System.out.println("學生1號: "); std1.printStudent(); Student std2 = new Student(2, 77.0); System.out.println("學生2號: "); std2.printStudent(); System.out.println("============"); System.out.println("學生人數: " + Student.getStudentCount()); System.out.println("導師: " + Student.teacherNo); System.out.println("將導師換成wang"); std1.teacherNo = "wang"; } 可以嗎?why? Ch03/Ch03_08_01.java

動動腦時間(2) 如何做出物件陣列?? class Ch03_08_02 { public static void main(String [] args) Student [] std = new Student[2]; System.out.println("學生1號: "); std[0] = new Student(1, 68.0); std[0].printStudent(); System.out.println("學生2號: "); std[1] = new Student(2, 77.0); std[1].printStudent(); System.out.println("====================="); System.out.println("學生人數: " + Student.getStudentCount()); System.out.println("導師: " + Student.teacherNo); } Ch03/Ch03_08_02.java

活化手腦練習(3) 製作一個Box類別,這是一個盒子的類別,繪出Box類別的UML類別圖及實作它: 成員變數:width、height和length儲存寬、高和長 建構子:Box(double width, double height、double length) 成員方法:double volume()計算體積、double area()計算表面積 測試物件box1(3.0, 4.0, 5.0) Ch03/Ex03_03.java

活化手腦練習(4) 修改範例8程式 學號為流水號從1開始,依物件建立順序自動設定 修改Student類別,成為一個可鏈結的類別 新增一個屬性next。上一個建立的物件之next會指向新的物件來形成鏈結。 定義一個類別方法listStudent,可以列出所有鏈結的物件屬性(id 及score) 要有兩個類別屬性,分別指向第一個物件和最後一個物件