0
点赞
收藏
分享

微信扫一扫

【JAVA】创建对象的几种方式


                                         创建对象的几种方式

在java中,万事万物皆对象,作为开发者,我们每天也会创建大量的对象。那么你知道有几种创建对象的方式吗?

一、使用new关键字

Student student=new Student();

这种方式是我们最熟知的方式,使用new关键字并调用无参或有参的构造方法来创建一个对象。

二、使用Class中的newInstance()方法

使用newInstance()方法会间接地调用无参构造方法

(1)第一种方式,由全类名来获取Class对象

Student student = (Student) Class.forName("day0914.Student").newInstance();

(2)第二种方式,由类名.class来获取Class对象

Student student = Student.class.newInstance();

三、使用Constructor中的newInstance()方法

Constructor<Student> constructor=Student.class.getConstructor();
Student student=constructor.newInstance();

(1)这种方式也会间接地调用构造方法。

(2)第二种方法和第三种方法,都是我们常说的反射机制。

(3)第二种方法也就是Class的newInstance()方法,其内部调用了Constructor的newInstance()方法。

前三种方法总结

以上方法都是需要直接或间接地的调用构造方法。

四、使用Object类的clone()方法

package day0914;

public class Student implements Cloneable {
private String name;

private Student() {
}

private Student(String name) {
this.name = name;
}

public String getName() {
return name;
}

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

public static void main(String args[]) {
Student student = new Student("jack");
try {
Student student1 = (Student) student.clone();
System.out.print(student1.getName());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}


}
}

(1)clone()方法是一个本地方法,需要实现标识接口Cloneable。

(2)每当我们使用clone()方法创建对象时,程序都会将旧对象的内容全被拷贝到新对象中,并返回给我们。

(3)使用clone()方法,不会调用构造方法。

五、使用反序列化

我们先序列化一个对象,再通过反序列化得到新对象。

package day0914;

import java.io.*;

public class Student implements Serializable {
private String name;

private Student() {
}

private Student(String name) {
this.name = name;
}

public String getName() {
return name;
}

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

public static void main(String args[]) {
try {
Student student = new Student("jack");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu"));
oos.writeObject(student);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("stu"));
Student student1 = (Student) ois.readObject();
System.out.println(student1.getName());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}
}

(1)使用反序列创建对象,不会调用构造方法。

(2)使用反序列化方式创建对象,需要让我们的类实现标识接口Serializable。

最后两种方法总结:

clone()与反序列化这两种方式都不需要调用构造方法。

举报

相关推荐

0 条评论