java创建对象的四种方式

Java语言是一种面向对象的语言,对象是整个Java语言的“核心”,因而创建对象就显得极为重要。这里简单讨论一下创建对象的方法。

总结来说,有以下四种方式:

  • new关键字创建
  • Java反射的newInstance方法
  • 使用Object的Clone犯法
  • 反序列化
  1. 使用new关键字

    • 这是最简单直接的方式,直接调用类提供的构造器创建
  2. 使用newInstance()方法

    使用Java的反射特性来创建对象,步骤如下:
    1. 获取需要创建对象的Class类
    2. 使用Class类的newInstance方法可以调用无参的构造器来创建对象,如果是有参构造器,则需要使用ClassforName方法和Constructor来进行对象的创建。
  3. 使用clone()方法

    Object 类是所有类的直接或间接父类,Object 类中提供了 实例方法 clone(),在给定对象的基础上,创建一个完全相同的对象。
    1. 将需要创建对象的类调用Cloneable接口
    2. 重写clone()方法
  4. 使用序列化

    1. 序列化:

    2. 想要序列化对象的类,实现 Serializable 接口。
    3. 使用文件输出流 FileOutputStream 创建存储序列化之后对象的文件。
    4. 使用对象输出流 ObjectOutputStream 的实例方法 writeObject(obj),将对象写入文件
    5. 反序列化:

    6. 使用文件输入流 FileInputStream 找到存储序列化对象的文件。
    7. 使用对象输入流 ObjectInputStream 的实例方法 readObject()。
    8. 判断类中是否存在,名为readResolve(),返回类型为 Object 的方法,若有读取这个对象;否则,反序列化文件中的对象流。
  5. 示例代码:

Student类

package basic;

import java.io.Serializable;

/**
 * @author: Mr.liu
 * @pacckageName: basic
 * @Date: 2019/3/1 0001
 * @Time: 9:16
 */
public class Student implements Cloneable,Serializable {
    private String name;

    public Student(String name){
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }

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

Test:

package basic;

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author: Mr.liu
 * @pacckageName: basic
 * @Date: 2019/3/1 0001
 * @Time: 9:19
 */
public class Test {
    public static void main(String args[]) throws Exception {
        //1.使用new关键字创建对象
        Student s1 = new Student("tom");
        System.out.println(s1.toString());

        //2、通过java反射,获取Student类。
        Class stuClass = Class.forName("basic.Student");
        Constructor constructor = stuClass.getConstructor(String.class);
        Student s2 = (Student) constructor.newInstance("李四");
        System.out.println(s2);

        //3.通过clone方式,必须实现cloneable接口
        Student s3 = (Student) s1.clone();
        System.out.println(s3);

        //4、通过对象流,必须实现Serializable
        String path = Test.class.getClassLoader().getResource("").getPath();
        path= java.net.URLDecoder.decode(path, "utf-8");//由于是中文路径,需要对其转码
        System.out.println(path);
        String objectFilePath = path + "out.txt";

        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(objectFilePath));
        objectOutputStream.writeObject(s2);

        ObjectInput objectInput = new ObjectInputStream(new FileInputStream(objectFilePath));
        Student s4 = (Student) objectInput.readObject();
        System.out.println(s4);
    }

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值