JAVA基礎整理-40.Java類和對象
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})
形參是定義方法時參數列表中出現的參數,實參是調用方法時為方法傳遞的參數。
- public int returnMin(int m,int n)
- {
- return Math.min(m,n); //m和n是形參
- }
- public static void main(String[] args)
- {
- int x=50;
- int y=100;
- Test t=new Test();
- int i=t.returnMin(x,y); //x和y是實參
- System.out.println(i);
- }
方法的形參和實參具有以下特點:
- 形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只有在方法內部有效,方法調用結束返回主調 方法後則不能再使用該形參變量。
- 實參可以是常量、變量、表達式、方法等,無論實參是何種類型的量,在進行方法調用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值、輸入等辦法使實參獲得確定值。
- 實參和形參在數量、類型和順序上應嚴格一致,否則會發生“類型不匹配” 的錯誤。
- 方法調用中發生的數據傳送是單向的,即只能把實參的值傳送紿形參,而不能把形參的值反向地傳送給實參。因此在方法調用過程中,形參的值發生改變,而實參中的值不會變化。
在調用成員方法時應註意以下 4 點:
- 對無參成員方法來說,是沒有實際參數列表的(即沒有 paramList),但方法名後的括號不能省略。
- 對帶參數的成員方法來說,實參的個數、順序以及它們的數據類型必須與形式參數的個數、順序以及它們的數據類型保持一致,各個實參間用逗號分隔。實參名與形參名可以相同,也可以不同。
- 實參也可以是表達式,此時一定要註意使表達式的數據類型與形參的數據類型相同,或者使表達式的類型按 Java 類型轉換規則達到形參指明的數據類型。
- 實參變量對形參變量的數據傳遞是“值傳遞”,即只能由實參傳遞給形參,而不能由形參傳遞給實參。程序中執行到調用成員方法時,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 接口。
- 類名對象名=(類名)已創建好的類對象名.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 對象,示例如下:
- String str1="Hello";
- String str2="Java";
- 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. 包的使用
一是在要引用的類名前帶上包名作為修飾符。代碼如下:
- bookexample.Test test = new bookexampie.Test();
其中,bookexample 是包名,Test 是包中的類名,test 是類的對象。
2) 二是在文件開頭使用 import 引用包中的類。代碼如下:
- import bookexample.Test;
3) 三是在文件前使用 import 引用整個包。如下代碼將 bookexample 整個包引入:
- import bookexample.*;
在使用包時,可以用點(.)表示包所在的層次結構,用“.*”表示該目錄下的所有內容。
JAVA基礎整理-40.Java類和對象