Java之不通過(guò)構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象問(wèn)題
1.調(diào)用對(duì)象的clone方法,實(shí)現(xiàn)一個(gè)對(duì)象的創(chuàng)建
先來(lái)看一個(gè)接口
也就是說(shuō)想要實(shí)現(xiàn)類對(duì)象的克隆,該類就必須實(shí)現(xiàn)這個(gè)Cloneable這個(gè)接口,才表明調(diào)用Object對(duì)象中的clone(0方法是有效的
下面直接上代碼
Demo2.java
package pxx; public class Demo2 { public static void main(String[] args) throws CloneNotSupportedException { //利用構(gòu)造創(chuàng)建了一個(gè)對(duì)象,這里會(huì)調(diào)用一下無(wú)參構(gòu)造 TestDemo2 testDemo1 = new TestDemo2(); //利用clone()方法創(chuàng)建了一個(gè)對(duì)象,沒(méi)有構(gòu)造方法調(diào)用 TestDemo2 testDemo2 = (TestDemo2) testDemo1.clone(); testDemo2.setName("周杰倫"); System.out.println(testDemo1.getName()); System.out.println(testDemo2.getName()); } } class TestDemo2 implements Cloneable{ private String name = "孫悟空"; public TestDemo2() { System.out.println("該類無(wú)參構(gòu)造方法"); } public String getName() { return name; } public void setName(String name) { this.name = name; } //在這個(gè)方法里面克隆對(duì)象 @Override protected Object clone() throws CloneNotSupportedException { Object o = null; //調(diào)用父類的clone方法,返回這個(gè)對(duì)象 o = (TestDemo2)super.clone(); return o; } }
運(yùn)行結(jié)果:
然后有同學(xué)會(huì)想到通過(guò)反射去實(shí)現(xiàn)一個(gè)對(duì)象也可以,其實(shí)他也是調(diào)用了對(duì)象的構(gòu)造方法,下面我們來(lái)說(shuō)一下吧
2.利用反射機(jī)制來(lái)創(chuàng)建一個(gè)對(duì)象
反射類里面有一個(gè)Constructor類,通過(guò)里面的newInstance方法可以創(chuàng)建一個(gè)對(duì)象
先來(lái)看一個(gè)對(duì)象類
Person.java
package domain; public class Person { private String name; private int age; public String a; protected String b; String c; private String d; public Person() { System.out.println("無(wú)參構(gòu)造調(diào)用了"); } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", a='" + a + '\'' + ", b='" + b + '\'' + ", c='" + c + '\'' + ", d='" + d + '\'' + '}'; } public void eat(){ System.out.println("eat..."); } public void eat(String food){ System.out.println("eat..."+food); } }
下面利用反射來(lái)獲取一個(gè)對(duì)象
Reflect4.java
package reflect; import domain.Person; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Reflect4 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //獲得class類對(duì)象,類文件 Class person = Class.forName("domain.Person"); //利用反射構(gòu)造一個(gè)對(duì)象,這里是拿到無(wú)參構(gòu)造函數(shù) Constructor cons1 = person.getConstructor(); Object obj = cons1.newInstance();//其實(shí)這里還是調(diào)用了構(gòu)造方法 Person p1 = (Person)obj; p1.setName("張三"); System.out.println(p1.getName()); } }
運(yùn)行結(jié)果:
很明顯無(wú)參方法被調(diào)用了。
3.我們可以通過(guò)反序列化去創(chuàng)建一個(gè)對(duì)象
要通過(guò)反序列化一個(gè)對(duì)象創(chuàng)建一個(gè)對(duì)象,必須在硬盤上存在一個(gè)序列化文件.ser
下面我在D盤中就存在一個(gè)關(guān)于下面Person類的序列化文件
看我們要通過(guò)反序列化創(chuàng)建的這個(gè)Person類
package domain; import java.io.Serializable; import java.util.Date; public class Person implements Serializable { String name; int age; String gender; //添加了一個(gè)短暫屬性,表明這個(gè)字段不可別序列化 transient Date birthday; public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }
然后看我們看一下飯序列代碼DeserializeTest1.java
package test; import domain.Person; import java.io.*; public class DeserializeTest1 { public static void main(String[] args) { //將文件進(jìn)行反序列化 Person p = null; //建立一個(gè)反序列化對(duì)象 //這里是.ser序列化的文件 FileInputStream fis = null; ObjectInputStream objectInputStream = null; try { fis = new FileInputStream("D:/w.ser"); objectInputStream = new ObjectInputStream(fis); p = (Person) objectInputStream.readObject(); } catch (Exception e) { e.printStackTrace(); }finally{ try { objectInputStream.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } //上面就會(huì)反序列化之前我們?cè)谖募写娣诺膶?duì)象 //然后訪問(wèn)一下之前創(chuàng)建的對(duì)象 System.out.println("Name: " + p.getName()); System.out.println("age: " + p.getAge()); System.out.println("gender: " + p.getGender()); System.out.println("birthday: " + p.getBirthday()); } }
運(yùn)行結(jié)果:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java利用redis實(shí)現(xiàn)防止接口重復(fù)提交
本文主要為大家詳細(xì)介紹了Java如何利用redis實(shí)現(xiàn)防止接口重復(fù)提交,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11SpringBoot中shiro過(guò)濾器的重寫與配置詳解
在前后端分離跨域訪問(wèn)的項(xiàng)目中shiro進(jìn)行權(quán)限攔截失效 (即使有正確權(quán)限的訪問(wèn)也會(huì)被攔截) 時(shí)造成302重定向錯(cuò)誤等問(wèn)題,為解決這個(gè)問(wèn)題,就需要進(jìn)行shiro過(guò)濾器的重寫以及配置。本文詳細(xì)介紹了解決方法,需要的可以參考一下2022-04-04總結(jié)一下Java回調(diào)機(jī)制的相關(guān)知識(shí)
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java回調(diào)機(jī)制展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06java學(xué)習(xí)之利用TCP實(shí)現(xiàn)的簡(jiǎn)單聊天示例代碼
這篇文章主要給大家介紹了關(guān)于java學(xué)習(xí)筆記之利用TCP實(shí)現(xiàn)的簡(jiǎn)單聊天的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12深入解析java HashMap實(shí)現(xiàn)原理
這篇文章主要介紹了深入解析java HashMap實(shí)現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下2015-09-09maven項(xiàng)目下solr和spring的整合配置詳解
這篇文章主要介紹了maven項(xiàng)目下solr和spring的整合配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11IDEA 集成log4j將SQL語(yǔ)句打印在控制臺(tái)上的實(shí)現(xiàn)操作
這篇文章主要介紹了IDEA 集成log4j將SQL語(yǔ)句打印在控制臺(tái)上的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02