对象难找,教你几招创建对象的方式

x33g5p2x  于2021-12-20 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(268)

假设现在有一个User类,我们来通过以下几种方式创建出user对象。

User类

public class User {
    private int id;
    private String username;
    private String password;
    public String nickName;
    public String phone;

    public User(){}

    public User(int id, String username){
        this.id = id;
        this.username = username;
    }

    public User(int id, String username, String password, String nickName) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.nickName = nickName;
    }
}

new

通过new关键字创建对象,这是最常见的一种创建对象的方式了,可以调用任意的构造函数进行对象的创建。

使用new关键字创建user对象

public static void main(String[] args) {
        User user1 = new User();
        System.out.println("无参构造函数创建的对象:" + user1);

        User user2 = new User(2,"用户2");
        System.out.println("含部分参数构造函数创建的对象:" + user2);

        User user3 = new User(3,"用户3","12345678","小明");
        System.out.println("含全部参数构造函数创建的对象:" + user3);
    }

克隆

所谓克隆,就是指依照已存在的数据,复制出一份一样的数据。

关于克隆的详细解析可以参考我的这篇文章:java中浅克隆与深克隆解析

使用克隆创建对象,需要让User类实现Cloneable接口,并重写clone方法。

public class User implements Cloneable {
    private int id;
    private String username;
    private String password;
    public String nickName;
    public String phone;

    public User(){}

    public User(int id, String username){
        this.id = id;
        this.username = username;
    }

    public User(int id, String username, String password, String nickName) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.nickName = nickName;
    }

	public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

使用克隆创建user对象

public static void main(String[] args) {
        User user = new User(1,"克隆创建的user对象");
        User user_cloned = (User) user.clone();
        System.out.println(user_cloned);
    }

反射

关于反射的详细解析看这里:java中的反射机制解析

Class类的newInstance方法

先获取到class对象,再调用class的newInstance方法创建对象。

Class c = Class.forName("test.User");
 User user = (User) c.newInstance();
 System.out.println(user);

Constructor类的newInstance方法

先通过class对象获取User类的构造器,再调用构造器的newInstance方法创建对象。

Constructor<User> constructor = User.class.getConstructor();
User user = constructor.newInstance();
System.out.println(user);

序列化

使用序列化方式创建对象,需要让User类实现Serializable接口。

public class User implements Serializable {
}

使用序列化方式创建user对象

public static void main(String[] args) {
        User user = new User(3,"用户3","12345678","小明");

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(user);     // 序列化

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        User user1 = (User) objectInputStream.readObject();
        System.out.println(user1);
    }

序列化也是一种实现深克隆的方式。具体详见:java中浅克隆与深克隆解析

相关文章

微信公众号

最新文章

更多