Java之不通過構(gòu)造函數(shù)創(chuàng)建一個對象問題
1.調(diào)用對象的clone方法,實(shí)現(xiàn)一個對象的創(chuàng)建
先來看一個接口

也就是說想要實(shí)現(xiàn)類對象的克隆,該類就必須實(shí)現(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;
}
}運(yùn)行結(jié)果:

然后有同學(xué)會想到通過反射去實(shí)現(xiàn)一個對象也可以,其實(shí)他也是調(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();//其實(shí)這里還是調(diào)用了構(gòu)造方法
Person p1 = (Person)obj;
p1.setName("張三");
System.out.println(p1.getName());
}
}運(yùn)行結(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());
}
}運(yùn)行結(jié)果:

總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java利用redis實(shí)現(xiàn)防止接口重復(fù)提交
本文主要為大家詳細(xì)介紹了Java如何利用redis實(shí)現(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-06
java學(xué)習(xí)之利用TCP實(shí)現(xiàn)的簡單聊天示例代碼
這篇文章主要給大家介紹了關(guān)于java學(xué)習(xí)筆記之利用TCP實(shí)現(xiàn)的簡單聊天的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
深入解析java HashMap實(shí)現(xiàn)原理
這篇文章主要介紹了深入解析java HashMap實(shí)現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下2015-09-09
IDEA 集成log4j將SQL語句打印在控制臺上的實(shí)現(xiàn)操作
這篇文章主要介紹了IDEA 集成log4j將SQL語句打印在控制臺上的實(shí)現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

