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