1. 程式人生 > >java中的類與對象

java中的類與對象

共享 泛化 不能 變量聲明 eas diag 特征 類變量 set

面向對象編程主要有三個特征:封裝、繼承和多態。

封裝

一個簡單的問題

一個能輸出圓的面積的Java應用程序。

public class ComputerCircleArea {
public static void main(String args[]) {
double radius; //半徑
double area; //面積
radius=163.16;
area=3.14*radius *radius; //計算面積
System.out.printf("半徑是%5.3f的園的面積:\n%5.3f\n",radius,area);
}
}

其實, 假設其它Java應用程序也想計算圓的面積。相同須要知道計算圓面積的算法。即也須要編寫和這裏相同多的代碼。
如今提出例如以下問題:
是否能將和圓有關的數據以及計算圓面積的代碼進行封裝。使得須要計算圓面積的Java應用程序的主類無需編寫計算面積的代碼就能夠計算出圓的面積呢?


面向對象的一個重要思想就是通過抽象得到類,即將某些數據以及針對這些數據上的操作封裝在一個類中。也就是說。抽象的關鍵點有兩點一是數據,二是數據上的操作。
我們對所觀察的圓做例如以下抽象:
?圓具有半徑之屬性。


?能夠使用半徑計算出圓的面積。
如今依據如上的抽象,編寫出例如以下的Circle類。


class Circle {
double radius; //圓的半徑
double getArea() { //計算面積的方法
double area=3.14*radius*radius;
return area;
}
}
(1)類聲明:上述代碼第一行中的class Circle稱作類聲明。Circle是類名。
(2)類體:類聲明之後的一對大括號"{"。"}"以及它們之間的內容稱作類體,大括號之間的內容稱作類體的內容。

下面將在一個Java應用程序的主類中使用Circle類創建對象。該對象能夠完畢計算圓面積的任務,而使用該對象的Java應用程序的主類,無需知道計算圓面積的算法就能夠計算出圓的面積。
因為類也是一種數據類型。因此能夠使用類來聲明一個變量,那麽,在Java語言中,用類聲明的變量就稱之為一個對象。


◆用Circle聲明一個名字為circle的對象的代碼例如以下:
Circle circle;
◆為Circle類聲明的circle對象分配變量的代碼例如以下:
circle = new Circle();
◆對象通過使用“.”運算符操作自己的變量和調用方法。

對象操作自己的變量的的格式為:對象.變量;
比如,circle.radius=100;
◆調用方法的格式為: 對象.方法;
比如,circle.getArea();

類是組成Java程序的基本要素。類封裝了一類對象的狀態和方法。

類是用來定義對象的模板。
類的實現包含兩部分:類聲明和類體。
基本格式為:
class 類名 {
類體的內容
}
class是keyword,用來定義類。
"class 類名" 是類的聲明部分。類名必須是合法的Java標識符。
兩個大括號以及之間的內容是類體。

類聲明

◆類聲明 : class 類名
比如:
class Retangle {
… …
}
當中的“class Retangle”稱作類聲明;“Retangle”是類名。

◆ 給類命名時,遵守下列編程風格(這不是語法要求的,但應當遵守):
(1) 假設類名使用拉丁字母,那麽名字的首字母使用大寫字母,如。
(2) 類名最好easy識別、見名知意。當類名由幾個“單詞”復合而成時,每一個單詞的首字母使用大寫。


類體

◆ 類聲明之後的一對大括號“{”,“}”以及它們之間的內容稱作類體,大括號之間的內容稱作類體的內容。
◆類體的內容由兩部分構:
一部分是變量的聲明。用來刻畫屬性;
還有一部分是方法的定義,用來刻畫功能。
以下是一個類名為Retangle的類,
類體內容的變量聲明部分給出了兩個double類型的變量width和heightr。
方法定義部分定義了getArea()方法。


class Rectangle {
double width; //變量聲明部分,矩形的寬
double height; //變量聲明部分,矩形的高
double getArea() { //定義計算面積的方法
return width*height;
}
}

成員變量和局部變量

類體分為兩部分:一部分是變量的聲明,還有一部分是方法的定義。
類體中變量聲明部分所聲明的變量被稱作類的成員變量。

在方法體中聲明的變量和方法的參數被稱作局部變量。
1.成員變量的類型:成員變量的類型能夠是Java中的不論什麽一種數據類型,包含基本類型整型、浮點型、字符型。引用類型:數組、對象和接口(對象和接口見興許內容)。
2.成員變量的有效範圍:成員變量在整個類內都有效,其有效性與它在類體中書寫的先後位置無關。


3.編程風格
(1)一行僅僅聲明一個變量。


(2)變量的名字符合標識符規定。
(3)變量名字見名知意。避免easy混淆的變量名字。


方法

類體分為兩部分:一部分是變量的聲明,還有一部分是方法的定義。


