實驗2物件導向 b繼承 多型抽象類 介面

2023-02-02 07:12:04 字數 3458 閱讀 7022

實驗2 物件導向(繼承、多型、抽象類、介面)

注意:有些程式由於word的關係,複製後,tab縮位可能會變成其它符號。需要你去調整一下,刪除縮位,重新tab

一、實驗目的 1

二、實驗要求 1

三、實驗內容 2

1. 類的繼承與覆蓋練習 2

1.0 父類的哪些成員可以被繼承? 2

1.1 父類student(學生)與子類histudent(大學生) 2

1.2 例項方法為什麼需要覆蓋 4

1.3 驗證成員方法的覆蓋方式 5

1.4 this、super和super()的使用 6

1.5 變數、靜態方法的隱藏。 9

1.6 隱藏與覆蓋的綜合性例項 10

2. 類的多型性練習 11

2.1 普通方法的過載(實驗3,本實驗略) 11

2.2 構造方法的過載(實驗3,本實驗略) 11

2.3 執行時多型與動態繫結 11

3. 抽象類 13

4. 介面 14

通過程式設計和上機實驗理解j**a語言的物件導向特性,了解類的繼承性和多型性的作用,掌握它們的實現方法,了解資料域和靜態方法的隱藏,了解抽象類和介面的作用。

1、 編寫體現類的繼承性(成員變數、成員方法、成員變數隱藏)的程式;

2、 編寫體現類的多型性的程式;

3、 編寫體現抽象類和介面功能的程式。

例如,圓是一種形狀。圓類circle是形狀類shape的子類。父類也叫基類、超類,子類也叫次類、擴充套件類、派生類。

子類可從父類中產生,保留父類的成員變數和方法,並可根據需要對它們加以修改。新類還可新增新的變數和方法。這種現象就稱為類的繼承。

當建立乙個父類時,不必寫出全部成員變數和成員方法。只要簡單地宣告這個類是從乙個已定義的類繼承下來的,就可以引用被繼承類的全部成員。

j**a 提供了乙個龐大的類庫讓開發人員繼承和使用。設計這些類是出於公用的目的,因此,很少有某個類恰恰滿足你的需要。你必須設計自己的能處理實際問題的類,如果你設計的這個類僅僅實現了繼承,和父類一樣,那樣沒什麼用。

所以,通常要對父類進行擴充套件,即新增新的屬性和方法。這使得子類要比父類大,但更具特殊性,代表著一組更具體的物件。繼承的意義就在於此。

可以訪問的成員才能被繼承。

具體分2種情況:

* 當父類和子類在同乙個包時,子類可以繼承父類中的public/protected/無修飾級別的變數和方法;

* 當父類和子類不在同乙個包時,且父類是public的,那麼子類可以繼承父類的public/protected 級別的變數和方法。如果父類前沒有public,那麼子類無法訪問父類,更談不上繼承的問題。

(1) 程式源**如下。

public class student //學生類

public void print() //輸出姓名和學號

} (2) 的描述和**如下

程式功能:通過student類產生子類histudent,其不僅具有父類的成員變數xm(姓名)、xh(學號),還定義了新成員變數xy(學院)、xi(系)。在程式中呼叫了父類的print方法,同時可以看出子類也具有該方法。

程式源**如下

public class histudent extends student

} (3)編譯並執行,結果如下圖所示。

上例中,語句呼叫父類的方法,只能輸出父類的資料(姓名和學號)。如果想用函式輸出姓名、學號、學院、系,需要在子類中另外新增乙個函式。如果這個函式也叫print(),(嗯,這樣好記),並且如果形參、返回型別都一樣,並且其可見性修飾符和父類print()方法的一樣甚至更開放,並且它們都不是靜態的,並且它所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類,或者什麼也不丟擲,那麼,我們可以說子類的print()方法覆蓋(override)了父類的print()方法。

子類中新增的print()可以這樣寫:

public void print() //輸出姓名、學號、學院、系

可見,子類的覆蓋方法重寫(修改)了父類的被覆蓋方法。實現了不同的功能。當然,父類的被覆蓋方法仍然存在,在子類中可以用來引用。

