Java創(chuàng)建對(duì)象(顯式創(chuàng)建和隱含創(chuàng)建)
對(duì)象是對(duì)類的實(shí)例化。對(duì)象具有狀態(tài)和行為,變量用來(lái)表明對(duì)象的狀態(tài),方法表明對(duì)象所具有的行為。Java 對(duì)象的生命周期包括創(chuàng)建、使用和清除。
一、顯式創(chuàng)建對(duì)象
對(duì)象的顯式創(chuàng)建方式有 4 種。
1. 使用 new 關(guān)鍵字創(chuàng)建對(duì)象
這是常用的創(chuàng)建對(duì)象的方法,語(yǔ)法格式如下:
類名 對(duì)象名 = new 類名();
2. 調(diào)用 java.lang.Class
或者 java.lang.reflect.Constuctor 類的 newlnstance() 實(shí)例方法
在 Java 中,可以使用 java.lang.Class 或者 java.lang.reflect.Constuctor 類的 newlnstance() 實(shí)例方法來(lái)創(chuàng)建對(duì)象,代碼格式如下:
java.lang.Class Class 類對(duì)象名稱 = java.lang.Class.forName(要實(shí)例化的類全稱); 類名 對(duì)象名 = (類名)Class類對(duì)象名稱.newInstance();
調(diào)用 java.lang.Class
類中的 forName()
方法時(shí),需要將要實(shí)例化的類的全稱(比如 com.mxl.package.Student
)作為參數(shù)傳遞過(guò)去,然后再調(diào)用 java.lang.Class
類對(duì)象的 newInstance()
方法創(chuàng)建對(duì)象。
3. 調(diào)用對(duì)象的 clone() 方法
該方法不常用,使用該方法創(chuàng)建對(duì)象時(shí),要實(shí)例化的類必須繼承 java.lang.Cloneable 接口。 調(diào)用對(duì)象的 clone() 方法創(chuàng)建對(duì)象的語(yǔ)法格式如下:
類名對(duì)象名 = (類名)已創(chuàng)建好的類對(duì)象名.clone();
4. 調(diào)用 java.io.ObjectlnputStream 對(duì)象的 readObject() 方法
例 1:
下面創(chuàng)建一個(gè)示例演示常用的前三種對(duì)象創(chuàng)建方法。示例代碼如下:
public class Student implements Cloneable { // 實(shí)現(xiàn) Cloneable 接口 private String Name; // 學(xué)生名字 private int age; // 學(xué)生年齡 public Student(String name,int age) { // 構(gòu)造方法 this.Name = name; this.age = age; } public Student() { this.Name = "name"; this.age = 0; } public String toString() { return"學(xué)生名字:"+Name+",年齡:"+age; } public static void main(String[] args)throws Exception { System.out.println("---------使用 new 關(guān)鍵字創(chuàng)建對(duì)象---------"); // 使用new關(guān)鍵字創(chuàng)建對(duì)象 Student student1 = new Student("小劉",22); System.out.println(student1); System.out.println("-----------調(diào)用 java.lang.Class 的 newInstance() 方法創(chuàng)建對(duì)象-----------"); // 調(diào)用 java.lang.Class 的 newInstance() 方法創(chuàng)建對(duì)象 Class c1 = Class.forName("Student"); Student student2 = (Student)c1.newInstance(); System.out.println(student2); System.out.println("-------------------調(diào)用對(duì)象的 clone() 方法創(chuàng)建對(duì)象----------"); // 調(diào)用對(duì)象的 clone() 方法創(chuàng)建對(duì)象 Student student3 = (Student)student2.clone(); System.out.println(student3); } }
對(duì)上述示例的說(shuō)明如下:
- 使用
new
關(guān)鍵字或Class
對(duì)象的newInstance()
方法創(chuàng)建對(duì)象時(shí),都會(huì)調(diào)用類的構(gòu)造方法。 - 使用
Class
類的newInstance()
方法創(chuàng)建對(duì)象時(shí),會(huì)調(diào)用類的默認(rèn)構(gòu)造方法,即無(wú)參構(gòu)造方法。 - 使用
Object
類的clone()
方法創(chuàng)建對(duì)象時(shí),不會(huì)調(diào)用類的構(gòu)造方法,它會(huì)創(chuàng)建一個(gè)復(fù)制的對(duì)象,這個(gè)對(duì)象和原來(lái)的對(duì)象具有不同的內(nèi)存地址,但它們的屬性值相同。 - 如果類沒(méi)有實(shí)現(xiàn)
Cloneable
接口,則clone
。方法會(huì)拋出java.lang.CloneNotSupportedException
異常,所以應(yīng)該讓類實(shí)現(xiàn)Cloneable
接口。
程序執(zhí)行結(jié)果如下:
---------使用 new 關(guān)鍵字創(chuàng)建對(duì)象---------
學(xué)生名字:小劉,年齡:22
-----------調(diào)用 java.lang.Class 的 newInstance() 方法創(chuàng)建對(duì)象-----------
學(xué)生名字:name,年齡:0
-------------------調(diào)用對(duì)象的done()方法創(chuàng)建對(duì)象----------
學(xué)生名字:name,年齡:0
二、隱含創(chuàng)建對(duì)象
除了顯式創(chuàng)建對(duì)象以外,在 Java
程序中還可以隱含地創(chuàng)建對(duì)象,例如下面幾種情況。
1)String strName = "strValue",
其中的“strValue
”就是一個(gè) String
對(duì)象,由 Java
虛擬機(jī)隱含地創(chuàng)建。
2)字符串的“+”運(yùn)算符運(yùn)算的結(jié)果為一個(gè)新的 String 對(duì)象,示例如下:
String str1 = "Hello"; String str2 = "Java"; String str3 = str1+str2; // str3引用一個(gè)新的String對(duì)象
3)當(dāng) Java
虛擬機(jī)加載一個(gè)類時(shí),會(huì)隱含地創(chuàng)建描述這個(gè)類的 Class
實(shí)例。
提示:類的加載是指把類的 .class
文件中的二進(jìn)制數(shù)據(jù)讀入內(nèi)存中,把它存放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在堆區(qū)創(chuàng)建一個(gè) java.lang.Class
對(duì)象,用來(lái)封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。
無(wú)論釆用哪種方式創(chuàng)建對(duì)象,Java 虛擬機(jī)在創(chuàng)建一個(gè)對(duì)象時(shí)都包含以下步驟:
- 給對(duì)象分配內(nèi)存。
- 將對(duì)象的實(shí)例變量自動(dòng)初始化為其變量類型的默認(rèn)值。
- 初始化對(duì)象,給實(shí)例變量賦予正確的初始值。
注意:每個(gè)對(duì)象都是相互獨(dú)立的,在內(nèi)存中占有獨(dú)立的內(nèi)存地址,并且每個(gè)對(duì)象都具有自己的生命周期,當(dāng)一個(gè)對(duì)象的生命周期結(jié)束時(shí),對(duì)象就變成了垃圾,由 Java 虛擬機(jī)自帶的垃圾回收機(jī)制處理。
到此這篇關(guān)于Java創(chuàng)建對(duì)象(顯式創(chuàng)建和隱含創(chuàng)建)的文章就介紹到這了,更多相關(guān)Java創(chuàng)建對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java創(chuàng)建對(duì)象的幾種方法
- Java中創(chuàng)建對(duì)象的6種方式
- Java中五種不同方法的創(chuàng)建對(duì)象
- Java使用反射創(chuàng)建對(duì)象示例
- Java中創(chuàng)建對(duì)象的5種方式總結(jié)
- Java String創(chuàng)建對(duì)象實(shí)例解析
- java通過(guò)反射創(chuàng)建對(duì)象并調(diào)用方法
- 6種Java創(chuàng)建對(duì)象的方式總結(jié)
- Java創(chuàng)建對(duì)象之顯示創(chuàng)建與隱式創(chuàng)建
- Java?Unsafe創(chuàng)建對(duì)象的方法實(shí)現(xiàn)
相關(guān)文章
java學(xué)習(xí)筆記_關(guān)于字符串概述
下面小編就為大家?guī)?lái)一篇java學(xué)習(xí)筆記_關(guān)于字符串概述。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05MyBatis動(dòng)態(tài)SQL foreach標(biāo)簽實(shí)現(xiàn)批量插入的方法示例
這篇文章主要介紹了MyBatis動(dòng)態(tài)SQL foreach標(biāo)簽實(shí)現(xiàn)批量插入的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java分批將List數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)的解決過(guò)程
這篇文章主要給大家介紹了關(guān)于Java分批將List數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)的解決過(guò)程,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-08-08java 中 System.out.println()和System.out.write()的區(qū)別
這篇文章主要介紹了 java 中 System.out.println()和System.out.write()的區(qū)別.的相關(guān)資料,需要的朋友可以參考下2017-04-04Spring Boot與RabbitMQ結(jié)合實(shí)現(xiàn)延遲隊(duì)列的示例
本篇文章主要介紹了Spring Boot與RabbitMQ結(jié)合實(shí)現(xiàn)延遲隊(duì)列的示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11java開發(fā)主流定時(shí)任務(wù)解決方案全橫評(píng)詳解
這篇文章主要為大家介紹了java開發(fā)主流定時(shí)任務(wù)解決方案全橫評(píng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09MyBatis實(shí)現(xiàn)插入大量數(shù)據(jù)方法詳解
最近在公司項(xiàng)目開發(fā)中遇到批量數(shù)據(jù)插入或者更新,下面這篇文章主要給大家介紹了關(guān)于MyBatis實(shí)現(xiàn)批量插入的相關(guān)資料,需要的朋友可以參考下2022-11-11Java的NIO之并發(fā)環(huán)境下非阻塞IO技術(shù)詳解
這篇文章主要介紹了Java的NIO之并發(fā)環(huán)境下非阻塞IO技術(shù)詳解,Java NIO(New IO)是Java平臺(tái)提供的一種用于高效處理I/O操作的API,它引入了一組新的類和概念,以提供更好的性能和可擴(kuò)展性,需要的朋友可以參考下2023-09-09