关于Java中创建对象的四种方式的理解

Java中创建对象的四种方式的理解

先定义一个Person类:
注:若用反序列化创建对象一定要实现Serializable接口,clone()创建对象一定要实现Cloneable接口

package com.miao.createObject;
//---------类的序列化由实现java.io.Serializable接口的类启用,一个类实现Cloneable接口来指示Object.clone()方法---------
public class Person implements Serializable {   
    public String name;
    private int age;

    public Person() {
    }

    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;
    }
    
    //  浅克隆的实现
    public Person clone() {
        Person person=null;
        try {
            person = (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return person;
    }

    @Override
    public String toString() {
        return "姓名:" + name +
                "\n年龄:" + age;
    }
}


1.new创建对象

代码如下:

    @Test
    //---------------------new创建对象-------------------------------------
    public void show01() {
    	System.out.println("--------------new创建对象--------------------");
        Person person = new Person("张三", 18);
        System.out.println(person);
    }

运行结果:
在这里插入图片描述

2.反射创建对象

代码如下:

@Test
//----------------------反射创建对象-----------------------------------
    public void show02() throws Exception {
        System.out.println("-----------------反射创建对象--------------------");
//获取Class类的对象
        Class<?> aClass = Class.forName("com.miao.createObject.Person");
//Class类获取构造方法对象的方法 <--当有参构造方法是私有的时候使用getDeclaredConstructor()方法-->
        Constructor<?> constructor = aClass.getConstructor(String.class, int.class);
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class);
//暴力反射<-当有参构造方法为私有的时候使用->
        declaredConstructor.setAccessible(true);
//创建对象
        Person person1 = (Person) constructor.newInstance("张三", 18);
        System.out.println(person1);
//或者使用Class类的对象aClass.newInstance()直接创建对象
    Person person2 = (Person) aClass.newInstance();
    person2.setName("李四");
    person2.setAge(20);
    System.out.println(person2);
}

运行结果:
在这里插入图片描述

3.反序列化创建对象

代码如下:

@Test
//----------------------反序列化创建对象-----------------------------------
public void show03() throws Exception {
    System.out.println("----------------反序列化创建对象----------------");
    Person person1 = new Person("张三",18);
//创建一个ObjectOutputStream的对象
    FileOutputStream fos = new FileOutputStream("person.txt");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
//将指定的对象写入ObjectOutputStream
    oos.writeObject(person1);
//创建一个ObjectInputStream的对象
    FileInputStream person2 = new FileInputStream("person.txt");
    ObjectInputStream ois = new ObjectInputStream(person2);
//从ObjectInputStream读取一个对象
    Person person3 = (Person) ois.readObject();
    System.out.println(person3);
}

运行结果:
在这里插入图片描述

4. clone()方法创建对象

注:JDK1.8以后不支持直接使用clone()方法,需要在定义的类中定义clone()方法才能使用
代码如下:

@Test
//----------------------clone()方法创建对象-----------------------------------
    public void show04() {
    System.out.println("----------------clone()方法创建对象----------------");
    Person person = new Person("张三",18);
    Person person2 = person.clone();
    System.out.println(person);
}

运行结果:
在这里插入图片描述

5.特殊情况:字符串拼接

代码如下:

@Test
//----------------------字符串拼接也会创建新的对象-----------------------------------
    public void show05(){
    System.out.println("-------------字符串拼接------------");
    String s1="abc";
    String s2="a";
    String s3="bc";
    String s4=s2+s3;
    System.out.println("s1的值:"+s1);
    System.out.println("s4的值:"+s4);
    System.out.println("s1与s4的地址是否相等:"+(s1==s4));
}

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值