【Java學習筆記二】繼承和多態

與C++不同的是,在Java中,一個類只能直接繼承另一個類,而不允許繼承多個類,這個新類稱為繼承類、派生類或者子類,而被繼承的類稱為基類或者父類。

繼承類能夠繼承基類的群不屬性和行為。

面向對象程序設計的三大特點為:封裝、繼承和多態
類的繼承能夠重復呢利用已有的類,在已有類的基礎上進行必要的擴充和修改就可以得到具有新功能和用途的類,從而簡化程序設計,提高了軟件開發的重用性、可維護性和可靠性。

具體格式為:

<修飾詞>class <派生類名> extends <父類名>
{<派生類成員表>
}

習慣要求派生類名第一個字母要大寫。
派生類成員可以是對已有成員的重新定義,賦予新的含義和功能,也可以定義基類中不存在的成員。

Java不支持多重繼承,因此繼承結構為樹狀結構,樹的最頂端額為java.lang.Object

在Object類中提供了許多的成員函數,其中主要的兩個為:

  • public boolean equals(Object obj)如果調用對象等于參數對象時返回真。
  • public String toString返回一個描述調用對象字符串

對于派生類來講,如果沒有顯式的定義構造函數在,則系統將定義一個缺省的構造函數,函數體首先使用super()語句來調用基類的無參數構造函數,對基類成員變量進行初始化,然后再調用派生類的無參數構造函數進行初始化。

在派生類中也能顯示的定義構造函數,加上super()語句,實現對基類數據成員初始化的任務。

這里補充一下super的含義:super代表了父類,我們可以通過super來調用父類的構造函數,成員函數和成員變量。在一般情況下子類繼承了父類的所有屬性,因此一般情況下我們都不需要使用super,但是當子類的成員和父類發生沖突或者涉及到子類的構造函數的時候就會用到super。

當子類的成員和父類的成員重復的時候子類的成員會對父類覆蓋,因此想要訪問父類的成員時就必須使用super顯式地調用父類的成員。(包含父類的成員變量和成員方法)。

子類的構造函數系統會默認在開頭加上一句super();來訪問父類的無參構造函數,無論我們是否定義了子類的構造函數(如果沒有定義系統會默認定義一個無參構造函數,其中剛開始會運行super()來運行父類無參構造函數,然后會對子類中特有的變量進行初始化,如果我們定義了子類的構造函數,系統同樣 的會在函數開頭加上一句super()),這就會導致一個問題就是如果父類沒有無參構造函數就會發生錯誤

在類中,若定義了構造函數,則系統不會隱含定義無參構造函數。如果定義了一個有參構造函數則訪問其無參構造函數是錯誤的

如果父類只有有參構造函數我們在子類的構造函數中就不能調用super(),所以我們必須顯式調用父類的有參構造函數,即super(參數列表);

如果想要了解詳細情況可以移步:傳送門1 | 傳送門2

派生類對基類成員的繼承:若派生類繼承的是不同包中的父類,則只能直接訪問父類中屬于publicprotected屬性的成員,不能訪問私有和缺省訪問的成員,若派生類繼承的是同一包中的父類,則能夠直接訪問公有、保護和缺省訪問權限的成員,不能訪問私有成員,即私有成員永遠不能被繼承。(體現其封裝性的、隱藏性的特點)

多態:一個方法可以有一個名稱多種形態。多態實現了“接口與實現的分離”,將“是什么”和“怎么做”分離,改善程序的組織框架以及可讀性,提高程序的可擴展性。
在Java中多態有兩種表現形式:

  1. 重寫(Override)
    也稱作覆蓋,指子類通過繼承覆蓋父類中的方法。
    重寫規則:
  • 參數列表必須完全與被重寫方法相同
  • 返回類型必須是被重寫方法返回值的派生類(當然可以相同)(java5及更早版本必須一樣)
  • 訪問權限不能比父類中被重寫的方法訪問權限更低。
  • 聲明為final或者static的方法不能被重寫,但是聲明為static的方法可以再次聲明(不太理解)
  • 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常,但是重寫方法不能拋出新的 強制性異常,或者比被重寫方法更廣泛的強制性異常。
  • 構造方法不能重寫

當需要在子類中調用父類的被重寫方法時,要使用super關鍵字。

  1. 重載(Overload)
    指在用一個類中可以定義多個同名的方法,只要確定他們的參數個數和類型不同即可。與返回值沒有關系

在這里插入圖片描述

