​Java面向對象的概念整理


Java中一切皆是對象!

注意:8種基本數據類型不支持面向對象的編程機制,基本數據類型的數據也不具備“對象”的特性:沒有成員變量、方法可以被調用。

為解決8種基本數據類型不能當成Object類型(所有類的父類)變量使用的問題,Java提供了包裝類的概念,為8種基本數據類型分別定義了相應的引用類型,例如:int的包裝類是Integer,包裝類可以把8種基本數據類型的值包裝成對象使用。包裝類是java自帶類,位於java.lang包下。

 Integer i = new Integer(10); 

上面例子中,i 只是一個對象的引用,存放在棧中,而實際的數值10則是放在堆里。


對象和構造器:

構造器:
用於創建對象時執行初始化。當創建一個對象時eg:new Person();系統為這個對象的實例變量進行默認初始化。PS:類變量在類創建時就進行默認初始化,故此變量稱為類變量,成員變量分為類變量和實例變量。
構造器是創建Java對象的重要途徑,通過new關鍵字調用構造器時,構造器返回了該類的對象(可見構造器實際上是有返回值)。
 
對象的產生:
創建對象的根本途徑是構造器。通過new關鍵字來調用某個類的構造器(系統默認提供一個無參構造器)即可創建這個類的實例(對象)。
  Person p = new Person(); //通過new關鍵字調用Person類的構造器,返回(創建)一個Person實例(對象),將該Person實例(對象)賦給p變量。 
 
對象作用:訪問對象的實際變量、調用對象的方法。
對象 & 實例:可以把new出來的對象叫做實例,大白話說就是這個new出來的“東西”,叫它對象也可以,叫它實例也可以,對象和實例在這個角度上來講是等價的。
 
對象的實例化:
例如,String a = "abc"; 當你聲明String a 的時候,jvm(java虛擬機)就幫你在堆中開辟一塊內存空間,用來存放a的數據"abc",這里的a叫作引用,"abc"則為實例!
其實 String a = "abc" 完整的寫法是String a = new String("abc") ,String是Java的自帶類,位於java.lang包下,所以可以不new。

數組是對象:

Java是面向對象語言(Java中除了8種基本數據類型,全是對象),數據的定義也可以看做是實例化的過程,因此我們在定義數組變量時也可以看做是實例化數組對象的過程。
Object是一切引用類型的父類,所有能被Object接收的均為對象。簡言之,所有可以new出來的不管是類也好,接口也好,都可以看做為對象。並且都能被Object接收。
它們的異同之處就在於,對象是一個抽象的概念,而數組是對象,但是它有具體的實例。 
int[] temp = {1,3,5} 
//也可以寫作 
int[] temp = new int[]{1,3,5} 

 


this和super:

對象的this引用:

Java提供了一this關鍵字,this關鍵字總是指向調用該方法的對象。根據this出現的位置的不同,this作為對象的默認引用有2種情形:

1.構造器中引用(指向)該構造器正在初始化的對象;

2.在方法中引用(指向)調用該方法的的對象。

 
this最大的作用就是讓一個類中的一個方法,訪問該類里的另一個方法或者實例變量,示例:
public void run()
{
 this.jump();  //jump()為另一個類的方法
}
 
this還可以,通過this調用另一個重載的構造器的初始化代碼,this(parameter1,parameter2); 示例:
public Apple(){}
public Apple(String name,String color)
{
    this.name = name;
    this.coloe = color;
}
public Apple(String name,String color,double weight)
{
    //通過this調用另一個重載的構造器的初始化代碼
    this(name,color); this.weight = weight;
}
 
this可以代表任何對象,誰調用this所在方法,this就代表誰。Java允許對象的一個成員直接調用另一個成員,可以省略this前綴,但是,如果方法里有個局部變量和成員變量同名,要在該方法里訪問這個被覆蓋的成員變量,必須使用this前綴。
 

super:

