欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java之不通過構(gòu)造函數(shù)創(chuàng)建一個對象問題

 更新時間:2024年03月25日 10:11:46   作者:楊·戩  
這篇文章主要介紹了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ù)提交

    Java利用redis實現(xiàn)防止接口重復(fù)提交

    本文主要為大家詳細(xì)介紹了Java如何利用redis實現(xiàn)防止接口重復(fù)提交,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • Java反射(Class類,Class對象獲取)

    Java反射(Class類,Class對象獲取)

    下面是對Java反射機(jī)制是在程序的運行過程中,Java語言的反射機(jī)制的超詳細(xì)解說,點進(jìn)來的小伙伴不要錯過奧
    2021-08-08
  • SpringBoot中shiro過濾器的重寫與配置詳解

    SpringBoot中shiro過濾器的重寫與配置詳解

    在前后端分離跨域訪問的項目中shiro進(jìn)行權(quán)限攔截失效 (即使有正確權(quán)限的訪問也會被攔截) 時造成302重定向錯誤等問題,為解決這個問題,就需要進(jìn)行shiro過濾器的重寫以及配置。本文詳細(xì)介紹了解決方法,需要的可以參考一下
    2022-04-04
  • 總結(jié)一下Java回調(diào)機(jī)制的相關(guān)知識

    總結(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實現(xiàn)的簡單聊天示例代碼

    java學(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-12
  • Java如何實現(xiàn)Word文檔分欄效果

    Java如何實現(xiàn)Word文檔分欄效果

    這篇文章主要介紹了Java如何實現(xiàn)Word文檔分欄效果,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 深入解析java HashMap實現(xiàn)原理

    深入解析java HashMap實現(xiàn)原理

    這篇文章主要介紹了深入解析java HashMap實現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下
    2015-09-09
  • Java使用JXLS導(dǎo)出Excel詳解

    Java使用JXLS導(dǎo)出Excel詳解

    jxls是一個輕量級的Java庫,用于基于模板的Excel報表生成,這篇文章主要為大家介紹了Java如何使用JXLS導(dǎo)出Excel,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • maven項目下solr和spring的整合配置詳解

    maven項目下solr和spring的整合配置詳解

    這篇文章主要介紹了maven項目下solr和spring的整合配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • IDEA 集成log4j將SQL語句打印在控制臺上的實現(xiàn)操作

    IDEA 集成log4j將SQL語句打印在控制臺上的實現(xiàn)操作

    這篇文章主要介紹了IDEA 集成log4j將SQL語句打印在控制臺上的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論