Java 入門指南- 單元9 - 封裝與建構子 - 程式語言教學誌
文章推薦指數: 80 %
檔名:ClassDemo04.java * 作者:張凱慶* 網站:http://kaiching.org */ package classdemo04; public class ClassDemo04 { private int a; // 這裡定義建構子 public ...
Java入門指南
單元9-封裝與建構子
~~學習進度表~~
物件導向程式設計(object-orientedprogramming)有三大基本特性,分別是封裝(encapsulation)、繼承(inheritance)及多型(polymorphism)
Encapsulation
Inheritance
Polymorphism
繼承的目的是讓類別(class)具有像是親屬的垂直關係(父母子女),子類別(subclass)可以擁有父類別(superclass)的屬性(field)及方法(method),多型像是親屬的平行關係(兄弟姊妹),多個子類別繼承自單一父類別之時,這些子類別就可以用父類別代替,父類別如同家族裡的「姓」,子類別則是「名」。
繼承的英文原文inherit,中文意思泛指從什麼得到什麼,生物學上的遺傳也是用這個詞。
至於封裝的意思就是把屬性封在類別中,這還牽涉到程式設計中另一個重要的概念 資訊隱藏(informationhiding),主要就是不讓外界隨意存取類別的屬性,也就是說,只讓類別的屬性給同個類別的方法存取。
這就需要用到private修飾詞(modifier)了,當屬性宣告為private的時候,該屬性就只能由同一個類別存取,我們將ClassDemo01類別的屬性a封裝,改寫成ClassDemo03類別,程式如下
/*
*檔名:ClassDemo03.java
*作者:張凱慶
*網站:http://kaiching.org
*/
packageclassdemo03;
public class ClassDemo03 {
private int a;
// setter 方法
public void setA(int p1) {
a = p1;
}
// getter 方法
public int getA() {
return a;
}
public int doSomething(int p1) {
return a + p1;
}
public static void main(String[] args) {
ClassDemo03 d = new ClassDemo03();
// 利用 setter 設定屬性
d.setA(11);
System.out.println();
// 利用 getter 印出屬性 a
System.out.println(d.getA());
System.out.println(d.doSomething(1));
System.out.println();
}
}
首先,屬性宣告為private,這樣屬性就只限類別中可存取
private int a;
權限修飾詞有三個,分別是public、private及protected,加上不宣告權限修飾詞的形式,共有四種不同的權限。
接著如果要讓外界可以存取已封裝的屬性,就要另外設置public的getter與setter方法
// setter 方法
public void setA(int p1) {
a = p1;
}
// getter 方法
public int getA() {
return a;
}
執行結果如下
11
12
留意設定屬性a已經改成在建立物件後呼叫setter方法
// 利用 setter 設定屬性
d.setA(11);
這是setter方法的用途沒錯,不過如果我們想要建立物件的同時設定好屬性,就需要自訂建構子(constructor),所謂建構子是一種特別的方法(method),特別的地方是在建構子是建立物件(object)時所執行的方法。
記不記得建立ClassDemo01時,需要用new關鍵字(keyword),new後面接的是附上小括弧的類別(class)名稱
ClassDemo01 d = new ClassDemo01();
完整的ClassDemo01.java,請參考單元8。
類別名稱加上小括弧,其實就是呼叫建構子來建立物件,如果沒有自行定義建構子,編譯器會自動替我們補上一個。
下面我們給ClassDemo01增加建構子當作例子,新類別寫在ClassDemo04中,如下
/*
*檔名:ClassDemo04.java
*作者:張凱慶
*網站:http://kaiching.org
*/
packageclassdemo04;
public class ClassDemo04 {
private int a;
//這裡定義建構子
public ClassDemo04(int p1) {
setA(p1);
}
public void setA(int p1) {
a = p1;
}
public int getA() {
return a;
}
public int doSomething(int p1) {
return a + p1;
}
public static void main(String[] args) {
ClassDemo04 d = new ClassDemo04(12);
System.out.println();
System.out.println(d.getA());
System.out.println(d.doSomething(1));
System.out.println();
}
}
建構子的定義如下
//這裡定義建構子
public ClassDemo04(int p1) {
setA(p1);
}
此例ClassDemo04()有一個int參數(parameter)p1,然後直接以p1設定屬性(field)a。
注意建構子沒有回傳值(returnvalue),這是因為建構子就是用來建立物件,因此預設回傳物件本身。
由於建構子有參數,因此呼叫建構子建立物件時也需要提供參數
ClassDemo04 d = new ClassDemo04(10);
建構子也可以多載(overload),就是可以自行定義各種參數版本的建構子,其中包括沒有參數的版本,編譯器(compiler)預設的建構子也是沒有沒有參數的版本。
執行結果如下
12
13
下面我們介紹個小技巧,建構子或方法的參數識別字(identifier)也可以跟屬性一樣,這時候存取屬性就要利用this關鍵字了,我們將ClassDemo04改成用this存取屬性,如下
/*
*檔名:ClassDemo05.java
*作者:張凱慶
*網站:http://kaiching.org
*/
packageclassdemo05;
public class ClassDemo05 {
private int a;
public ClassDemo05(int a) {
setA(a);
}
public void setA(int a) {
// 利用 this 存取屬性
this.a = a;
}
public int getA() {
return a;
}
public int doSomething(int a) {
// 參數跟屬性使用相同的識別字
return this.a + a;
}
public static void main(String[] args) {
ClassDemo05 d = new ClassDemo05(13);
System.out.println();
System.out.println(d.getA());
System.out.println(d.doSomething(9));
System.out.println();
}
}
setter部分改成用參數a設定屬性a,屬性前要用this加小數點存取
public void setA(int a) {
// 利用 this 存取屬性
this.a = a;
}
doSomething()的地方也是
public int doSomething(int a) {
// 參數跟屬性使用相同的識別字
return this.a + a;
}
執行結果如下
13
22
基本的類別定義包含屬性、方法及建構子,接下來我們繼續討論物件導向程式設計的其他兩項特性。
相關教學影片
第五堂課類別與物件導向程式設計:建構子、多載與封裝⇨YouTube頁面連結
上一頁單元8-類別
回Java入門指南首頁
下一頁單元10-物件導向程式設計
回Java教材首頁
回程式語言教材首頁
中英文術語對照
class類別
compiler編譯器
constructor建構子
encapsulation封裝
field屬性
informationhiding資訊隱藏
identifier識別字
inheritance繼承
keyword關鍵字
method方法
modifier修飾詞
object物件
object-orientedprogramming物件導向程式設計
overload多載
parameter參數
polymorphism多型
returnvalue回傳值
subclass子類別
superclass父類別
參考資料
1.TheJava™Tutorials:ProvidingConstructorsforYourClasses
2.TheJava™Tutorials:MoreonClasses
3.TheJava™Tutorials:ReturningaValuefromaMethod
4.TheJava™Tutorials:UsingthethisKeyword
5.TheJava™Tutorials:ControllingAccesstoMembersofaClass
6.TheJava™Tutorials:UnderstandingClassMembers
7.TheJava™Tutorials:InitializingFields
重點整理
1.物件導向程式設計的三大特性為封裝、繼承與多型。
2.封裝是限制成員只能在類別中存取,也就是把成員宣告為private。
3.建構子是建立物件時所執行的特別方法。
4.關鍵字this用在方法中存取屬性。
問題與討論
1.物件導向程式設計有哪些特性?
2.封裝的作用是什麼?Java中要怎麼進行封裝?
3.建構子是什麼?為什麼要建構子?
練習
1.1.建立一個新專案Exercise0901,替Exercise0805類別設計建構子,將屬性result的初值放在建構子中設定。
2.建立一個新專案Exercise0902,替Exercise0806類別設計建構子。
3.建立一個新專案Exercise0903,替Exercise0807類別設計建構子。
延伸文章資訊
- 1Day06:爸爸這麼做都是為你好 - iT 邦幫忙
Java SE 系列第6 篇. kirin0127. 1 年前‧ 472 瀏覽. 0. 當我們在定義類別時,有三種東西可以定義,屬性(field)、建構子(constructor)、方法(met...
- 2Java :: public/建構式/重載
建構式是與類別名稱同名,無需宣告傳回型態的方法。例如:. public class Some { private int a ...
- 3程式基礎概念 建構子 - iT 邦幫忙
建構式/建構函式/建構子(Constructor). 對類別做物件參數初始化,和類別(Class)名稱相同的方法。 無傳回值. 當我們使用new建立新物件時,程式會自動執行建構函式。
- 4定義類別(Class) | Java SE 6 技術手冊 - caterpillar
與類別名稱同名的方法稱之為「建構方法」(Constructor),也有人稱之為「建構子」,它沒有傳回值,建構方法的作用是讓您建構物件的同時,可以同時初始一些必要的 ...
- 5Java 入門指南- 單元9 - 封裝與建構子 - 程式語言教學誌
檔名:ClassDemo04.java * 作者:張凱慶* 網站:http://kaiching.org */ package classdemo04; public class ClassDe...