當子類覆蓋(重寫)了父類方法后,子類的對象將無法訪問父類中被覆蓋的方法,但使用super關鍵字可以在子類中調用父類中被覆蓋的方法。
如果子類定義了和父類同名的實例變量,則會發生子類實例變量隱藏(不是覆蓋)父類實例變量的情形,可以在子類定義的實例方法中通過super關鍵字訪問父類中被隱藏的實例變量。
 
注意:
this、super在調用構造器方面:this調用的是同一個類中重構的構造器,super調用的是父類的構造器。另外:不管是否使用super調用來執行父類構造器的初始化代碼,子類構造器總會默認調用父類構造器一次。
 

Java內存:

  棧區:
1.每個線程包含一個棧區,棧中只保存基本數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中。
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。
 
堆區: 
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息(class的目的是得到操作指令)。
2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身。
 
方法區:
在java的虛擬機中有一塊專門用來存放已經加載的類信息、常量、靜態變量以及方法代碼的內存區域。常量池是方法區的一部分,主要用來存放常量和類中的符號引用等信息。
1.又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。
2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量(使用static修飾的成員變量)。

面向對象的三大特性:

封裝:

將對象的狀態信息(eg:Person對象的age變量)隱藏在對象內部,外部程序只能通過該類提供的方法來實現對內部信息的操作和訪問。

繼承:

繼承就是子類繼承父類的特征和行為,使得子類具有父類的各種屬性和方法(重用父類代碼)。

多態(難點):

Java引用變量,編譯時類型由聲明該變量時使用的類型決定,運行時類型由實際賦給該變量的對象決定(即子類對象賦給父類變量),如果編譯時類型和運行時類型不一致,就可能出現多態。
 
     1.多態定義:相同類型的(引用)變量,調用同一個方法(父類和子類都有的同名方法)時呈現出多種不同的行為特征。        
      當引用變量polymophicBc編譯時類型為BaseClass類型,而運行時類型為SubClass類型,運行時調用該引用變量的方法時,其方法行為總是表現出子類SubClass方法的行為特征,而不是父類BaseClass方法的行為特征。
 BaseClass polymophicBc = new SubClass();  
 
2.多態的條件:有繼承關系;子類重寫父類方法;父類引用變量指向子類對象。
 
3.優點:可以使程序有良好的擴展,並可以對所有類的對象進行通用處理。當一個新的情景出現時,無須對現有的代碼進行改動,而只需要增加一個新的類和新的同名方法。

類的生命周期:

java源文件編譯成的class字節碼文件,在java虛擬機中運行,java類的生命周期就是指一個class文件從加載到卸載的全過程。
 
 
1.加載:找到需要加載的類並把類的信息加載到jvm的方法區中,然后在堆區中實例化一個java.lang.Class對象,作為方法區中這個類的信息的入口。Ps:日常我們說的類加載——指的是類的生命周期中加載、連接、初始化三個階段。
 
2.連接:連接階段比較復雜,一般會跟加載階段和初始化階段交叉進行,這個階段的主要任務就是做一些加載后的驗證工作以及一些初始化前的准備工作。
 
3.類的初始化:按照順序自上而下運行類的變量賦值語句和靜態語句。而沒有static修飾的賦值語句和執行語句在實例化對象的時候才會運行。
所以,java的靜態變量也叫做類變量,它開始於類的創建,結束於類的消亡。非靜態變量叫做實例變量,它開始於類的實例的創建,結束語類的實例的消亡。
 
4.使用:當初始化完成之后,java虛擬機就可以執行Class的業務邏輯指令,通過堆中java.lang.Class對象的入口地址,調用方法區的方法邏輯,最后將方法的運算結果通過方法返回地址存放到方法區或堆中。
類的使用包括主動引用和被動引用。主動引用會引起類的初始化eg:通過new關鍵字實例化對象、讀取或設置類的靜態變量。被動引用不會引起類的初始化eg:定義類數組、引用類的常量。
 
5.卸載:當對象不再被使用時,java虛擬機的垃圾收集器將會回收堆中的對象,方法區中不再被使用的Class也要被卸載,否則方法區(Sun HotSpot永久代)會內存溢出。類的卸載過程其實就是在方法區中清空類信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM