Java中類與對象全面解析(附實例代碼)
面向?qū)ο?/h2>
設(shè)計對象并使用
類: 是共同特征的描述(設(shè)計圖)
對象: 是真實存在的具體實例
Javabean類: 用來描述一類事物的類,在Javabean類里是不寫main方法的
注意: 類名首字母要大寫,見名知意,(駝峰模式)
注意: 在實際開發(fā)中,建議一個文件定義一個class類
代碼:
package com.xiaonan.Demo01; public class GirlFriend { //屬性 String name; int age; String gender; //行為 public void eat(){ System.out.println("在吃飯"); } public void sleep(){ System.out.println("在睡覺"); } }
package com.xiaonan.Demo01; public class GirlFriendTest { public static void main(String[] args) { //創(chuàng)建一個女朋友對象 GirlFriend gf1 = new GirlFriend(); //賦值 gf1.age = 18; gf1.gender = "女"; gf1.name = "小琪"; //輸出 System.out.println(gf1.age); System.out.println(gf1.gender); System.out.println(gf1.name); //調(diào)用方法 gf1.eat(); gf1.sleep(); System.out.println("--------------------"); //new第二個對象 GirlFriend gf2 = new GirlFriend(); //賦值 gf2.age = 18; gf2.gender = "女"; gf2.name = "小青"; //輸出 System.out.println(gf2.age); System.out.println(gf2.gender); System.out.println(gf2.name); //調(diào)用方法 gf1.eat(); gf1.sleep(); } }
封裝
是面向?qū)ο笕筇卣?(封裝 繼承 多態(tài))
對象代表什么,就得封裝對應(yīng)的數(shù)據(jù),并提供數(shù)據(jù)對應(yīng)的行為
案例:
人關(guān)門
這個門是自己關(guān)的,人只是給門一個作用力
private關(guān)鍵字
是一個權(quán)限修飾符
可以修飾成員(成員變量 和成員方法)
被private(私有的)修飾的成員只能在本類中才能訪問
例子:
package com.xiaonan.test; public class Test { private int age; // private:私有的 //set 賦值 public void setAge(int a){ if(a>=10 && a<= 50){ age = a; }else{ System.out.println("非法數(shù)據(jù)"); } } //get(獲取) public int getAge(){ return age; } }
針對private修飾的成員變量,如果需要被其他的類使用,要提供相應(yīng)的操作
提供"setXxx(參數(shù))" 方法,用于給成員變量賦值,方法用public修飾
提供"getXxx()" 方法,用于獲取成員變量的值,方法用public(公共的)修飾
就近原則和this關(guān)鍵字
示例代碼:
package com.xiaonan.test01; public class GirlFriend { //成員變量 private int age; public void method() { //局部變量 (方法變量) int age = 10; //System.out.println(age); //就近原則(誰離我近,我就用誰) System.out.println(this.age); //this關(guān)鍵字 這里的age是 成員變量的age } }
package com.xiaonan.test01; public class GirlFriendTest { public static void main(String[] args) { //創(chuàng)建一個 GirlFriend對象 //格式: 類名 對象名 = new 類名(); //例子 GirlFriend gf1 = new GirlFriend(); gf1.method(); } }
this關(guān)鍵字的作用
- 區(qū)分成員變量和局部變量
構(gòu)造方法
在Java中,構(gòu)造方法是用于創(chuàng)建對象并初始化對象的特殊方法。構(gòu)造方法具有以下注意事項:
構(gòu)造方法的名稱必須與類名完全相同,且沒有返回類型(包括void),它們不能被顯式地調(diào)用,而是在創(chuàng)建對象時自動調(diào)用。
如果在類中沒有定義任何構(gòu)造方法,Java編譯器會自動生成一個默認的無參構(gòu)造方法。如果在類中定義了構(gòu)造方法,編譯器將不會自動生成默認構(gòu)造方法。
可以定義多個構(gòu)造方法,它們可以具有不同的參數(shù)列表(參數(shù)個數(shù)、類型或順序不同),這被稱為方法的重載(overloading)。
構(gòu)造方法可以有訪問修飾符(如public、private、protected)來控制對構(gòu)造方法的訪問權(quán)限。一般情況下,構(gòu)造方法應(yīng)該使用public修飾符,以便其他類可以實例化對象。
在構(gòu)造方法中可以使用關(guān)鍵字super調(diào)用父類的構(gòu)造方法,以便在創(chuàng)建子類對象時初始化父類的成員變量。
構(gòu)造方法可以使用this關(guān)鍵字調(diào)用同一個類中的其他構(gòu)造方法,以便在構(gòu)造方法之間進行重用。
構(gòu)造方法可以拋出異常,但通常不建議在構(gòu)造方法中拋出受檢異常,而應(yīng)該在構(gòu)造方法中處理異?;蚴褂梅鞘軝z異常。
構(gòu)造方法可以執(zhí)行任意的初始化操作,例如初始化對象的成員變量、調(diào)用其他方法等。
需要注意的是,構(gòu)造方法的主要目的是在創(chuàng)建對象時進行初始化操作,因此應(yīng)該避免在構(gòu)造方法中執(zhí)行過多的邏輯或復(fù)雜的計算。如果需要進行復(fù)雜的初始化操作,可以考慮使用靜態(tài)工廠方法或其他設(shè)計模式來替代構(gòu)造方法。
標準的JavaBean
類名要見名知意
成員變量使用private修飾
提供至少兩個構(gòu)造方法
無參構(gòu)造方法
帶全部參數(shù)的構(gòu)造方法
成員方法
提供每一個成員變量對應(yīng)的setXxx()與getXxx()
如果還有其他的行為也要寫上
快捷鍵
// alt + insert (快速生成JavaBean標準類的 構(gòu)造無參與全部參數(shù)的方法 和set方法和get方法)
插件
PTG 一秒生成標準的JavaBean
對象內(nèi)存圖
一個對象內(nèi)存圖
當在Java中創(chuàng)建一個對象時,它會在堆內(nèi)存中分配一塊連續(xù)的內(nèi)存空間來存儲對象的數(shù)據(jù)。下面是一個更詳細的Java對象的內(nèi)存圖示例:
Object Header:對象頭是用于存儲對象的元數(shù)據(jù)的部分。它通常包含以下信息:
- 類型指針(Type Pointer):指向?qū)ο笏鶎俚念惖脑獢?shù)據(jù)。
- 哈希碼(Hash Code):對象的哈希碼,用于支持對象的哈希表操作。
- 鎖信息(Lock Information):用于支持對象的同步和并發(fā)操作。
Instance Variables:實例變量,也稱為成員變量或字段,是對象的數(shù)據(jù)部分。它們是在類中定義的變量,用于存儲對象的狀態(tài)和屬性。每個實例變量占用一定的內(nèi)存空間,具體大小取決于變量的類型和對齊要求。
創(chuàng)建對象時,Java虛擬機會執(zhí)行以下步驟:
分配內(nèi)存:Java虛擬機在堆內(nèi)存中分配一塊連續(xù)的內(nèi)存空間來存儲對象的數(shù)據(jù)。
初始化對象頭:Java虛擬機會將對象頭的字段初始化為默認值,如類型指針、哈希碼和鎖信息。
初始化實例變量:Java虛擬機會將實例變量的值初始化為默認值,如數(shù)值類型為0,布爾類型為false,引用類型為null。
執(zhí)行構(gòu)造方法:Java虛擬機會調(diào)用對象的構(gòu)造方法來執(zhí)行進一步的初始化操作,可以在構(gòu)造方法中設(shè)置實例變量的具體值。
注意:上述內(nèi)存圖和步驟是基于Java的傳統(tǒng)對象模型,具體實現(xiàn)可能會因Java虛擬機的不同實現(xiàn)而有所不同。此外,Java還有其他的內(nèi)存區(qū)域,如棧內(nèi)存、方法區(qū)等,用于存儲不同類型的數(shù)據(jù)和執(zhí)行程序的其他操作。
兩個引用指向同一個對象
在Java中,可以通過將兩個引用變量指向同一個對象來實現(xiàn)這種情況。當兩個引用指向同一個對象時,它們實際上引用了相同的內(nèi)存地址,因此它們可以訪問和修改相同的對象數(shù)據(jù)。
下面是一個示例代碼,演示了如何在Java中創(chuàng)建兩個引用指向同一個對象:
public class Main { public static void main(String[] args) { // 創(chuàng)建一個對象 MyClass obj = new MyClass(); // 創(chuàng)建兩個引用指向同一個對象 MyClass ref1 = obj; MyClass ref2 = obj; // 修改對象的數(shù)據(jù) obj.setData("Hello, World!"); // 通過兩個引用訪問和修改相同的對象數(shù)據(jù) System.out.println(ref1.getData()); // 輸出: Hello, World! System.out.println(ref2.getData()); // 輸出: Hello, World! } } class MyClass { private String data; public void setData(String data) { this.data = data; } public String getData() { return data; } }
在上面的示例中,
ref1
和ref2
是兩個引用變量,它們都指向obj
所引用的同一個MyClass
對象。通過這兩個引用變量,我們可以訪問和修改相同的對象數(shù)據(jù)。需要注意的是,當一個對象沒有任何引用指向它時,它將成為Java中的垃圾對象,并由垃圾收集器回收內(nèi)存。因此,在使用多個引用指向同一個對象時,需要小心確保在不需要引用時及時將其置為
null
,以便垃圾收集器可以回收不再使用的對象。基本數(shù)據(jù)類型與引用數(shù)據(jù)類型的區(qū)別
存儲方式:基本數(shù)據(jù)類型的值直接存儲在變量中,而引用數(shù)據(jù)類型的變量存儲的是對象的引用(內(nèi)存地址)。
大小和默認值:基本數(shù)據(jù)類型具有固定的大小和默認值,而引用數(shù)據(jù)類型的大小取決于對象的大小,且默認值為null。
- 基本數(shù)據(jù)類型的大小是固定的,不受具體平臺的影響。例如,int類型始終占用4個字節(jié)。
- 引用數(shù)據(jù)類型的大小取決于所引用對象的大小。例如,一個引用變量可能指向一個很小的對象或一個很大的對象。
- 基本數(shù)據(jù)類型的默認值是根據(jù)其類型確定的。例如,int類型的默認值為0,boolean類型的默認值為false。
- 引用數(shù)據(jù)類型的默認值為null,表示該引用變量當前未指向任何對象。
傳遞方式:基本數(shù)據(jù)類型在方法參數(shù)傳遞時是按值傳遞的,而引用數(shù)據(jù)類型在方法參數(shù)傳遞時是按引用傳遞的。
- 當將基本數(shù)據(jù)類型作為方法參數(shù)傳遞時,傳遞的是實際的值的副本。在方法內(nèi)部對參數(shù)進行修改不會影響原始值。
- 當將引用數(shù)據(jù)類型作為方法參數(shù)傳遞時,傳遞的是引用的副本。在方法內(nèi)部對參數(shù)進行修改會影響原始對象。
內(nèi)存管理:基本數(shù)據(jù)類型的變量直接存儲數(shù)據(jù)值,內(nèi)存管理由編譯器或解釋器處理;而引用數(shù)據(jù)類型的變量存儲對象的引用,對象的創(chuàng)建和銷毀由開發(fā)人員手動管理或由垃圾回收器自動處理。
- 基本數(shù)據(jù)類型的變量在棧上分配內(nèi)存,其生命周期由程序控制。
- 引用數(shù)據(jù)類型的對象在堆上分配內(nèi)存,其生命周期由開發(fā)人員手動管理或由Java的垃圾回收器自動處理。
需要注意的是,Java中的基本數(shù)據(jù)類型包括boolean、byte、short、int、long、float、double和char,而其他所有的類型都屬于引用數(shù)據(jù)類型,包括類、接口、數(shù)組和枚舉等。
this關(guān)鍵字的內(nèi)存原理
作用: 用于區(qū)分局部變量和成員變量
this的本質(zhì): 所在方法調(diào)用者的地址值
在Java中,
this
關(guān)鍵字表示當前對象的引用。它可以在實例方法和構(gòu)造方法中使用,用于引用當前正在執(zhí)行方法的對象。this
關(guān)鍵字的內(nèi)存原理如下:當創(chuàng)建一個對象時,Java虛擬機會在堆上為該對象分配內(nèi)存空間,并將對象的實例變量存儲在該內(nèi)存空間中。
當調(diào)用對象的實例方法時,Java虛擬機會將當前對象的引用作為隱藏參數(shù)傳遞給方法。這個隱藏參數(shù)就是
this
關(guān)鍵字所表示的當前對象的引用。在方法內(nèi)部,可以使用
this
關(guān)鍵字來訪問當前對象的實例變量和實例方法。通過this
關(guān)鍵字,可以明確地指定當前對象的成員,避免與局部變量或參數(shù)發(fā)生命名沖突。當方法執(zhí)行完畢后,
this
關(guān)鍵字的作用也就結(jié)束了。它不會占用額外的內(nèi)存空間,而是在方法調(diào)用結(jié)束后被釋放。
需要注意的是,每個實例方法都有一個隱含的this
參數(shù),但它并不會顯式地出現(xiàn)在方法的參數(shù)列表中。編譯器會自動將this
參數(shù)添加到方法的參數(shù)列表中,以便在方法內(nèi)部使用。
總結(jié)起來,this
關(guān)鍵字在Java中用于引用當前對象,它并不占用額外的內(nèi)存空間,而是作為方法的隱含參數(shù)傳遞給實例方法。通過this
關(guān)鍵字,可以訪問當前對象的實例變量和實例方法。
成員變量和局部變量的區(qū)別
在Java中,成員變量(也稱為實例變量)和局部變量是兩種不同類型的變量,它們有以下區(qū)別:
作用域:成員變量定義在類中,可以在整個類中的各個方法中訪問。而局部變量定義在方法、代碼塊或構(gòu)造函數(shù)中,僅在其所在的作用域內(nèi)有效。
生命周期:成員變量的生命周期與對象的生命周期相同,當對象創(chuàng)建時被初始化,直到對象被銷毀。而局部變量的生命周期僅限于其所在的作用域,在離開作用域后,局部變量將被銷毀。
默認值:成員變量會被賦予默認值,例如,整數(shù)類型的成員變量默認值為0,布爾類型的成員變量默認值為false。而局部變量沒有默認值,必須在使用之前顯式初始化。
訪問修飾符:成員變量可以使用不同的訪問修飾符(如public、private、protected)進行訪問控制,以控制其可見性。而局部變量不能使用訪問修飾符,它們的可見性僅限于其所在的作用域內(nèi)。
內(nèi)存分配:成員變量在對象創(chuàng)建時分配內(nèi)存空間,每個對象都有一份成員變量的拷貝。而局部變量在方法調(diào)用或代碼塊執(zhí)行時分配內(nèi)存空間,每次調(diào)用或執(zhí)行都會創(chuàng)建一個新的局部變量。
需要注意的是,成員變量和局部變量可以同名,但在同一作用域內(nèi),局部變量會覆蓋同名的成員變量。如果需要訪問成員變量,可以使用關(guān)鍵字"this"來引用當前對象的成員變量。
總結(jié)
到此這篇關(guān)于Java中類與對象的文章就介紹到這了,更多相關(guān)Java中類與對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用Gradle實現(xiàn)類似Maven的profiles功能
這篇文章主要介紹了如何使用Gradle實現(xiàn)類似Maven的profiles功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-06-06SpringCloud實現(xiàn)Redis在各個微服務(wù)的Session共享問題
Redis是運行在內(nèi)存中,查取速度很快。本文重點給大家介紹SpringCloud實現(xiàn)Redis在各個微服務(wù)的Session共享,感興趣的朋友一起看看吧2018-08-08Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置
Hutool是一個Java基礎(chǔ)工具類,對文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進行封裝,組成各種Util工具類,這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置的相關(guān)資料,需要的朋友可以參考下2024-01-01Spring Boot整合Spring Data Jpa代碼實例
這篇文章主要介紹了Spring Boot整合Spring Data Jpa代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11tio-boot整合hotswap-classloader實現(xiàn)熱加載方法實例
這篇文章主要為大家介紹了tio-boot整合hotswap-classloader實現(xiàn)熱加載方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12