1. 程式人生 > >JAVA基礎整理-40.Java類和對象

JAVA基礎整理-40.Java類和對象

ans 無法 限制 otsu supported 傳統 父類 string oid

  Java面向對象:對象的概念及面向對象的三個基本特征

  面向對象分析(OOA)、 面向對象設計(OOD)、
面向對象程序設計(OOP)

  對象的概念

   所謂對象就是真實世界中的實體,對象與實體是一一對應的,也就是說現實世界中每一個實體都是一個對象,它是一種具體的概念。對象有以下特點:

  • 對象具有屬性和行為。
  • 對象具有變化的狀態。
  • 對象具有唯一性。
  • 對象都是某個類別的實例。
  • 一切皆為對象,真實世界中的所有事物都可以視為對象。

面向對象的三大核心特性

  1.可重用性:它是面向對象軟件開發的核心思路,提高了開發效率。面向對象程序設計的抽象、繼承、封裝和多態四大特點都圍繞這個核心。

  2.可擴展性:它使面向對象設計脫離了基於模塊的設計,便於軟件的修改。

  3.可管理性:能夠將功能與數據結合,方便管理。

面向對象具有繼承、封裝和多態 3 個核心特性。

繼承性:程序中的繼承性是指子類擁有父類數據結構的方法和機制,這是類之間的一種關系;繼承只能是單繼承

封裝性:封裝是將代碼及其處理的數據綁定在一起的一種編程機制,該機制保證了程序和數據都不受外部幹擾且不被誤用。封裝的目的在於保護信息。使用它的主要優點如下:

  • 保護類中的信息,它可以阻止在外部定義的代碼隨意訪問內部代碼和數據。
  • 隱藏細節信息,一些不需要程序員修改和使用的信息,比如取款機中的鍵盤,用戶只需要知道按哪個鍵實現什麽操作就可以,至於它內部是如何運行的,用戶不需要知道。
  • 有助於建立各個系統之間的松耦合關系,提高系統的獨立性。當一個系統的實現方式發生變化時,只要它的接口不變,就不會影響其他系統的使用。例如 U 盤,不管裏面的存儲方式怎麽改變,只要 U 盤上的 USB 接口不變,就不會影響用戶的正常操作。
  • 提高軟件的復用率,降低成本。每個系統都是一個相對獨立的整體,可以在不同的環境中得到使用。例如,一個 U 盤可以在多臺電腦上使用。

  Java 語言的基本封裝單位是類。Java 提供了私有和公有的訪問模式,類的公有接口代表外部的用戶應該知道或可以知道的每件東西,私有的方法數據只能通過該類的成員代碼來訪問,這就可以確保不會發生不希望的事情。

多態性:面向對象的多態性,即“一個接口,多個方法”。多態性體現在父類中定義的屬性和方法被子類繼承後,可以具有不同的屬性或表現方式。多態性允許一個接口被多個同類使用
,彌補了單繼承的不足

Java認識類和對象

  具有相同特性(數據元素)和行為(功能)的對象的抽象就是類,因此對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象。

  類是概念模型,定義對象的所有特性和所需的操作,對象是真實的模型,是一個具體的實體。

  對象或實體所擁有的特征在類中表示時稱為類的屬性。

  對象執行的操作稱為類的方法。

  類是構造面向對象程序的基本單位

Java類的定義及定義類時可用的關鍵字

  類是 Java 中的一種重要的復合數據類型,也是組成 Java 程序的基本要素,因為所有的 Java 程序都是基於類的。

  

  • public:表示“共有”的意思。如果使用 public 修飾,則可以被其他類和程序訪問。每個 Java 程序的主類都必須是 public 類,作為公共工具供其他類和程序使用的類應定義為 public 類。
  • abstract:如果類被 abstract 修飾,則該類為抽象類,抽象類不能被實例化,但抽象類中可以有抽象方法(使用 abstract 修飾的方法)和具體方法(沒有使用 abstract 修飾的方法)。繼承該抽象類的所有子類都必須實現該抽象 類中的所有抽象方法(除非子類也是 抽象類)。
  • final:如果類被 final 修飾,則不允許被繼承。
  • class:聲明類的關鍵字。
  • class_name:類的名稱。
  • extends:表示繼承其他類。
  • implements:表示實現某些接口。

  • property_type:表示成員變量的類型。
  • property:表示成員變量名稱。
  • function():表示成員方法名稱。

  類名應該以下劃線(_)或字母開頭,最好以字母開頭;第一個字母最好大寫,如果類名由多個單詞組成,則每個單詞的首字母最好都大寫;類名不能為 Java 中的關鍵字,例如 boolean、this、int 等;類名不能包含任何嵌入的空格或點號以及除了下劃線(_)和美元符號($)字符之外的特殊字符

  編寫類的屬性。類中的數據和方法統稱為類成員。其中,類的屬性就是類的數據成員。

Java類的屬性:成員變量的定義和聲明

各參數的含義如下。

  • public、protected、private:用於表示成員變量的訪問權限。
  • static:表示該成員變量為類變量,也稱為靜態變量。
  • final:表示將該成員變量聲明為常量,其值無法更改。
  • type:表示變量的類型。
  • variable_name:表示變量名稱。

  可以在聲明成員變量的同時對其進行初始化,如果聲明成員變量時沒有對其初始化,則系統會使用默認值初始化成員變量。   

Java成員方法的聲明和調用、形參和實參及局部變量

  一個完整的方法通常包括方法名稱、方法主體、方法參數和方法返回值類型

   paramList 表示參數列表

  一個方法主要依靠參數來傳遞消息。方法主體是方法中執行功能操作的語句。

  • public、private、protected:表示成員方法的訪問權限。
  • static:表示限定該成員方法為靜態 方法。
  • final:表示限定該成員方法不能被重寫或重載。
  • abstract:表示限定該成員方法為抽象方法。抽象方法不提供具體的實現,並且所屬類型必須為抽象類。

1. 成員方法的返回值

return表達式
或return(表達式)

2. 形參、實參及成員方法的調用

methodName({paramList})
形參是定義方法時參數列表中出現的參數,實參是調用方法時為方法傳遞的參數。
  1. public int returnMin(int m,int n)
  2. {
  3. return Math.min(m,n); //m和n是形參
  4. }
  5. public static void main(String[] args)
  6. {
  7. int x=50;
  8. int y=100;
  9. Test t=new Test();
  10. int i=t.returnMin(x,y); //x和y是實參
  11. System.out.println(i);
  12. }
方法的形參和實參具有以下特點:
    • 形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只有在方法內部有效,方法調用結束返回主調 方法後則不能再使用該形參變量。
    • 實參可以是常量、變量、表達式、方法等,無論實參是何種類型的量,在進行方法調用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值、輸入等辦法使實參獲得確定值。
    • 實參和形參在數量、類型和順序上應嚴格一致,否則會發生“類型不匹配” 的錯誤。
    • 方法調用中發生的數據傳送是單向的,即只能把實參的值傳送紿形參,而不能把形參的值反向地傳送給實參。因此在方法調用過程中,形參的值發生改變,而實參中的值不會變化。

調用成員方法時應註意以下 4 點:
  1. 對無參成員方法來說,是沒有實際參數列表的(即沒有 paramList),但方法名後的括號不能省略。
  2. 對帶參數的成員方法來說,實參的個數、順序以及它們的數據類型必須與形式參數的個數、順序以及它們的數據類型保持一致,各個實參間用逗號分隔。實參名與形參名可以相同,也可以不同。
  3. 實參也可以是表達式,此時一定要註意使表達式的數據類型與形參的數據類型相同,或者使表達式的類型按 Java 類型轉換規則達到形參指明的數據類型。
  4. 實參變量對形參變量的數據傳遞是“值傳遞”,即只能由實參傳遞給形參,而不能由形參傳遞給實參。程序中執行到調用成員方法時,Java 把實參值復制到一個臨時的存儲區(棧)中,形參的任何修改都在棧中進行,當退出該成員方法時,Java 自動清除棧中的內容。

3. 方法體中的局部變量

  局部變量只能在本方法內有效或可見,離開本方法則這些變量將被自動釋放。

  在方法體內定義變量時,變量前不能加修飾符。局部變量在使用前必須明確賦值,否則編譯時會出錯。

Java this關鍵字

  this 關鍵字是 Java 常用的關鍵字,可用於任何實例方法內指向當前對象,也可指向對其調用當前方法的對象,或者在需要當前類型對象引用時使用。

提示:當一個類的屬性(成員變量)名與訪問該屬性的方法參數名相同時,則需要使用 this 關鍵字來訪問類中的屬性,以區分類的屬性和方法中的參數。

Java創建對象詳解:Java創建對象的幾種方法

  對象是對類的實例化。對象具有狀態和行為,變量用來表明對象的狀態,方法表明對象所具有的行為。

顯式創建對象

對象的顯式創建方式有 4 種。

1. 使用 new 關鍵字創建對象

類名 對象名=new 類名();

2. 調用 java.lang.Class 或者 java.lang.reflect.Constuctor 類的 newlnstance() 實例方法

java.lang.Class Class 類對象名稱=java.lang.Class.forName(要實例化的類全稱);
類名 對象名=(類名)Class類對象名稱.newInstance();

3. 調用對象的 clone() 方法

該方法不常用,使用該方法創建對象時,要實例化的類必須繼承 java.lang.Cloneable 接口

  1. 類名對象名=(類名)已創建好的類對象名.clone();

4. 調用 java.io.ObjectlnputStream 對象的 readObject() 方法

對上述示例的說明如下:

  • 使用 new 關鍵字或 Class 對象的 newInstance() 方法創建對象時,都會調用類的掏造方法。
  • 使用 Class 類的 newInstance() 方法創建對象時,會調用類的默認構造方法,即無參構造方法。
  • 使用 Object 類的 clone() 方法創建對象時,不會調用類的構造方法,它會創建一個復制的對象,這個對象和原來的對象具有不同的內存地址,但它們的屬性值相同。
  • 如果類沒有實現 Cloneable 接口,則 clone。方法會拋出 java.lang.CloneNotSupportedException 異常,所以應該讓類實現 Cloneable 接口。

隱含創建對象

除了顯式創建對象以外,在 Java 程序中還可以隱含地創建對象

①String strName="strValue",其中的“strValue”就是一個 String 對象,由 Java 虛擬機隱含地創建。
②字符串的“+”運算符運算的結果為一個新的 String 對象,示例如下:

  1. String str1="Hello";
  2. String str2="Java";
  3. String str3=str1+str2; //str3引用一個新的String對象

③當 Java 虛擬機加載一個類時,會隱含地創建描述這個類的 Class 實例。


無論釆用哪種方式創建對象,Java 虛擬機在創建一個對象時都包含以下步驟
1) 給對象分配內存。
2) 將對象的實例變量自動初始化為其變量類型的默認值。
3) 初始化對象,給實例變量賦予正確的初始值。

註意:每個對象都是相互獨立的,在內存中占有獨立的內存地址,並且每個對象都具有自己的生命周期,當一個對象的生命周期結束時,對象就變成了垃圾,由 Java 虛擬機自帶的垃圾回收機制處理。

Java訪問對象的屬性和行為

  在 Java 中,要引用對象的屬性和行為,需要使用點(.)操作符來訪問。對象名在圓點左邊,而成員變量或成員方法的名稱在圓點的右邊。語法格式如下:

對象名.屬性(成員變量)    //訪問對象的屬性
對象名.成員方法名()    //訪問對象的方法

Java對象的銷毀

  在清除對象時,由系統自動進行內存回收,不需要用戶額外處理。

註意:在傳統的編程語言(例如 C 語言)中,回收內存的任務是由程序負責的,也就是說必須在程序中顯式地進行內存回收,這無疑會增加程序員的負擔,而且存在很多弊端。

  在 Java 的 Object 類中還提供了一個 protected 類型的 finalize() 方法,因此任何 Java 類都可以覆蓋這個方法,在這個方法中進行釋放對象所占有的相關資源的操作。

註意:調用 System.gc() 或者 Runtime.gc() 方法也不能保證回收操作一定執行,它只是提高了 Java 垃圾回收器盡快回收垃圾的可能性。

Java訪問控制修飾符詳解( public、 private、protected 和 friendly)

Java 語言中提供了多個作用域修飾符,其中常用的有 public、private、protected、final、abstract、static、transient 和 volatile,這些修飾符有類修飾符、變量修飾符和方法修飾符。


信息隱藏是 OOP 最重要的功能之一,也是使用訪問修飾符的原因。

通過使用訪問控制修飾符來限制對對象私有屬性的訪問,可以獲得 3 個重要的好處。

  • 防止對封裝數據的未授權訪問。
  • 有助於保證數據完整性。
  • 當類的私有實現細節必須改變時,可以限制發生在整個應用程序中的“連鎖反應”。

類的訪問控制符只能是空或者 public,方法和屬性的訪問控制符有 4 個,分別是 public、 private、protected 和 friendly,其中 friendly 是一種沒有定義專門的訪問控制符的默認情況。

在 Java 語言中,訪問控制修飾符有 4 種。

1. private

用 private 修飾的類成員,只能被該類自身的方法訪問和修改,而不能被任何其他類(包括該類的子類)訪問和引用。

2. friendly(默認)

如果一個類沒有訪問控制符,說明它具有默認的訪問控制特性

3. protected

用保護訪問控制符 protected 修飾的類成員可以被三種類所訪問:該類自身、與它在同一個包中的其他類以及在其他包中的該類的子類

4. public

當一個類被聲明為 public 時,它就具有了被其他包中的類訪問的可能性,只要包中的其他類在程序中使用 import 語句引入 public 類,就可以訪問和引用這個類。 每個 Java 程序的主類都必須是 public 類

Java static靜態修飾符詳解:靜態變量、靜態方法及靜態代碼塊

靜態變量

實際上類的成員變量可以分為兩種:靜態變量(或稱為類變量),指被 static 修飾的成員變量;實例變量,指沒有被 static 修飾的成員變量。

