Java创建对象有5种方式
1、通过 new 关键字
这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象。
Score score1 = new Score("math", "100");
2、通过 Class 类的 newInstance() 方法
默认是调用类的无参构造方法创建对象。
Score score2 = (Score) Class.forName("文件.Score").newInstance();
3、通过 Constructor 类的 newInstance 方法
通过反射来实现。通过 java.lang.relect.Constructor 类的 newInstance() 方法指定某个构造器来创建对象。实际上第二种方法利用 Class 的 newInstance() 方法创建对象,其内部调用还是 Constructor 的 newInstance() 方法。
Score score3 = (Score) Class.forName("文件.Score").getConstructors()[0].newInstance();
4、clone 方法
clone 是 Object 类中的一个方法。Score 类需要实现 Cloneable 接口。
Score score4 = (Score) score1.clone();
Score 类:
public class Score implements Serializable,Cloneable {
public static final long serialVersionUID = 1L;
public String course;
public String grade;
public Score() {
}
public Score(String course, String grade) {
this.course = course;
this.grade = grade;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Score{" + "course='" + course + '\'' + ", grade='" + grade + '\'' + '}';
}
}
5、序列化
序列化是把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。而反序列化则是把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);
objectOutputStream.writeObject(score1);
objectOutputStream.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(bis);
Score score5 = (Score) objectInputStream.readObject();
objectInputStream.close();
Score 类需要实现 Serializable接口。
小结
public class CreateObject {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException,
InvocationTargetException, CloneNotSupportedException, IOException {
// 1、通过 new 关键字
Score score1 = new Score("math", "100");
// 2、通过 Class 类的 newInstance() 方法
Score score2 = (Score) Class.forName("文件.Score").newInstance();
// 3、通过 Constructor 类的 newInstance 方法
Score score3 = (Score) Class.forName("文件.Score").getConstructors()[0].newInstance();
// 4、clone 方法
Score score4 = (Score) score1.clone();
// 5、序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);
objectOutputStream.writeObject(score1);
objectOutputStream.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(bis);
Score score5 = (Score) objectInputStream.readObject();
objectInputStream.close();
// 输出
Score score6 = score1;
System.out.println("score1=" + score1 + ",hashCode="+score1.hashCode());
System.out.println("score2=" + score2 + ",hashCode="+score2.hashCode());
System.out.println("score3=" + score3 + ",hashCode="+score3.hashCode());
System.out.println("score4=" + score4 + ",hashCode="+score4.hashCode());
System.out.println("score5=" + score5 + ",hashCode="+score5.hashCode());
System.out.println("score6=" + score6 + ",hashCode="+score6.hashCode());
}
}
输出:
score1=Score{course='math', grade='100'},hashCode=1670675563
score1=Score{course='null', grade='null'},hashCode=883049899
score1=Score{course='null', grade='null'},hashCode=2093176254
score1=Score{course='math', grade='100'},hashCode=1854731462
score1=Score{course='math', grade='100'},hashCode=317574433
score6=Score{course='math', grade='100'},hashCode=1670675563
结果看出,score4、score5均创建了新的对象,并指向新的堆空间。