绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
5种创建Java对象的方式
2020-01-07 10:57:19

在本篇文章中,将介绍5种创建Java对象的方式。类是创建对象的基本模板,接下来将介绍5种不同的方式,利用Java类来实例化Java对象。


5种创建Java对象的方式


1. 使用new关键字

采用new关键字实例化对象是Java中为常见的方法,下面是采用new关键字实例化对象的示例。在开始之前,我们先准备好一个Java类:Student.java。

package com.ramostear.oops;public class Student{    private String name;    private String nickname;    public Student(String name,String nickname){        this.name = name;        this.nickname = nickname;    }    public String getName(){        return name;    }    public void setName(String name){        this.name = name;    }    public String getNickname(){        return nickname;    }    public void setNickname(String nickname){        this.nickname = nickname;    }}

接下来,我们通过new关键字来创建几个学生:

package com.ramostear.oops;public class TestNewStudent{    public static void main(String[] args){        Student zhangsan = new Student("Zhangsan","张三");        Student lisi = new Student();        lisi.setName("Lisi");        lisi.setNickname("李四");    }}

2. 使用Class类的newInstance()方法

首先,我们可以通过Class.forName()方法动态加载目标类,然后再调用newInstance()方法,动态实例化对象。同理,在开始之前,我们需要准备一个目标类:Student.java。

package com.ramostear.oops;public class Student{    private String name = "Zhangsan";    private String nickname = "张三";    public Student(){        super();    }    public Student(String name,String nickname){        super();        this.name = name;        this.nickname = nickname;    }    public String getName(){        return name;    }    public void setName(String name){        this.name = name;    }    public String getNickname(){        return nickname;    }    public void setNickname(String nickname){        this.nickname = nickname;    }}

接下来,将演示如何通过newInstance()方法来创建新的对象:

package com.ramostear.oops;public class TestUseNewInstanceMethod{    public static void main(String[] args){        try{            String className = "com.ramostear.oops.Student";            Class clz = Class.forName(className);            Student student = (Student) clz.newInstance();            System.out.println("student name :"+ student.getName()+", nickname: "+student.getNickname());        }catch(InstantiationException | IllegalAccessException | ClassNotFoundException e){            e.printStackTrace();        }    }}

运行main()方法,将输出如下信息:

student name :Zhangsan, nickname:张三

3. 使用Constructor.newInstance()方法

与Class类的newInstance()方法相似,我们还可以使用java.lang.reflect.Constructor类的newInstance()方法来创建新的对象。同样,我们先准备一个目标类:

package com.ramostear.oops;public class Student{    private String name = "Constructor";    private String nickname = "构造器";    public Student(){        super();    }    public Student(String name,String nickname){        super();        this.name = name;        this.nickname = nickname;    }    public String getName(){        return name;    }    public void setName(String name){        this.name = name;    }    public String getNickname(){        return nickname;    }    public void setNickname(String nickname){        this.nickname = nickname;    }}

接下来,我们看看如何使用Constructor的newInstance()方法创建新的对象:

package com.ramostear.oops;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;public class UseConstructorNewInstanceMethod{    public static void main(String[] args){        Constructor<Student> studentConstructor;        try{            studentConstructor = Student.class.getConstructor();            Student student = studentConstructor.newInstance();             System.out.println("student name :"+ student.getName()+", nickname: "+student.getNickname());        }catch(InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException |               NoSuchMethodException | SecurityException e){            e.printStackTrace();        }    } }

执行main()方法,将在控制台输出如下信息:

student name:Constructor, nickname:构造器

4. 使用反序列化

如果要使用反序列化创建对象,则目标类首先要实现Serializable接口。Serializable是一个标记接口。在本次示例中,我们先创建一个Student对象,并将其保存到data.txt文件中,然后在通过反序列化操作,读取data.txt中的数据,并创建新的对象。

package com.ramostear.oops;import java.io.Serializable;public class Student implements Serializable{ private String name; private String nickname; public Student() {  super(); } public Student(String name, String nickname) {  super();  this.name = name;  this.nickname = nickname; } public String getName() {  return name; } public void setName(String name) {  this.name = name; } public String getNickname() {  return nickname; } public void setNickname(String nickname) {  this.nickname = nickname; }}

接下来,将通过一个简单的示例,演示如何使用反序列化的方式创建新的对象:

package com.ramostear.oops;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class StudentDemo {    public static void main(String[] args) {        String filePath = "data.txt";        Student student1 = new Student("Deserialization", "反序列化");        try {            FileOutputStream fileOutputStream = new FileOutputStream(filePath);            ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream);            outputStream.writeObject(student1);            outputStream.flush();            outputStream.close();            FileInputStream fileInputStream = new FileInputStream(filePath);            ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);            Student student2 = (Student) inputStream.readObject();            inputStream.close();            System.out.println("Student name:"+student2.getName()+", nickname:"+student2.getNickname());        } catch (Exception ee) {            ee.printStackTrace();        }    }}

执行上述代码,将在控制台输出如下信息:

Student name:Deserialization,nickname:反序列化

5. 使用对象克隆创建新的对象

clone()方法可以创建现有对象的副本,但在使用clone()方法前,需保证模板类实现了Cloneable接口,Cloneable接口也是一个标记类接口。下面是使用克隆方式创建新对象的完整示例:

package net.javaguides.corejava.oops;import java.io.Serializable;public class Student implements Cloneable {    private String name;    private String nickname;    public Student() {        super();    }    public Student(String name, String nickname) {        super();        this.name = name;        this.nickname = nickname;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getNickname() {        return nickname;    }    public void setNickname(String nickname) {        this.nickname = nickname;    }    public static void main(String args[]) {        Student stu1 = new Student("Clone", "克隆");        try {            Student stu2 = (Student) stu1.clone();            System.out.println("Student name :"+stu2.getName()+",nickname:"+stu2.getNickanme());        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }    }}

运行上述代码,控制台将输出如下信息:

Student name: Clone,nickname:克隆
分享好友

分享这个小栈给你的朋友们,一起进步吧。

JAVA玩具小屋
创建时间:2019-08-16 16:54:49
分享程序开发方面的小经验,思考一些比较简单易懂的技术问题
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • Yios5092
    栈主

小栈成员

查看更多
  • 栈栈
  • coyan
  • 25minutes
  • ?
戳我,来吐槽~