JAVA圖文說(shuō)明教程 第3講 Java語(yǔ)言中的面向?qū)ο筇卣?/h1>
發(fā)表時(shí)間:2024-05-25 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]3.1 面向?qū)ο蠹夹g(shù)基礎(chǔ) 3.1.1 面向?qū)ο蟮幕靖拍? 面向?qū)ο蟮幕舅枷? 面向?qū)ο笫且环N新興的程序設(shè)計(jì)方法,或者是一種新的程序設(shè)計(jì)規(guī)范(paradigm),其基本思想是使用對(duì)象、類(lèi)、繼承、封裝、消息等基本概念來(lái)進(jìn)行程序設(shè)計(jì)。從現(xiàn)實(shí)世界中客觀存在的事物(即對(duì)象)出發(fā)來(lái)構(gòu)造軟件系統(tǒng),并...
3.1 面向?qū)ο蠹夹g(shù)基礎(chǔ)
3.1.1 面向?qū)ο蟮幕靖拍?
面向?qū)ο蟮幕舅枷?
面向?qū)ο笫且环N新興的程序設(shè)計(jì)方法,或者是一種新的程序設(shè)計(jì)規(guī)范(paradigm),其基本思想是使用對(duì)象、類(lèi)、繼承、封裝、消息等基本概念來(lái)進(jìn)行程序設(shè)計(jì)。從現(xiàn)實(shí)世界中客觀存在的事物(即對(duì)象)出發(fā)來(lái)構(gòu)造軟件系統(tǒng),并且在系統(tǒng)構(gòu)造中盡可能運(yùn)用人類(lèi)的自然思維方式。開(kāi)發(fā)一個(gè)軟件是為了解決某些問(wèn)題,這些問(wèn)題所涉及的業(yè)務(wù)范圍稱(chēng)作該軟件的問(wèn)題域。其應(yīng)用領(lǐng)域不僅僅是軟件,還有計(jì)算機(jī)體系結(jié)構(gòu)和人工智能等。
1. 對(duì)象的基本概念
對(duì)象是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成。從更抽象的角度來(lái)說(shuō),對(duì)象是問(wèn)題域或?qū)崿F(xiàn)域中某些事物的一個(gè)抽象,它反映該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用;它是一組屬性和有權(quán)對(duì)這些屬性進(jìn)行操作的一組服務(wù)的封裝體。客觀世界是由對(duì)象和對(duì)象之間的聯(lián)系組成的。
主動(dòng)對(duì)象是一組屬性和一組服務(wù)的封裝體,其中至少有一個(gè)服務(wù)不需要接收消息就能主動(dòng)執(zhí)行(稱(chēng)作主動(dòng)服務(wù))。
2. 類(lèi)的基本概念
把眾多的事物歸納、劃分成一些類(lèi)是人類(lèi)在認(rèn)識(shí)客觀世界時(shí)經(jīng)常采用的思維方法。分類(lèi)的原則是抽象。類(lèi)是具有相同屬性和服務(wù)的一組對(duì)象的集合,它為屬于該類(lèi)的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z(yǔ)言中,類(lèi)是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類(lèi)名并包括屬性說(shuō)明和服務(wù)說(shuō)明兩個(gè)主要部分。類(lèi)與對(duì)象的關(guān)系就如模具和鑄件的關(guān)系,類(lèi)的實(shí)例化結(jié)果就是對(duì)象,而對(duì)一類(lèi)對(duì)象的抽象就是類(lèi)。
3. 消息
消息就是向?qū)ο蟀l(fā)出的服務(wù)請(qǐng)求,它應(yīng)該包含下述信息:提供服務(wù)的對(duì)象標(biāo)識(shí)、服務(wù)標(biāo)識(shí)、輸入信息和回答信息。服務(wù)通常被稱(chēng)為方法或函數(shù)。
3.1.2 面向?qū)ο蟮幕咎卣?
1.封裝性
封裝性就是把對(duì)象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的相同單位,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),包含兩個(gè)含義:
◇ 把對(duì)象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個(gè)不可分割的獨(dú)立單位(即對(duì)象)。
◇ 信息隱蔽,即盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),對(duì)外形成一個(gè)邊界〔或者說(shuō)形成一道屏障〕,只保留有限的對(duì)外接口使之與外部發(fā)生聯(lián)系。
封裝的原則在軟件上的反映是:要求使對(duì)象以外的部分不能隨意存取對(duì)象的內(nèi)部數(shù)據(jù)(屬性),從而有效的避免了外部錯(cuò)誤對(duì)它的"交叉感染",使軟件錯(cuò)誤能夠局部化,大大減少查錯(cuò)和排錯(cuò)的難度。
2.繼承性
特殊類(lèi)的對(duì)象擁有其一般類(lèi)的全部屬性與服務(wù),稱(chēng)作特殊類(lèi)對(duì)一般類(lèi)的繼承。例如,輪船、客輪;人、大人。一個(gè)類(lèi)可以是多個(gè)一般類(lèi)的特殊類(lèi),它從多個(gè)一般類(lèi)中繼承了屬性與服務(wù),這稱(chēng)為多繼承。例如,客輪是輪船和客運(yùn)工具的特殊類(lèi)。在java語(yǔ)言中,通常我們稱(chēng)一般類(lèi)為父類(lèi)(superclass,超類(lèi)),特殊類(lèi)為子類(lèi)(subclass)。
3.多態(tài)性
對(duì)象的多態(tài)性是指在一般類(lèi)中定義的屬性或服務(wù)被特殊類(lèi)繼承之后,可以具有不同的數(shù)據(jù)類(lèi)型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或服務(wù)在一般類(lèi)及其各個(gè)特殊類(lèi)中具有不同的語(yǔ)義。例如:"幾何圖形"的"繪圖"方法,"橢圓"和"多邊形"都是"幾何圖"的子類(lèi),其"繪圖"方法功能不同。
3.1.3 面向?qū)ο蟪绦蛟O(shè)計(jì)方法
OOA-Object Oriented Analysis 面向?qū)ο蟮姆治?
OOD-Object Oriented Design 面向?qū)ο蟮脑O(shè)計(jì)
OOI-Object Oriented Implementation 面向?qū)ο蟮膶?shí)現(xiàn)
3.2 Java語(yǔ)言的面向?qū)ο筇匦?
3.2.1 類(lèi)
類(lèi)是java中的一種重要的復(fù)合數(shù)據(jù)類(lèi)型,是組成java程序的基本要素。它封裝了一類(lèi)對(duì)象的狀態(tài)和方法,是這一類(lèi)對(duì)象的原形。一個(gè)類(lèi)的實(shí)現(xiàn)包括兩個(gè)部分:類(lèi)聲明和類(lèi)體。
1.類(lèi)聲明:
[public][abstract final] class className [extends superclassName] [implements interfaceNameList]
{……}
其中,修飾符public,abstract,final 說(shuō)明了類(lèi)的屬性,className為類(lèi)名,superclassName為類(lèi)的父類(lèi)的名字,interfaceNameList為類(lèi)所實(shí)現(xiàn)的接口列表。
2.類(lèi)體
類(lèi)體定義如下:
class className
{[public protected private ] [static]
[final] [transient] [volatile] type
variableName; //成員變量
[public protected private ] [static]
[final abstract] [native] [synchronized]
returnType methodName([paramList]) [throws exceptionList]
{statements} //成員方法
}
3.成員變量
成員變量的聲明方式如下:
[public protected private ] [static]
[final] [transient] [volatile] type
variableName; //成員變量
其中,
static: 靜態(tài)變量(類(lèi)變量);相對(duì)于實(shí)例變量
final: 常量
transient: 暫時(shí)性變量,用于對(duì)象存檔
volatile: 貢獻(xiàn)變量,用于并發(fā)線程的共享
4.成員方法
方法的實(shí)現(xiàn)包括兩部分內(nèi)容:方法聲明和方法體。
[public protected private ] [static]
[final abstract] [native] [synchronized]
returnType methodName([paramList])
[throws exceptionList] //方法聲明
{statements} //方法體
方法聲明中的限定詞的含義:
static: 類(lèi)方法,可通過(guò)類(lèi)名直接調(diào)用
abstract: 抽象方法,沒(méi)有方法體
final: 方法不能被重寫(xiě)
native: 集成其它語(yǔ)言的代碼
synchronized: 控制多個(gè)并發(fā)線程的訪問(wèn)
◇ 方法聲明
方法聲明包括方法名、返回類(lèi)型和外部參數(shù)。其中參數(shù)的類(lèi)型可以是簡(jiǎn)單數(shù)據(jù)類(lèi)型,也可以是復(fù)合數(shù)據(jù)類(lèi)型(又稱(chēng)引用數(shù)據(jù)類(lèi)型)。
對(duì)于簡(jiǎn)單數(shù)據(jù)類(lèi)型來(lái)說(shuō),java實(shí)現(xiàn)的是值傳遞,方法接收參數(shù)的值,但不能改變這些參數(shù)的值。如果要改變參數(shù)的值,則用引用數(shù)據(jù)類(lèi)型,因?yàn)橐脭?shù)據(jù)類(lèi)型傳遞給方法的是數(shù)據(jù)在內(nèi)存中的地址,方法中對(duì)數(shù)據(jù)的操作可以改變數(shù)據(jù)的值。
例3-1說(shuō)明了簡(jiǎn)單數(shù)據(jù)類(lèi)型與引用數(shù)據(jù)的區(qū)別。
【例3-1】
import java.io.*;
public class PassTest{
float ptValue;
public static void main(String args[]) {
int val;
PassTest pt=new PassTest();
val=11;
System.out.println("Original Int Value is:"+val);
pt.changeInt(val); //值參數(shù)
System.out.println("Int Value after Change is:" +val); /*值參數(shù)
值的修改,沒(méi)有影響值參數(shù)的值*/
pt.ptValue=101f;
System.out.println("Original ptValue is:"+pt.ptValue);
pt.changeObjValue(pt); //引用類(lèi)型的參數(shù)
System.out.println("ptValue after Change is:"+pt.ptValue);/* 引用參數(shù)值的修改,改變了引用參數(shù)的值*/
}
public void changeInt(int value){
value=55; //在方法內(nèi)部對(duì)值參數(shù)進(jìn)行了修改
}
public void changeObjValue(PassTest ref){
ref.ptValue=99f; //在方法內(nèi)部對(duì)引用參數(shù)進(jìn)行了修改
}
}
運(yùn)行結(jié)果 c:\>java PassTest
Original Int Value is : 11
Int Value after Change is: 11
Original ptValue is: 101.0
ptValue after Change is : 99.0
◇ 方法體
方法體是對(duì)方法的實(shí)現(xiàn),它包括局部變量的聲明以及所有合法的Java指令。方法體中聲明的局部變量的作用域在該方法內(nèi)部。若局部變量與類(lèi)的成員變量同名,則類(lèi)的成員變量被隱藏。
例3-2 說(shuō)明了局部變量z和類(lèi)成員變量z的作用域是不同的。
【例3-2】
import java.io.*;
class Variable{
int x=0,y=0,z=0; //類(lèi)的成員變量
void init(int x,int y) {
this.x=x; this.y=y;
int z=5; //局部變量
System.out.println("** in init**");
System.out.println("x="+x+" y="+y+" z="+z);
}
}
public class VariableTest{
public static void main(String args[]){
Variable v=new Variable();
System.out.println("**before init**");
System.out.println("x="+v.x+" y="+ v.y+" z="+v.z);
v.init(20,30);
System.out.println("**after init**");
System.out.println("x="+v.x+ " y="+ v.y+" z="+v.z);
}
}
運(yùn)行結(jié)果
c:\>java VariableTest
**before init**
x=0 y=0 z=0
** in init **
x=20 y=30 z=5
**after init**
x=20 y=30 z=0
上例中我們用到了this,這是因?yàn)閕nit()方法的參數(shù)名與類(lèi)的成員變量x,y的名字相同,而參數(shù)名會(huì)隱藏成員變量,所以在方法中,為了區(qū)別參數(shù)和類(lèi)的成員變量,我們必須使用this。this-----用在一個(gè)方法中引用當(dāng)前對(duì)象,它的值是調(diào)用該方法的對(duì)象。返回值須與返回類(lèi)型一致,或者完全相同,或是其子類(lèi)。當(dāng)返回類(lèi)型是接口時(shí),返回值必須實(shí)現(xiàn)該接口。
5.方法重載
方法重載是指多個(gè)方法享有相同的名字,但是這些方法的參數(shù)必須不同,或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)類(lèi)型不同。返回類(lèi)型不能用來(lái)區(qū)分重載的方法。
參數(shù)類(lèi)型的區(qū)分度一定要足夠,例如不能是同一簡(jiǎn)單類(lèi)型的參數(shù),如int與long。
【例3-3】
import java.io.*;
class MethodOverloading{
void receive(int i) {
System.out.println("Receive one int data");
System.out.println("i="+i);
}
void receive(int x, int y) {
System.out.println("Receive two int datas");
System.out.println("x="+x+" y="+y);
}
}
public class MethodOverloadingTest{
public static void main(String args[]) {
MethodOverloading mo=new MethodOverloading();
mo.receive(1);
mo.receive(2,3);
}
}
運(yùn)行結(jié)果(編譯器會(huì)根據(jù)參數(shù)的個(gè)數(shù)和類(lèi)型來(lái)決定當(dāng)前所使用的方法)
c:\>java MethodOverloadingTest
Receive one int data
i=1
Receive two int datas
x=2 y=3