Java 中创建对象的主要方式

方式 1:使用new关键字(最常见)

class Person {
    String name;
    public Person() {
        this.name = "默认名称";
        System.out.println("调用构造方法创建对象");
    }
}

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person(); // 直接使用 new 关键字创建对象
        System.out.println("对象 name:" + person1.name);
    }
}

方式 2:使用Class.newInstance()(反射,已过时)

public class Main {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Person.class;
        Person person2 = (Person) clazz.newInstance(); // 通过反射创建对象(已过时)
        System.out.println("反射创建对象 name:" + person2.name);
    }
}

 方式 3:使用Constructor.newInstance()(推荐的反射方式)

import java.lang.reflect.Constructor;

public class Main {
    public static void main(String[] args) throws Exception {
        Constructor<Person> constructor = Person.class.getConstructor();
        Person person3 = constructor.newInstance(); // 通过 Constructor 反射创建对象
        System.out.println("Constructor 反射创建对象 name:" + person3.name);
    }
}

方式 4:使用clone()方法

class Person implements Cloneable {
    String name;

    public Person(String name) {
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone(); // 直接克隆对象
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person4 = new Person("张三");
        Person clonedPerson = (Person) person4.clone(); // 通过 clone 方法创建对象
        System.out.println("原对象 name:" + person4.name);
        System.out.println("克隆对象 name:" + clonedPerson.name);
    }
}

注意:clone()方法必须实现Cloneable接口,否则会抛出CloneNotSupportedException

方式 5:使用反序列化

import java.io.*;

class Person implements Serializable { // 必须实现 Serializable 接口
    String name;

    public Person(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        // 序列化:将对象保存到文件
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"));
        Person person5 = new Person("李四");
        out.writeObject(person5);
        out.close();

        // 反序列化:从文件恢复对象
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"));
        Person deserializedPerson = (Person) in.readObject();
        in.close();

        System.out.println("反序列化对象 name:" + deserializedPerson.name);
    }
}

注意:

  • Serializable 接口必须实现,否则无法序列化。
  • 反序列化可以在不调用构造方法的情况下创建对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值