嗯,如果引數不一樣,那也叫過載。如果返回型別不一樣,或者乙個靜態乙個非靜態,或者子類方法的開放性比父類被覆蓋方法的更低,都會編譯錯。如果兩個方法其它一樣,又都是靜態的,這沒問題,叫做隱藏,而非覆蓋。

另外,父類中用final修飾的方法不能被覆蓋。

再重複一下方法覆蓋的概念:如果在子類中定義乙個方法,其名稱、返回型別及引數簽名正好與父類中某個方法的名稱、返回型別及引數簽名相匹配,那麼可以說,子類的方法覆蓋了父類的方法。

覆蓋的說明:

子類的方法名稱返回型別及引數簽名必須與父類的一致

子類方法不能縮小父類方法的訪問許可權

子類方法不能丟擲比父類方法更多的異常

方法覆蓋只存在於子類和父類之間,同乙個類中只能過載

父類的靜態方法不能被子類覆蓋為非靜態方法

子類可以定義於父類的靜態方法同名的靜態方法,以便在子類中隱藏父類的靜態方法(滿足覆蓋約束),

j**a虛擬機器把靜態方法和所屬的類繫結,而把例項方法和所屬的例項繫結。

父類的非靜態方法不能被子類覆蓋為靜態方法

父類的私有方法不能被子類覆蓋

父類的抽象方法可以被子類通過兩種途徑覆蓋(即實現和覆蓋)

父類的非抽象方法可以被覆蓋為抽象方法

方法覆蓋為子類提供了修改父類例項方法的能力。例如,object類的tostring方法返回的字串是「類名@隨機碼」這樣的。子類可以修改層層繼承下來的object 根類的tostring 方法,讓它輸出一些更有用的資訊。

下面的程式顯示了在子類circle 中新增tostring 方法,用來返回圓半徑和圓面積資訊。

(1) 編寫circle類,覆蓋object 類的tostring方法,circle類和test類源**如下。

class circle

public void setradius(int r)

public int getradius()

public double area()

public string tostring()

}public class test

}(1) 程式功能:說明this.、this()、super.

和super()的用法。程式首先定義point(點)類,然後建立點的子類line(線)。line繼承了point的點,它自己又定義了乙個點。

最後通過test類輸出線段的長度。line物件程式中通過super(a,b)呼叫父類point 的構造方法為父類的x和y賦值。在子類line 的setline方法中,因為引數名和成員變數名相同,為給成員變數賦值,使用this 引用,告訴編譯器是為當前類的成員變數賦值。

在length 和tostring 方法中使用父類成員變數時,使用super 引用,告訴編譯器使用的是父類的成員變數。

(2) 程式源**如下。

class point {

protected int x, y;

《物件導向程式設計》實驗2實驗報告

南京工程學院實驗報告 注 將實驗成果檔案 包含實驗報告電子檔案 程式源 檔案等 用winrar打包,以 班級 學號 實驗x rar檔案形式交付指導老師。一 實驗目的 1 掌握c 程式中的基本語法 2 掌握windows應用程式基本控制項的使用 掌握除錯工具的使用.3 初步熟悉c 語言的事件驅動機制,...

物件導向實驗報告

物件導向分析與設計 實驗一用例圖 一 實驗目的 1.學會分析系統中的參與者和用例 2.掌握用例圖的繪製方法 二 實驗器材 1.計算機一台 2.rational rose 工具軟體 三 實驗內容 畫出atm系統的用例圖 四 實驗截圖 五 實驗體會 用例圖是物件導向程式設計的重要圖之一。對於物件導向程式...

物件導向程式設計實驗報告

綜合實驗報告 專業名稱 物聯網工程 班級 2012級2班 姓名 你哥哥 學號 201202051928 資訊科學與工程學院 二零一三年七月 第一題 2 1.1題目概述 2 1.2設計思路 2 1.3設計說明與除錯分析 2 1.4編碼實現 3 1.5程式執行結果 4 1.6設計心得 4 第二題 5 2...