靜態變量可以被類的所有實例共享,

在類中定義靜態的屬性(成員變量),在 main() 方法中可以直接訪問,也可以通過類名訪問,還可以通過類的實例對象來訪問。

註意:靜態變量是被多個實例所共享的。

靜態方法

與成員變量類似,成員方法也可以分為兩種:靜態方法(或稱為類方法),指被 static 修飾的成員方法;實例方法,指沒有被 static 修飾的成員方法。

在訪問非靜態方法時,需要通過實例對象來訪問,而在訪冋靜態方法時,可以直接訪問,也可以通過類名來訪問,還可以通過實例化對象來訪問。

靜態代碼塊

靜態代碼塊指 Java 類中的 static{} 代碼塊,主要用於初始化類,為類的靜態變量賦初始值

Java final修飾符:final修飾屬性、final修飾方法及final修飾類

1. final 修飾類中的屬性

表示該屬性一旦被初始化便不可改變,這裏不可改變的意思對基本類型來說是其值不可變,而對對象屬性來說其引用不可再變

2. final 修飾類中的方法

說明這種方法提供的功能已經滿足當前要求,不需要進行擴展,並且也不允許任何從此類繼承的類來重寫這種方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。在聲明類中,一個 final 方法只被實現一次

3. final 修飾類

表示該類是無法被任何其他類繼承的,意味著此類在一個繼承樹中是一個葉子類,並且此類的設計已被認為很完美而不需要進行修改或擴展。

Java main()方法

其中,使用 main() 方法時應該註意如下幾點:

  • 訪問控制權限是公有的(public)。
  • main() 方法是靜態的。如果要在 main() 方法中調用本類中的其他方法,則該方法也必須是靜態的,否則需要先創建本類的實例對象,然後再通過對象調用成員方法。
  • main() 方法沒有返回值,只能使用 void。
  • main() 方法具有一個字符串數組參數,用來接收執行 Java 程序的命令行參數。命令行參數作為字符串,按照順序依次對應字符串數組中的元素。
  • 除了形參變量名可以任意設置以外,main() 方法中的其他內容都是固定不變的。

Java方法的可變參數

聲明可變參數的語法格式如下:

methodName({paramList},paramType…paramName)
註意:可變參數必須定義在參數列表的最後。

Java構造方法

Java 中的每個類都有一個默認的構造方法,它必須具有和類名相同的名稱,而且沒有返回類型。構造方法的默認返回類型就是對象類型本身,並且構造方法不能被 static、final、synchronized、abstract 和 native 修飾。

在一個類中,與類名相同的方法就是構造方法。
在一個類中定義多個具有不同參數的同名方法,這就是方法的重載。
如果在類中沒有定義任何一個構造方法,則 Java 會自動為該類生成一個默認的構造方法
。默認的構造方法不包含任何參數,並且方法體為空

Java析構方法

  析構方法與構造方法相反,當對象脫離其作用域時(例如對象所在的方法已調用完畢),系統自動執行析構方法。

  在 Java 的 Object 類中還提供了一個 protected 類型的 finalize() 方法,因此任何 Java 類都可以覆蓋這個方法,在這個方法中進行釋放對象所占有的相關資源的操作。

對象的 finalize() 方法具有如下特點:
  • 垃圾回收器是否會執行該方法以及何時執行該方法,都是不確定的。
  • finalize() 方法有可能使用對象復活,使對象恢復到可觸及狀態。
  • 垃圾回收器在執行 finalize() 方法時,如果出現異常,垃圾回收器不會報告異常,程序繼續正常運行。


技巧:由於 finalize() 方法的不確定性,所以在程序中可以調用 System.gc() 或者 Runtime.gc() 方法提示垃圾回收器盡快執行垃圾回收操作。

Java包(package):Java系統包和自定義包

  系統包:可以在包內定義類,而在包外的代碼不能訪問該類。

自定義包

1. 包的聲明

  為了聲明一個包,首先必須建立一個相應的目錄結構,子目錄與包名一致,然後在需要放入該包的類文件開頭聲明包,

2. 包的使用

一是在要引用的類名前帶上包名作為修飾符。代碼如下:

  1. bookexample.Test test = new bookexampie.Test();

其中,bookexample 是包名,Test 是包中的類名,test 是類的對象。

2) 二是在文件開頭使用 import 引用包中的類。代碼如下:

  1. import bookexample.Test;

3) 三是在文件前使用 import 引用整個包。如下代碼將 bookexample 整個包引入:

  1. import bookexample.*;

在使用包時,可以用點(.)表示包所在的層次結構,用“.*”表示該目錄下的所有內容。

JAVA基礎整理-40.Java類和對象