Java之不通過構(gòu)造函數(shù)創(chuàng)建一個對象問題
1.調(diào)用對象的clone方法,實現(xiàn)一個對象的創(chuàng)建
先來看一個接口
也就是說想要實現(xiàn)類對象的克隆,該類就必須實現(xiàn)這個Cloneable這個接口,才表明調(diào)用Object對象中的clone(0方法是有效的
下面直接上代碼
Demo2.java
package pxx; public class Demo2 { public static void main(String[] args) throws CloneNotSupportedException { //利用構(gòu)造創(chuàng)建了一個對象,這里會調(diào)用一下無參構(gòu)造 TestDemo2 testDemo1 = new TestDemo2(); //利用clone()方法創(chuàng)建了一個對象,沒有構(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("該類無參構(gòu)造方法"); } public String getName() { return name; } public void setName(String name) { this.name = name; } //在這個方法里面克隆對象 @Override protected Object clone() throws CloneNotSupportedException { Object o = null; //調(diào)用父類的clone方法,返回這個對象 o = (TestDemo2)super.clone(); return o; } }
運行結(jié)果:
然后有同學(xué)會想到通過反射去實現(xiàn)一個對象也可以,其實他也是調(diào)用了對象的構(gòu)造方法,下面我們來說一下吧
2.利用反射機(jī)制來創(chuàng)建一個對象
反射類里面有一個Constructor類,通過里面的newInstance方法可以創(chuàng)建一個對象
先來看一個對象類
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("無參構(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); } }
下面利用反射來獲取一個對象
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類對象,類文件 Class person = Class.forName("domain.Person"); //利用反射構(gòu)造一個對象,這里是拿到無參構(gòu)造函數(shù) Constructor cons1 = person.getConstructor(); Object obj = cons1.newInstance();//其實這里還是調(diào)用了構(gòu)造方法 Person p1 = (Person)obj; p1.setName("張三"); System.out.println(p1.getName()); } }
運行結(jié)果:
很明顯無參方法被調(diào)用了。
3.我們可以通過反序列化去創(chuàng)建一個對象
要通過反序列化一個對象創(chuàng)建一個對象,必須在硬盤上存在一個序列化文件.ser
下面我在D盤中就存在一個關(guān)于下面Person類的序列化文件
看我們要通過反序列化創(chuàng)建的這個Person類
package domain; import java.io.Serializable; import java.util.Date; public class Person implements Serializable { String name; int age; String gender; //添加了一個短暫屬性,表明這個字段不可別序列化 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; //建立一個反序列化對象 //這里是.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(); } } } //上面就會反序列化之前我們在文件中存放的對象 //然后訪問一下之前創(chuàng)建的對象 System.out.println("Name: " + p.getName()); System.out.println("age: " + p.getAge()); System.out.println("gender: " + p.getGender()); System.out.println("birthday: " + p.getBirthday()); } }
運行結(jié)果:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java利用redis實現(xiàn)防止接口重復(fù)提交
本文主要為大家詳細(xì)介紹了Java如何利用redis實現(xiàn)防止接口重復(fù)提交,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-11-11總結(jié)一下Java回調(diào)機(jī)制的相關(guān)知識
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java回調(diào)機(jī)制展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06java學(xué)習(xí)之利用TCP實現(xiàn)的簡單聊天示例代碼
這篇文章主要給大家介紹了關(guān)于java學(xué)習(xí)筆記之利用TCP實現(xiàn)的簡單聊天的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12IDEA 集成log4j將SQL語句打印在控制臺上的實現(xiàn)操作
這篇文章主要介紹了IDEA 集成log4j將SQL語句打印在控制臺上的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02