第03章 Java面向對象程序設計
·本章學習目標
本章介紹面向對象程序設計的核心內容,是學習這門課程的難點所在。
了解OOP的基本理論,基本概念和基本方法。
掌握類的繼承和接口的概念及具體用法。
掌握類的封裝、多態性(方法的重載、覆蓋)。
掌握靜態成員變量和靜態成員方法的意義以及引用或調用的方法。
了解包的概念。
·本章學習內容
類和對象的概念
面向對象的特性
類變量和類方法
封裝和修飾符的使用
內部類
接口
包層次的理解和使用
3.1 面向對象程序設計基礎
3.1.1面向對象概述
面向機器的程序:專門為特定的硬件系統。
面向過程的程序:數據結構和算法,主要以解決問題的過程來編寫程序。
面向對象的程序:不僅關心個體的解決過程,而且還關心包含這些過程的復雜系統。
3.1.2面向對象的基本概念
1、類與對象
類(Class):一種復雜的數據類型,它是將數據和與數據相關的操作封裝在一起的集合體,是普通數據類型的擴展。它不但包含數據,還包含對數據進行操作的方法(Method),方法反映了數據的行為。
對象(Object):類的實例,它是類的變量,即類在內存中具體的內存分配。
Java編寫程序就是編寫一個個的類,然后生成一個個的對象。
對象與類是密切相關的,沒有脫離對象的類,也沒有不依賴類的對象。
2、成員
成員即類中包含的部分。用來描述類(對象)的屬性(靜態描述對象的特征)和方法(動態描述對象的特征)。
成員變量:類中的數據,用來刻畫類的屬性。
成員方法:類中一系列的操作(函數),用于描述類的行為。
注意:在Java語言中,一切事物都為對象。
3、類的核心特征
封裝:隱藏類的實現細節(具體的代碼)。提供類的訪問接口。
繼承:代碼復用,不用改變原代碼。用以擴充類的功能。使類具有新的特性。
多態:多種形態。指一個程序中使用相同名字定義了不同的方法。類的實現具有多種形態的特征,具體包括方法的重載和覆蓋。
3.1.3面向對象程序設計的優點
提高了程序的可重用性和可維護性;
對數據的封裝,提高了數據的獨立性;
提高了開發效率,降低修改難度;
對復雜的系統提出了新的解決問題的思路和方案。
3.2 類與對象
3.2.1類的聲明和類主體
Java類的定義格式包括類聲明和類主體:
<類聲明>{ <類主體> }
注:類聲明包括該類的名稱、訪問權限、與其他類的關系等;類主體定義該類的成員。
1、類的聲明
類聲明的格式如下:
[<修飾符>] class 類名 [extends <父類名>][implements <接口名列表>] { <類主體> }
2、類主體
類主體包含成員變量和成員方法兩部分:
<類聲明> {
<成員變量的聲明>
<成員方法的聲明及實現>
}
【例】創建一個名為Person的類,它包含name、age兩個成員變量和eat、work兩個成員方法。
public class Person {
String name;
int age;
public void eat(){
System.out.println("eat...");
}
public void work(){
System.out.println("work...");
}
}
3.2.2創建對象與構造方法
1、創建與使用對象
定義類之后需要創建類的對象才能使用類的功能。
對象的生命周期是:創建、使用、銷毀
類名 對象名; //聲明對象變量
對象名=new 類名(); 創建實際的對象
定義好對象后就可以訪問對象的方法和變量了,必須遵守先定義創建然后再使用。
創建和使用對象時應注意:
通過“.”運算符實現對成員變量的訪問和對成員方法的調用。并不是所有的成員都能夠訪問,修飾符可以設定訪問權限
對象名.方法;
對象名.成員變量;
對象為類的成員時,使用前必須要先創建。
對象作為參數傳遞的時候為引用調用。
調用方法中沒有參數,方法采用空的圓括號;如果有參數,就要在其中提供所有的相符合的參數。
方法可以有返回值或沒有,有返回值必須要return語句。
【例】Person類的使用。
public class School {
public static void main(String[] args) {
Person p1 = new Person();
Person p2;
p2 = new Person();
p1.name = "Jack";
System.out.println("p1's name is "+p1.name);
p1.eat();
p2.work();
}
}
2、構造方法
用來構造對象的方法;在創建類的實例的時候對對象的一些成員變量進行初始化。告知系統去如何創建一個符合要求的對象。
修飾符類名([參數[,參數]]){
初始代碼塊;
}
構造方法名字與所在類相同,無返回值;如果沒有構造方法,系統會有一個默認的構造方法;只要定義了一個構造方法,系統就不會再分配默認的構造方法了。
可以有多個構造方法,但是這些構造方法的參數類型或參數列表要不同。此時發生了方法的重載。
【例】使用構造方法為Person_c類的對象賦值。
public class Person_c {
String name;
int age;
Person_c(String n,int a){
name = n;
age = a;
}
public void eat(){
System.out.println("eat...");
}
public void work(){
System.out.println("work...");
}
}
public class School {
public static void main(String[] args) {
Person_c p1 = new Person_c("Jack“,18);
Person p2 = new Person_c(“steven“,25);
System.out.println("p1's name is "+p1.name);
System.out.println("p1's age is "+p2.age);
p1.eat();
p2.work();
}
}
3.3 成員變量和成員方法
3.3.1成員變量的聲明
[<修飾符>] [static] [final] [transient] <類型> <變量名>;
static變量為類變量;無static的變量為實例變量;
final變量為常量;
transient變量為臨時變量;
類的成員變量獨立與方法,在類主體中但不在方法體中,在方法體中的是方法的局部變量。
3.3.2成員方法的定義與實現
成員方法的聲明包括方法聲明和方法體:
[<修飾符>] <返回值類型> <方法名>([參數列表])[throws <異常類>]{
<方法體>
}
方法中必須要給出方法的返回值,如果沒有返回值,返回類型為void,方法后可以跟0個或多個參數;如果沒有參數也要跟空的圓括號。
方法體內可以定義變量,稱為局部變量;生命周期只在此方法體內。不支持全局變量。
通過類的成員的訪問修飾符,來達到對類的成員的控制。
3.3.3類的封裝
權限修飾 |
同一類 |
同一包 |
不同包的子類 |
所有類 |
public |
是 |
是 |
是 |
是 |
protected |
是 |
是 |
是 |
|
默認 |
是 |
是 |
||
private |
是 |
公有的:可以被所有的類的對象使用。
保護的:被同一類中的其他成員、子類的成員、同一包中的其他類訪問。不能被其他包中的非子類訪問。
默認的:只能被同一包中的其他類和同一類中的其他成員訪問。
私有的:只能被同一類中的成員訪問。不能被其他類和其子類訪問。
3.3.4實例成員和類成員
1、實例變量和類變量
不使用static修飾的變量為實例變量,創建類的對象會為對象的實例變量分配內存單元。
使用static修飾的變量稱為類變量或靜態變量,只為該類的第一對象分配內存單元,其后所有創建的對象共享這一變量。
2、實例方法和類方法
不使用static修飾的方法為實例方法,實例方法可以訪問類變量,也可以訪問實例變量。只能通過對象名調用。
使用static修飾的方法稱為類方法或靜態方法,類方法只能訪問類變量。不能訪問實例變量,類方法既可以通過類名調用,也可以通過對象名來調用。
【例】實例成員與類成員的應用。
public class Person_s {
String name;
static int age;
Person_c(String n,int a){
name = n;
age = a;
}
public static void printAge(){
System.out.println(age);
}
public void printName(){
System.out.println(name);
}
}
public class School {
public static void main(String[] args) {
Person_s p1 = new Person_s("Jack“,18);
Person p2 = new Person_s(“steven“,25);
p1.printAge();
p2.printName();
Person_s.printAge();
//Person_s.printName(); //報錯
}
}
3.4 類的繼承和多態
3.4.1類的繼承
1、繼承的概念
由已知的類創建新類,新類在原有的類的基礎上擴展了功能。通過繼承機制,子類能復用父類的代碼,同時又允許子類添加自己特有的變量和方法,這樣減少了代碼的重復,提高了代碼的質量和可靠性。
由繼承得到的新類稱為子類,被繼承的類稱為超類(父類)。
2、實現類的繼承
[<修飾>] class <子類名> extends <父類名>
Ø 繼承的原則:
子類繼承父類的實例成員和類成員(變量和方法);
子類不能繼承父類的構造方法,但可以調用父類的構造方法;
子類可以增加自己的成員。子類中聲明了和父類同名同參的方法或變量,則發生了覆蓋;
子類重新定義父類的成員方法,則發生了重載;
子類不能刪除父類的成員。
子類對父類成員的訪問原則:
子類不能訪問父類中private的成員;
子類可以訪問父類中public和protected的成員;
子類可以訪問同一包中父類的默認權限的成員;
子類不能訪問不同包中父類具有默認權限的成員。
Ø this和super的使用方法:
在Java中,this用來代表當前正在操作的對象。通過this變量可以引用當前對象的成員變量和方法。
在當前對象內調用:this.成員
在Java中,super用來代表父類。通過super可以引用被子類覆蓋的成員:
super.成員
注意:Java不支持多繼承,即子類只能有一個父類。
3.4.2類的多態
多態是指一個標識符具有多種語義。
1、方法的重載
同一個類中具有許多同名不同參數列表的方法。
要求:
參數必須不同:個數不同或類型不同或二者都不同;
返回值可以相同也可以不同。
2、方法的覆蓋
子類與父類的方法同名同參時,此時子類的方法不能繼承父類的該方法,子類的方法覆蓋了父類的方法。
要求:
子類不能覆蓋父類中聲明為final或static的方法;
子類必須覆蓋父類中的abstract的方法,或者子類也聲明為abstract。
3.4.3最終類和抽象類
1、最終類
不能被繼承(不能有子類)的類,使用final來修飾這個類。
如果想保護類中的方法不被子類覆蓋,可以用final修飾這個方法為最終方法。
使用final修飾的變量為常量。
2、抽象類
使用abstract修飾的類為抽象類。
抽象類不能實例化。(不能創建抽象類的對象)
抽象類的子類必須實現父類中所有的抽象方法,或者將自己也定義為抽象的。
一個類不能既是抽象類又是最終類。
通過設定方法為抽象方法可以保證該方法在子類中的覆蓋(實現),抽象方法只有方法聲明而沒有方法體。
抽象方法不能是靜態方法,也不能是最終方法。而且必須在abstract的類中聲明。
3.5 包
3.5.1引用java包
包是一種區別類名的機制,是類的組織形式。
引用已經存在的包的兩中形式:
1、前綴引用
java.util.Date today=new java.util.Date();
2、使用import語句
import java.util.*;
3.5.2自定義java包
1、包的定義
package 包名;
package 包名1.包名2;
2、設置包的路徑
設置包所在的文件夾,建立包等級,每一個包對應一個文件夾,并且報名與對應的文件夾名稱相同。
并將包所在的路徑設置到classpath變量中。并修改編譯相應的源文件。
3.6 接口和內部類
3.6.1接口
在Java中接口與類有些類似,二者不同之處在于:
接口中定義的變量都是final static類型的,而且接口中定義的方法都是抽象方法。
Java中類的繼承不支持多重繼承,即一個類只能有一個父類,但是一個類卻可以繼承(實現)多個接口。因此,聲明一個類時不但可以繼承一個父類,同時還允許實現多個接口。這可理解為變相的多重繼承,彌補了Java的缺陷。
1、接口的聲明
與類的聲明相似,格式為:
[ <修飾符>] interface <接口名> [ extends <接口名>]{
常量聲明;
抽象方法;
}
修飾符只有兩種情況:public和省略修飾符;
常量全部隱含為final或static,必須設置初值;
接口中的方法都是抽象方法,抽象方法是只有方法聲明而沒有方法體的。直接以分號結束。
2、實現接口
實現接口類似繼承,在定義類的時候用implements關鍵字來實現一個接口。
class <類名> implements <接口名>
如果一個類實現一個接口則必須實現接口中的所有方法(完成方法體),且方法必須聲明為public。如果確實沒有必要實現該方法,也需要將方法完成為空方法。
Java運行多個類實現同一個接口,這些類之間可以是毫無關系的;且一個類可以實現多個接口。
單重繼承與多重實現機制
3.6.2內部類
1、概念
內部類就是在類的內部定義的類,可以為類的成員,也可以是方法中定義,還可以在表達式中定義。
包含內部類的類稱為外部類。
Ø 內部類的使用:
用在定義他的語句中或語句塊中,也可以使用。
可以使用類的成員,也可以使用其所在的方法的局部變量,可以定義為abstract。
若被聲明為static則成了頂層類,不能再使用局部變量
如果內部類中有static 成員,則該內部類為static。
Ø 使用內部類的原因以及優缺點:
在事件驅動的程序中經常的使用。
3.6.2內部類的分類
內部類的分類:
非靜態成員內部類:作為外部類的成員
靜態內部類:作為內部類的靜態成員
局部內部類:在方法中定義的內部類
匿名內部類:沒有名稱,只有類體的局部內部類
3.6.3內部類的使用
在外部類的外部和內部使用成員內部類:
在外部類的外部和內部使用靜態內部類:
在方法中定義和使用局部內部類:
匿名內部類的使用:
·小結
面向對象的特征
繼承、多態的含義
接口和抽象類的區別
包的使用posted on 2010-03-19 10:50 libifeng 閱讀(356) 評論(0) 編輯 收藏 所屬分類: Java課件