方法的定義包含兩部分:方法聲明和方法體。一般格式為:
方法聲明部分 {
方法體的內容
}
1.方法聲明 方法聲明包含方法名和方法的返回類型,如:
double getArea() {
return width*height;
}
關註方法的返回類型、方法的參數、方法的名字
2.方法體
方法聲明之後的一對大括號"{" 。"}"以及之間的內容稱作方法的方法體。方法體的內容包含局部變量的聲明和Java語句。
在方法體中聲明的變量和方法的參數被稱作局部變量。
3.區分成員變量和局部變量
假設局部變量的名字與成員變量的名字同樣。則成員變量被隱藏,即這個成員變量在這種方法內臨時失效。

須要註意的問題

類體的內容由兩部分構成:一部分是變量的聲明,還有一部分是方法的定義。


對成員變量的操作僅僅能放在方法中。方法能夠對成員變量和該方法體中聲明的局部變量進行操作。
在聲明成員變量時能夠同一時候賦予初值,可是不能夠在類體中有單獨的賦值語句(類體中不能夠有變量的聲明和方法的定義以外的其他語句)。


class A {
int a=12;
float b=12.56f;
}

可是不能夠這樣做:
class A {
int a;
float b;
a=12; //非法。這是賦值語句(語句不是變量的聲明,僅僅能出如今方法體中)
b=12.56f; //非法
}

類的UML圖

UML(Unified Modeling Language Diagram)圖屬於結構圖。常被用於描寫敘述一個系統的靜態結構。

一個UML中通常包括有類(Class)的UML圖,接口(Interface)的UML圖以及泛化關系(Generalization)的UML圖、關聯關系(Association)的UML圖、依賴關系(Dependency)的UML圖和實現關系(Realization)的UML圖。
在類的UML圖中,使用一個長方形描寫敘述一個類的主要構成,將長方形垂直地分為三層。


第1層是名字層;
第2層是變量層,也稱屬性層;
第3層是方法層,也稱操作層。


類與Java應用程序的基本結構

一個Java應用程序(也稱為一個project)是由若幹個類所構成,這些類能夠在一個源文件裏,也能夠分布在若幹個源文件裏。
Java同意在一個Java源文件裏編寫多個類,但當中的多個類至多僅僅能有一個類使用public修飾。


假設源文件裏有多個類,但沒有public類,那麽源文件的名字僅僅要和某個類的名字同樣,而且擴展名是.java就能夠了。

假設有一個類是public類,那麽源文件的名字必須與這個類的名字全然同樣,擴展名是.java。編譯源文件將生成多個擴展名為.class的字節碼文件。每一個字節碼文件的名字與源文件裏相應的類的名字同樣,這些字節碼文件被存放在與源文件同樣的文件夾中 。

構造方法與對象的創建

類是面向對象語言中最重用的一種數據類型,能夠用它來聲明變量。
在面向對象語言中,用類聲明的變量被稱作對象。
和基本數據類型不同,在用類聲明對象後,還必需要創建對象,即為聲明的對象分配變量(確定對象所具有的屬性),當使用一個類創建一個對象時。也稱給出了這個類的一個實例。通俗的講。類是創建對象的“模板”,沒有類就沒有對象。
構造方法和對象的創建密切相關 。

構造方法

構造方法是一種特殊方法。它的名字必須與它所在的類的名字全然同樣。並且沒有類型。
同意一個類中編寫若幹個構造方法,但必須保證他們的參數不同。即參數的個數不同。或者是參數的類型不同。

須要註意的是
(1) 假設類中沒有編寫構造方法,系統會默認該類僅僅有一個構造方法。該默認的構造方法是無參數的。且方法體中沒有語句。
(2)假設類裏定義了一個或多個構造方法,那麽Java不提供默認的構造方法 。


創建對象

1.對象的聲明 一般格式為:
類的名字 對象名字;
如:Rectangle rectOne;
這裏Rectangle是一個類的名字。rectOne是聲明的對象的名字。


2.為聲明的對象分配內存
使用new運算符和類的構造方法為聲明的對象分配變量,即創建對象。假設類中沒有構造方法,系統會調用默認的構造方法。

如: rectOne = new Rectangle();

3.對象的內存模型
(1)聲明對象時的內存模型
(2)對象分配內存後的內存模型
4.創建多個不同的對象

使用對象

對象不僅能夠操作自己的變量改變狀態,並且能調用類中的方法產生一定的行為。
通過使用運算符“.”,對象能夠實現對自己的變量訪問和方法的調用。


1.對象操作自己的變量(對象的屬性)
對象創建之後。就有了自己的變量。即對象的實體。通過使用運算符“.”,對象能夠實現對自己的變量的訪問,訪問格式為:對象.變量;
2.對象調用類中的方法(對象的功能)
對象創建之後,能夠使用運算符“.”調用創建它的類中的方法。從而產生一定的行為功能。調用格式為: 對象.方法;
3.體現封裝
當對象調用方法時,方法中出現的成員變量就是指分配給該對象的變量。


