1、面向對象 面向對象(Object Oriented)是一種新興的程序設計方法,或者是一種新的程序設計規范(paradigm),其基本思想是使用對象、類、繼承、封裝、多態等基本概念來進行程序設計。從現實世界中客觀存在的事物(即對象)出發來構造軟件系統,并且在系統構造中盡可能運用人類的自然思維方式。 1.1面向對象 面向對象是一種程序設計思想,計算機程序的設計實質上就是將現實中的一些事物的特征抽離出來描述成一些計算機事件的過程,這種抽象的過程中,我們把具體的事物封裝成一個一個的整體進行描述,使被描述的對象具備一些系統性、整體性的的行為和特征,我們把這種設計思想稱為面向對象。 2、面向對象與面向過程 2.1、面向過程是早期的程序語言設計思想,該思想強調事物的行為細節,即程序的設計不需要封裝成一個個的整體,而是將整個程序描述成一個行為,所有行為細節都按照固定方式一步一步的執行,執行程序就是執行某一行為的過程。 2.2、面向對象和面向過程都是一種思想,面向對象是相對于面向過程而言的, 面向過程強調的是具體的功能行為,而面向對象將功能封裝進對象,強調具備了功能的對象,面向對象是基于面向過程的,但面向對象思想更接近于現實場景。 2、對象 對象是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。 3、類 類是具有相同屬性和方法的一組對象的集合,它為屬于該類的所有對象提供了統一的抽象描述,其內部包括屬性和方法兩個主要部分。在面向對象的編程語言中,類是一個獨立的程序單位,它應該有一個類名并包括屬性和方法兩個主要部分。 java中的類實現包括兩個部分:類聲明和類體。 類的實例化可生成對象,一個對象的生命周期包括三個階段:生成、使用、消除。 當不存在對一個對象的引用時,該對象成為一個無用對象。Java的垃圾收集器自動掃描對象的動態內存區,把沒有引用的對象作為垃圾收集起來并釋放。當系統內存用盡或調用System.gc( )要求垃圾回收時,垃圾回收線程與系統同步運行。 向對象的三個基本特征是:封裝、繼承、多態。 4、封裝 首先,屬性能夠描述事物的特征,方法能夠描述事物的動作。封裝就是把同一類事物的共性(包括屬性和方法)歸到同一類中,方便使用。 1.1、封裝是指:隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。 1.2、封裝的好處: (1)將外界的變化隔離,使程序具備獨立、安全和穩定性。 (2)便于設計者使用,提高代碼的復用性。 1.3、封裝的原則 (1)將不需要對外提供的內容都隱藏起來。 (2)把實現細節隱藏,提供可以對其進行訪問公共的方式。 1.4、封裝的方式 將某一功能、屬性抽離出來,獨立寫成單獨的方法或類。 設置訪問權限 (1)設置訪問權限可以限定該功能或屬性可以被特定的訪問者訪問,保證了程序的安全性和功能的穩定性。 (2)Java對類和類中成員都定義了特定的訪問修飾符。 類:public(公共的) 、default(默認的,不寫就默認是它) 類中成員:public、PRotected、default(默認的)、private 注:類的訪問修飾符可以不寫(默認的),也可以寫public(公共的),一個java文件中只能有一個被public修飾的類,且被public修飾的類類名必須要跟文件名一致(包括大小寫一致),否則編譯會出錯,為了方便閱讀,類名的命名規范是單詞的首字母大寫,多個單詞組成的類名每個單詞的首字母都大寫。
為了實現良好的封裝,我們通常將類的成員變量聲明為private,在通過public方法來對這個變量來訪問。對一個變量的操作,一般有讀取和賦值2個操作,,我們分別定義2個方法來實現這2個操作,一個是getXX(XX表示要訪問的成員變量的名字)用來讀取這個成員變量,另一個是setXX()用來對這個變量賦值。 下面我們來看下這個例子: public class Demo { /* * 對屬性的封裝一個人的姓名、性別、年齡、都是這個人的私有屬性 */ private String name; private String sex; private int age; /* * setter()、getter()是該對象對外開發的接口 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
5、繼承 1、繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,并能擴展新的功能,或者說將事物的共性的功能和屬性抽取出來定義成一個父類,讓后來具有更多樣化實現的子類繼承父類。 2、繼承的作用: (1)父類具備的方法子類可以直接繼承過來,不用重新書寫,提高了代碼的復用性。 (2)讓類與類之間產生關系,有了關系才有多態的實現。 (3)Java中只支持單繼承,不支持多繼承,因為多繼承存在安全隱患(當多個父類存在同個功能時,子類不確定要運行哪一個),Java支持多層繼承,即父類還可以繼承其他類,java用另一種機制解決單繼承的局限性,即多實現。 3、對繼承體系的使用 (1)想要使用體系,應該先查閱父類,因為父類定義了該體系的共性功能,了解了父類的功能,就基本可以使用該體系的功能了。 (2)在具體調用時,要創建子類的對象,因為有可能當父類是抽象類時父類不能創建對象,而且子類具備更豐富、更具體的功能實現。 4.繼承的特點 4.0覆蓋(重寫) 4.1如果子父類中的成員一致時,子類成員會覆蓋父類成員。 4.2當子類繼承父類時,沿襲父類的功能到子類中,但子類對該功能的實現細節不一致,子類可以保留父類對該功能的定義,重寫功能的內容。 4.3重寫與重載:重載只看參數列表,其他一致參數列表不一致為重載,而重寫子父類的參數必須要一致 4.4 this與super this表示當前對象的引用,super表示當前對象父類的引用
5.子父類中的構造函數 5.0構造函數不能重寫。 5.1構造函數第一行有一條隱式的語句super()/this()。 5.2在對子類對象進行初始化時,父類構造函數也會運行,因為子類中的構造函數默認第一行有一條隱式的super()語句,這樣方便子類構造時先獲取到父類的共性屬性。 5.3 super()一定要定義在子類構造函數的第一行,當沒有默認的空參數構造函數,要手動指定。 6、注意事項: 6.1千萬別為了獲取其他類中的功能而繼承,必須是類與類間有所屬關系才可以繼承。 6.2子類覆蓋父類時必須保證子類權限大于等于父類,才可以覆蓋,否則編譯失敗。 6.3子類靜態成員只能覆蓋父類靜態成員。 7 final關鍵字 7.1 final關鍵字可以修飾類、函數和變量。 7.2被final修飾的類不可以被繼承(繼承打破了封裝性)。 7.3被final修飾的方法不可以被復寫。 7.4被final修飾的變量只能被賦值一次,既可以修飾成員變量,也可以修飾局部變量、形參。 8. Object類 8.1java中有一個特殊的類,Object類,它是所有對象的超類(根類),Object類中定義了所有對象的共性成員。 8.2Object類中的方法 equals() 比較兩個對象是否相同 toString() 返回該對象的字符串表示形式 getClass() 獲取該對象對應的字節碼文件對象 hasCode() 獲取該對象的哈希碼值 9.類間的體系關系 繼承、聚集(聚合)、組合 9.1繼承: 指的是一個類繼承另外的一個類的功能,并增加它自己的新功能或改寫舊有功能的具體實現,繼承是類與類之間最常見的關系。 9.2聚合: 指的是整體與部分的關系。通常在定義一個整體類后,再去分析這個整體類的組成結構。從而找出一些組成類,該整體類和組成類之間就形成了聚合關系。例如足球隊中的足球隊員就是聚合關系。 9.3組合: 也表示類之間整體和部分的關系,但是組合關系中部分和整體具有統一的生存期。一旦整體對象不存在,部分對象也將不存在。部分對象與整體對象之間具有共生死的關系。例如人的各個身體器官之間的關系。 繼承的實例 class Person { public String name = “四J”; public int age = 20; } class Student extends Person { void study() { System.out.println(“I can study!”); } } public class Tcj{ public static void main(String args[]) { Student stu = new Student(); // stu.name = “zhangsan”; // stu.age = 20; System.out.println(“name=” + stu.name + “/t” + “age=” + stu.age); } }
6、多態 方法的重寫、重載與動態連接構成多態性; 6.1、多態的定義;某一類事物具備的多種表現形態(貓、狗和動物)。同時,多態也是面向對象編程的精髓所在。 6.2、java中多態的表現形式 父類的引用指向自己的子類對象。 父類的引用接收自己的子類對象。 6.3、多態的前提 必須是類與類之間有關系,要么繼承,要么實現。 子父類間的成員存在覆蓋。 6.4、多態的好處與缺陷 好處是提高了程序的擴展性,缺陷是只能使用父類的引用訪問父類的方法,無法訪問子類的特有方法。 6.5、多態的應用 類型轉換 向上轉型,自然轉型。 向下轉型,強制父類引用向下轉型。 6.6、特點 (1)多態中成員函數的特點 編譯時看引用變量所屬的類中是否有方法。 運行時看對象所屬類的方法。 (2)多態中成員變量的特點 無論編譯或運行時都參看右邊。 多態中靜態成員函數的特點 編譯或運行時都參看左邊 。
6.7 要理解多態性,首先要知道什么是“向上轉型”。 我定義了一個子類Cat,它繼承了Animal類,那么后者就是前者的父類。我可以通過 Cat c = new Cat(); 例化一個Cat的對象 但當我這樣定義時: Animal a = new Cat(); 這代表什么意思呢? 它表示我定義了一個Animal類型的引用,指向新建的Cat類型的對象。由于Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對象的。那么這樣做有什么意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,定義一個父類類型的引用指向一個子類的對象既可以使用子類強大的功能,又可以抽取父類的共性。所以, 父類引用只能調用父類中存在的方法和屬性,不能調用子類的擴展部分;因為父類引用指向的是堆中子類對象繼承的父類;(但是如果強制把超類轉換成子類的話,就可以調用子類中新添加而超類沒有的方法了。) 同時,父類中的一個方法只有在父類中定義而在子類中沒有重寫的情況下,才可以被父類類型的引用調用; 對于父類中定義的方法,如果子類中重寫了該方法,那么父類類型的引用將會調用子類中的這個方法,這就是動態連接。 6.8 對象的多態性是指在父類中定義的屬性或方法被子類繼承之后,可以具有不同的數據類型或表現出不同的行為。這使得同一個屬性或方法在父類及其各個子類中具有不同的語義。例如:”幾何圖形”的”繪圖”方法,”橢圓”和”多邊形”都是”幾何圖”的子類,其”繪圖”方法功能不同。 Java的多態性體現在兩個方面:由方法重載實現的靜態多態性(編譯時多態)和方法重寫實現的動態多態性(運行時多態)。 編譯時多態:在編譯階段,具體調用哪個被重載的方法,編譯器會根據參數的不同來靜態確定調用相應的方法。 運行時多態:由于子類繼承了父類所有的屬性(私有的除外),所以子類對象可以作為父類對象使用。程序中凡是使用父類對象的地方,都可以用子類對象來代替。一個對象可以通過引用子類的實例來調用子類的方法。 7、重載(Overloading) 方法重載是讓類以統一的方式處理不同數據類型的手段。 一個類中可以創建多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用哪個方法。 返回值類型可以相同也可以不相同,無法以返回型別作為重載函數的區分標準。 8、重寫(Overriding) 子類對父類的方法進行重新編寫。如果在子類中的方法與其父類有相同的的方法名、返回類型和參數表,我們說該方法被重寫(Overriding)。 如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。 子類函數的訪問修飾權限不能低于父類的。
新聞熱點
疑難解答