Java基礎:類的深入研究(轉)
Java基礎:類的深入研究(轉)[@more@]1:在Java中使用繼承
物件導向的程式設計中最為強大的功能是類的繼承,類的繼承允許你在一個已經存在的類之上編寫新的程式,例如,你想建立一個可在螢幕上顯示並能填充它的矩形類,你可以從頭開始或者利用舊的矩形類,下面的部分將向你介紹如何繼承已存在的Rectangle類,而不需重寫其中的程式碼。
比如建立一個fillRect類,該類可以使用Rectangle類中所有已定義的資料和成員函式,如:width、height等資料和getArea等成員函式,就可是使用繼承的方法來實現。使用extands關鍵字讓Java程式設計師能夠繼承已有類的成員函式,為了繼承Rectangle類,你必須引用舊的Rectangle類,你必須引用舊的Rectangle類,並且在新類的說明中引用它,比如:
import Shapes.Rectangle;
class fillRect extands Rectangle
{
.....
}
2:成員函式的過載
繼承之後,如何使fillRect類比Rectangle類有所提高呢?我們可以用如下程式碼來實現一個新的drawRect成員函式,它將大大縮短程式碼,並能填充矩形,而不是僅僅畫出矩形的輪廓:
private String makeString(chr ch,int num)
{
StringBuffer str=new StringBuffer();
for(int i=num;i>0;i--)
str.append(ch);
return str.toString();
}
public void drawRect()
{
for(int i=height;i>0;i--)
System.out.println(makeString("#",width));
}
注意這裡我們使用了StringBuffer類。之所以使用StringBuffer是因為String只能產生一個靜態型別--它的大小是不能改變的,而StringBuffer能夠產生一個可變長度的字串型別。
在這裡,drawRect成員函式被過載了,透過使用相同的成員函式名字,你可以用新的成員函式來代替舊的成員函式。不過,那些被說明為final的成員函式是不能被過載的。
注意,你不必在新的類中包含那些與被繼承類相同的程式碼,而只需要加入你想要的東西,但你必須建立一個新的構造成員函式,以區分這兩個不同的類。
新類的全貌如下所示,你可以發現透過繼承Rectangle類,程式碼變得非常簡單明瞭。
class fillRect extands Rectangle
{
public fillRect(int w,int h)
{
supper(w,h);
private String makeString(char ch,int num)
{
StringBuffer str=new StringBuffer();
for(int i=num;i>0;i--)
str.append(ch);
return str.toString();
}
public void drawRect()
{
for(int i=height;i>0;i--)
System.out.printlm(makeString("#",width));
}
}
}
3:使用介面
Java可以建立一種稱作介面(interface)的類,在這個類中,所有的成員函式都是抽象的,也就是說它們都只有說明沒有定義,你可以如下所示來說明一個介面。
public interface interfaceName
//成員函式說明
介面中成員函式的預設引用型別是private,介面(interface)的內部變數是不可更改的,並且總是static和final。
透過使用關鍵字implement,你可以在定義類時繼承一個介面。不過與extends不同的是,一個類可以同時繼承多個介面。
使用介面的優點在何處呢?透過建立一個介面,你可以說明一整套抽象的成員函式而無須去具體實現它,所有繼承了這個介面的類,都將有著具有相同原形的成員函式。例如,你想所有的shapes都有一個draw()成員函式,你可以建立一個介面並且用Shape命名:
public interface Shape
void draw();
現在,無論你何時建立一個繼承自Shape的類,都將擁有一個成員函式draw()。
4:類的轉換
類的轉換,與不同型別的變數之間的轉換有相似之處,但並不一樣。
我們可以把一個父類的物件轉換成一個子類物件,下面的程式碼說明一個類轉換的例子,其中Y類是從X類繼承而來的:
Y y=new Y();
X x;
x=y;
需要注意的是兩個子類之間的轉換是不可以的。
5:null,this和supper變數
所有的類都有三種變數:null、this和supper。
null變數不指向任何實際物件,而是指向一個空物件,如下例所示:
Rectangle rect=null;
該例產生一個矩形類的變數,但不建立一個實際的物件。另外,假如一個成員函式需要一個物件作為引數時,你同樣可以用null代替。
this變數指向物件本身,一個類可以透過this變數來獲得一個代表它自身的物件變數。
supper變數是一個指向類父類構造成員函式的變數,你可以透過呼叫它,來迅速完成對子類的構造成員函式的設計。
物件導向的程式設計中最為強大的功能是類的繼承,類的繼承允許你在一個已經存在的類之上編寫新的程式,例如,你想建立一個可在螢幕上顯示並能填充它的矩形類,你可以從頭開始或者利用舊的矩形類,下面的部分將向你介紹如何繼承已存在的Rectangle類,而不需重寫其中的程式碼。
比如建立一個fillRect類,該類可以使用Rectangle類中所有已定義的資料和成員函式,如:width、height等資料和getArea等成員函式,就可是使用繼承的方法來實現。使用extands關鍵字讓Java程式設計師能夠繼承已有類的成員函式,為了繼承Rectangle類,你必須引用舊的Rectangle類,你必須引用舊的Rectangle類,並且在新類的說明中引用它,比如:
import Shapes.Rectangle;
class fillRect extands Rectangle
{
.....
}
2:成員函式的過載
繼承之後,如何使fillRect類比Rectangle類有所提高呢?我們可以用如下程式碼來實現一個新的drawRect成員函式,它將大大縮短程式碼,並能填充矩形,而不是僅僅畫出矩形的輪廓:
private String makeString(chr ch,int num)
{
StringBuffer str=new StringBuffer();
for(int i=num;i>0;i--)
str.append(ch);
return str.toString();
}
public void drawRect()
{
for(int i=height;i>0;i--)
System.out.println(makeString("#",width));
}
注意這裡我們使用了StringBuffer類。之所以使用StringBuffer是因為String只能產生一個靜態型別--它的大小是不能改變的,而StringBuffer能夠產生一個可變長度的字串型別。
在這裡,drawRect成員函式被過載了,透過使用相同的成員函式名字,你可以用新的成員函式來代替舊的成員函式。不過,那些被說明為final的成員函式是不能被過載的。
注意,你不必在新的類中包含那些與被繼承類相同的程式碼,而只需要加入你想要的東西,但你必須建立一個新的構造成員函式,以區分這兩個不同的類。
新類的全貌如下所示,你可以發現透過繼承Rectangle類,程式碼變得非常簡單明瞭。
class fillRect extands Rectangle
{
public fillRect(int w,int h)
{
supper(w,h);
private String makeString(char ch,int num)
{
StringBuffer str=new StringBuffer();
for(int i=num;i>0;i--)
str.append(ch);
return str.toString();
}
public void drawRect()
{
for(int i=height;i>0;i--)
System.out.printlm(makeString("#",width));
}
}
}
3:使用介面
Java可以建立一種稱作介面(interface)的類,在這個類中,所有的成員函式都是抽象的,也就是說它們都只有說明沒有定義,你可以如下所示來說明一個介面。
public interface interfaceName
//成員函式說明
介面中成員函式的預設引用型別是private,介面(interface)的內部變數是不可更改的,並且總是static和final。
透過使用關鍵字implement,你可以在定義類時繼承一個介面。不過與extends不同的是,一個類可以同時繼承多個介面。
使用介面的優點在何處呢?透過建立一個介面,你可以說明一整套抽象的成員函式而無須去具體實現它,所有繼承了這個介面的類,都將有著具有相同原形的成員函式。例如,你想所有的shapes都有一個draw()成員函式,你可以建立一個介面並且用Shape命名:
public interface Shape
void draw();
現在,無論你何時建立一個繼承自Shape的類,都將擁有一個成員函式draw()。
4:類的轉換
類的轉換,與不同型別的變數之間的轉換有相似之處,但並不一樣。
我們可以把一個父類的物件轉換成一個子類物件,下面的程式碼說明一個類轉換的例子,其中Y類是從X類繼承而來的:
Y y=new Y();
X x;
x=y;
需要注意的是兩個子類之間的轉換是不可以的。
5:null,this和supper變數
所有的類都有三種變數:null、this和supper。
null變數不指向任何實際物件,而是指向一個空物件,如下例所示:
Rectangle rect=null;
該例產生一個矩形類的變數,但不建立一個實際的物件。另外,假如一個成員函式需要一個物件作為引數時,你同樣可以用null代替。
this變數指向物件本身,一個類可以透過this變數來獲得一個代表它自身的物件變數。
supper變數是一個指向類父類構造成員函式的變數,你可以透過呼叫它,來迅速完成對子類的構造成員函式的設計。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-963805/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java基礎類庫【Java】Java
- JAVA基礎--Arrays類Java
- Java基礎| 類和物件Java物件
- Java基礎 ---Throwable異常類Java
- Java基礎-抽象類和介面Java抽象
- Java基礎——深入理解類的載入Java
- Java基礎篇—Java類載入機制Java
- Java基礎類String學習分析Java
- 理解Java中物件基礎Object類Java物件Object
- 整理Java基礎知識--Calendar 類Java
- Java 常用類總結(SE基礎)Java
- Java基礎-內部類詳解Java
- java 基礎型別與byte[]的轉換Java型別
- Java基礎7:關於Java類和包的那些事Java
- JAVA基礎之三-介面和抽象類Java抽象
- JAVA基礎之介面與內部類Java
- Java基礎系列(七):物件與類(下)Java物件
- 重拾java基礎之內部類Java
- 深入研究Java StringJava
- # JAVA 之 我們都要熟悉的基礎功能類庫Java
- 類轉json的基類實現JSON
- Java基礎內部類4-內部類進階Java
- java基礎學習之類集框架(十)Java框架
- 整理Java基礎知識--Number&Math類Java
- java基礎-複用類-複用方式(2)Java
- Java基礎8:深入理解內部類Java
- 《Java程式設計邏輯》第3章 類的基礎Java程式設計
- Java基礎之IO轉換流學習Java
- [Java基礎]之 資料型別轉換Java資料型別
- 【基礎題】【類】類的設計思路
- JAVA物件導向基礎--N種內部類Java物件
- Java基礎10 介面的繼承與抽象類Java繼承抽象
- java基礎之二:取整函式(Math類)Java函式
- java基礎之執行緒 認識原子類Java執行緒
- 《java程式設計基礎》java的基礎知識(三)Java程式設計
- 為什麼Java中有三種基礎的類載入器?Java
- 常用的Java類方法【轉載】Java
- Java —— 流的抽象基類Java抽象
- 夯實Java基礎系列9:深入理解Class類和Object類JavaObject