樣例3
rectOne.getArea();
rectTwo.getArea();
註:當對象調用方法時,方法中的局部變量被分配內存空間。方法運行完成,局部變量即刻釋放內存。須要註意的是,局部變量聲明時假設沒有初始化,就沒有默認值,因此在使用局部變量之前,要事先為其賦值。


對象的引用和實體

1.避免使用空對象: 沒有實體的對象稱作空對象。空對象不能使用,即不能讓一個空對象去調用方法產生行為。


2.垃圾收集: 一個類聲明的兩個對象假設具有同樣的引用,那麽二者就具有全然同樣的實體。

class Point {
int x,y;
void setXY(int m,int n) {
x = m;
y = n;
}
}

public class E {
public static void main(String args[]) {
Point p1,p2;
p1 = new Point();
p2 = new Point();
System.out.println("p1的引用:"+p1);
System.out.println("p2的引用:"+p2);
p1.setXY(1111,2222);
p2.setXY(-100,-200);
System.out.println("p1的x,y坐標:"+p1.x+","+p1.y);
System.out.println("p2的x,y坐標:"+p2.x+","+p2.y);
p1 = p2;
System.out.println("將p2的引用賦給p1後:");
System.out.println("p1的引用:"+p1);
System.out.println("p2的引用:"+p2);
System.out.println("p1的x,y坐標:"+p1.x+","+p1.y);
System.out.println("p2的x,y坐標:"+p2.x+","+p2.y);
}
}

參數傳值

方法中最重要的部分之中的一個就是方法的參數。參數屬於局部變量,當對象調用方法時,參數被分配內存空間,並要求調用者向參數專遞值,即方法被調用時。參數變量必須有詳細的值。

傳值機制

在Java中,方法的全部參數都是“傳值”的,也就是說,方法中參數變量的值是調用者指定的值的拷貝。
比如,假設向方法的int型參數x傳遞一個int值,那麽參數x得到的值是傳遞的值的拷貝。

基本數據類型參數的傳值

對於基本數據類型的參數,向該參數傳遞的值的級別不能夠高於該參數的級別 。
比方。不能夠向int型參數傳遞一個float值,但能夠向double型參數傳遞一個float值。
在前面的樣例4中有,對象調用setXY(int m,int n)設置自己的x,y坐標值,因此,對象在調用setXY(int m,int n)方法時,必須向方法的參數m和n傳遞值。

引用類型參數的傳值

當參數是引用類型時。“傳值”傳遞的是變量中存放的“引用”,而不是變量所引用的實體。

對象的組合

類的成員變量能夠是Java同意的不論什麽數據類型,因此,一個類能夠把對象作為自己的成員變量,假設用這種類創建對象,那麽該對象中就會有其他對象,也就是說該對象將其他對象作為自己的組成部分(這就是人們常說的Has-A)。


圓錐體

對圓錐體作一個抽象。屬性:底圓。高
 功能:計算體積
圓錐體的底圓應當是一個對象。比方Circle類聲明的對象。圓錐體的高能夠是double型的變量,即圓錐體將Circle類的對象作為自己的成員。

關聯關系和依賴關系的UML圖

1.關聯關系: 假設A類中成員變量是用B類聲明的對象,那麽A和B的關系是關聯關系,稱A關聯於B或A組合了B。
假設A關聯於B,那麽UML通過使用一個實線連A和B的UML圖,實線的起始端是A的UML圖。終點端是B的UML圖。但終點端使用一個指向B的UML圖的方向箭頭表示實線的結束。

2.依賴關系: 假設A類中某個方法的參數是用B類聲明的對象或某個方法返回的數據類型是B類對象,那麽A和B的關系是依賴關系,稱A依賴於B。


假設A依賴於B,那麽UML通過使用一個虛線連A和B的UML圖,虛線的起始端是A的UML圖,終點端是B的UML圖。但終點端使用一個指向B的UML圖的方向箭頭表示虛線的結束。

實例成員與類成員

實例變量和類變量的聲明

類的成員變量可細分為實例變量和類變量。
在聲明成員變量時,用keywordstatic給予修飾的稱作類變量。否則稱作實例變量(類變量也稱為static變量,靜態變量).
比如:
class Dog {
float x; //實例變量
static int y; //類變量
}
Dog類中,x是實例變量,而y是類變量。
須要註意的是static需放在變量的類型的前面。


實例變量和類變量的差別

1.不同對象的實例變量互不同樣
2.全部對象共享類變量
3.通過類名直接訪問類變量

實例方法和類方法的定義

類中的方法也可分為實例方法和類方法。方法

聲明時,方法

類型前面不加keywordstatic修飾的是實例方法、加

statickeyword修飾的是類方法(靜態方法)。


java中的類與對象