在實際程序設計中,我們用父類的引用對象(指針)指向不同的實例化對象(分配到內存),即用父類的引用對象分別指向父類和子類的實例化成員就可以實現多態。

但是需要注意到一點是:只有方法會被覆蓋,屬性(變量)不會被覆蓋!!!

因此如果我們用父類的引用對象指向子類的實例化,那么我們訪問的方法是經過父類中經過子類重寫后(如果沒有重寫就是父類本身)的方法,但是訪問的屬性只能是父類的,而且我們也不能訪問父類沒有的子類特有的方法。

例如:

class Father
{int age;Father() {age=40;} void eat() {System.out.println("爸爸在吃飯");}
}
class Son extends Father
{int age;Son() {age=19;}void eat() {System.out.println("兒子在吃飯");}void play() {System.out.println("兒子在玩SC2");}
}class Main()
{public static void main(String[] args){Father a=new Son();System.out.println("年齡為"+a.age);a.eat();//a.play();}
}

運行結果為
在這里插入圖片描述

如果想要運行a.play();時就會出錯。

如果想要了解更多請戳這里

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383841.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用poll實現的io多路復用服務端和客戶端

http://blog.csdn.net/robertkun/article/details/52269313 參考&#xff1a;http://www.cnblogs.com/Anker/p/3261006.html 使用poll實現的io多路復用服務端和客戶端。 客戶端通過子進程創建多個客戶端連接。 客戶端每隔1秒向服務端發送一個時間戳&#xff0c; 服務端接收到時…

【Java學習筆記三】抽象類與接口

對象的類型轉換分為自動轉換和強制轉換兩種 派生類向基類轉換是自動轉換&#xff0c;因為派生類中包含基類基類向派生類的轉換是強制轉換 強制類型轉換是通過在轉換對象前面使用圓括號運算符來實現&#xff0c;圓括號內為要轉換的目標類型&#xff0c;格式為&#xff1a; (&…

Epoll 的tcp通信代碼(服務器+客戶端)

http://blog.csdn.net/libinbin_1014/article/details/50096187 Epoll 的tcp通信代碼&#xff08;服務器客戶端&#xff09; /* gcc -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS64 -I${ORACLE_HOME}/rdbms/public -I${ORACLE_HOME}/rdbms/demo -L${ORACLE_HOME}/lib -lclntsh …

【Java學習筆記四】Java中的包

包的聲明和引入&#xff1a;在Java語言系統中&#xff0c;Java編譯器為每一個類生成一個字節碼文件&#xff08;.class&#xff09;&#xff0c;為了對類文件進行分層和按用途分類管理&#xff0c;同時也為了解決相同類名的文件沖突的問題&#xff0c;Java提供了包機制來管理類…

Linux系統編程——線程池

http://blog.csdn.net/tennysonsky/article/details/46490099# 線程池基本原理 在傳統服務器結構中&#xff0c;常是有一個總的監聽線程監聽有沒有新的用戶連接服務器&#xff0c;每當有一個新的用戶進入&#xff0c;服務器就開啟一個新的線程用戶處理這 個用戶的數據包。這個線…

【Java學習筆記五】Java異常處理

異常通常分為三類&#xff1a; 程序可控制的異常&#xff1a;一般是可預見的錯誤&#xff0c;不是致命的。例如&#xff1a;除數為0&#xff0c;數組下標越界。程序不可控制的的異常&#xff1a;這種異常往往是致命的&#xff0c;但是系統可以預見的。例如&#xff1a;系統棧溢…

【C++學習筆記一】C++類和對象詳解

類定義是以關鍵字class開頭&#xff0c;后面跟類的名稱。主體是包含在一對花括號中。類定義后必須跟著一個分號或一個聲明列表。 類的對象的公共數據成員可以使用直接成員訪問運算符.來訪問。需要注意的是&#xff0c;私有的成員和受保護的成員不能直接使用成員訪問運算符來訪…

C語言實現的簡單的線程池

http://www.linuxidc.com/Linux/2013-01/77619.htm 有時我們會需要大量線程來處理一些相互獨立的任務&#xff0c;為了避免頻繁的申請釋放線程所帶來的開銷&#xff0c;我們可以使用線程池。下面是一個C語言實現的簡單的線程池。 頭文件&#xff1a; 1: #ifndef THREAD_POOL_H_…

C++獲取當前時間

可以使用windowsAPI直接獲取。 例如&#xff1a; #include<windows.h> #include<cstdio>using namespace std;int main() {SYSTEMTIME now;GetLocalTime(&now);printf("現在是%02d時%02d分%02d秒\n",now.wHour,now.wMinute,now.wSecond);printf(&…

成員函數后面加上const的作用

const表示成員函數不會修改類中的數據成員。 規則&#xff1a; 在類中被const 聲明的函數只能訪問const 函數&#xff0c;而非const 函數可以訪問任意成員函數。在成員函數中不管數據是否具有const 屬性&#xff0c;編譯器檢查的的是是否有修改&#xff08;賦值&#xff0c;自…

簡單Linux C線程池

http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html 大多數的網絡服務器&#xff0c;包括Web服務器都具有一個特點&#xff0c;就是單位時間內必須處理數目巨大的連接請求&#xff0c;但是處理時間卻是比較短的。在傳統的多線程服務器模型中是這樣實現的&#xff1…

C++創建對象:棧和堆的區別

首先我們應該了解棧和堆的差別&#xff1a; 詳細信息&#xff1a;傳送門 棧相當于函數自帶的存儲空間&#xff0c;在windows下一般為2M,在Linux下一般為8M&#xff0c;存取速度稍微快一點。堆是系統的空間&#xff0c;相對較大&#xff0c;一般為2G&#xff0c;效率稍微慢一點…

IO多路復用之poll總結

http://www.cnblogs.com/Anker/p/3261006.html 1、基本知識 poll的機制與select類似&#xff0c;與select在本質上沒有多大差別&#xff0c;管理多個描述符也是進行輪詢&#xff0c;根據描述符的狀態進行處理&#xff0c;但是poll沒有最大文件描述符數量的限制。poll和select同…

【C++學習筆記二】C++繼承

繼承 繼承允許我們一句另一個類來定義一個類&#xff0c;這使得繼承和維護一個程序變得更加容易&#xff0c;也達到了重用代碼功能和提高執行效率的效果。 一般格式為&#xff1a; class 派生類名 :訪問修飾符 基類名{};其中訪問修飾符是public protected private中的一個&a…

處理大并發之二 對epoll的理解,epoll客戶端服務端代碼

http://blog.csdn.net/wzjking0929/article/details/51838370 序言&#xff1a; 該博客是一系列的博客&#xff0c;首先從最基礎的epoll說起&#xff0c;然后研究libevent源碼及使用方法&#xff0c;最后研究nginx和node.js&#xff0c;關于select,poll這里不做說明&#xff0c…

C++基類指針指向派生類(指針)

我們常用基類指針指向派生類對象來實現多態性。 私有繼承不允許基類指針指向派生類 基類指針只能訪問到基類中含有的公有成員。 當用基類指針指向派生類對象在動態分配堆上內存的時候&#xff0c;析構函數必須是虛函數! 成員如果是數據成員的話訪問的是基類的版本&#xff…

C++虛繼承中構造函數和析構函數順序問題以及原理

多重繼承的問題&#xff1a;多個類B,C,…繼承同一個類A導致如果X繼承了B,C,…那么在X中將還有多個A中成員的拷貝&#xff0c;如果想要訪問A中的成員如果不加名字空間將會導致二義性&#xff0c;這種拷貝大多是沒有實際意義的&#xff0c;為了避免這種空間浪費&#xff0c;C有虛…

一個簡單的linux線程池

http://blog.csdn.net/wzjking0929/article/details/20312675 線程池&#xff1a;簡單地說&#xff0c;線程池 就是預先創建好一批線程&#xff0c;方便、快速地處理收到的業務。比起傳統的到來一個任務&#xff0c;即時創建一個線程來處理&#xff0c;節省了線程的創建和回收的…

【C++學習筆記三】C++多態、抽象(接口)

當類之間存在多種層次結構&#xff0c;并且類之間通過繼承關聯時就會用到多態。 虛函數在子類中的覆蓋版本和該函數在基類中的原始版本必須有相同的函數簽名、函數名、形參名、常屬性。如果返回值為非類類型&#xff0c;則必須相同&#xff0c;如果是類類型A的指針或者引用&am…

C++重載和重寫的條件以及重寫后對基類函數的覆蓋

重載&#xff1a;同一個類中名字相同&#xff0c;參數列表不同的方法構成重載函數&#xff0c;和返回值沒有關系。這就意味著就算返回值不同&#xff0c;只要名字相同參數列表相同編譯器還是會報錯&#xff0c;覺得一函數被定義了兩次。 重寫&#xff1a;派生類中只要函數名字…