Java中创建对象的四种方式的理解
先定义一个Person类:
注:若用反序列化创建对象一定要实现Serializable接口,clone()创建对象一定要实现Cloneable接口
package com.miao.createObject;
//---------类的序列化由实现java.io.Serializable接口的类启用,一个类实现Cloneable接口来指示Object.clone()方法---------
public class Person implements Serializable {
public String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 浅克隆的实现
public Person clone() {
Person person=null;
try {
person = (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return person;
}
@Override
public String toString() {
return "姓名:" + name +
"\n年龄:" + age;
}
}
1.new创建对象
代码如下:
@Test
//---------------------new创建对象-------------------------------------
public void show01() {
System.out.println("--------------new创建对象--------------------");
Person person = new Person("张三", 18);
System.out.println(person);
}
运行结果:
2.反射创建对象
代码如下:
@Test
//----------------------反射创建对象-----------------------------------
public void show02() throws Exception {
System.out.println("-----------------反射创建对象--------------------");
//获取Class类的对象
Class<?> aClass = Class.forName("com.miao.createObject.Person");
//Class类获取构造方法对象的方法 <--当有参构造方法是私有的时候使用getDeclaredConstructor()方法-->
Constructor<?> constructor = aClass.getConstructor(String.class, int.class);
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class);
//暴力反射<-当有参构造方法为私有的时候使用->
declaredConstructor.setAccessible(true);
//创建对象
Person person1 = (Person) constructor.newInstance("张三", 18);
System.out.println(person1);
//或者使用Class类的对象aClass.newInstance()直接创建对象
Person person2 = (Person) aClass.newInstance();
person2.setName("李四");
person2.setAge(20);
System.out.println(person2);
}
运行结果:
3.反序列化创建对象
代码如下:
@Test
//----------------------反序列化创建对象-----------------------------------
public void show03() throws Exception {
System.out.println("----------------反序列化创建对象----------------");
Person person1 = new Person("张三",18);
//创建一个ObjectOutputStream的对象
FileOutputStream fos = new FileOutputStream("person.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
//将指定的对象写入ObjectOutputStream
oos.writeObject(person1);
//创建一个ObjectInputStream的对象
FileInputStream person2 = new FileInputStream("person.txt");
ObjectInputStream ois = new ObjectInputStream(person2);
//从ObjectInputStream读取一个对象
Person person3 = (Person) ois.readObject();
System.out.println(person3);
}
运行结果:
4. clone()方法创建对象
注:JDK1.8以后不支持直接使用clone()方法,需要在定义的类中定义clone()方法才能使用
代码如下:
@Test
//----------------------clone()方法创建对象-----------------------------------
public void show04() {
System.out.println("----------------clone()方法创建对象----------------");
Person person = new Person("张三",18);
Person person2 = person.clone();
System.out.println(person);
}
运行结果:
5.特殊情况:字符串拼接
代码如下:
@Test
//----------------------字符串拼接也会创建新的对象-----------------------------------
public void show05(){
System.out.println("-------------字符串拼接------------");
String s1="abc";
String s2="a";
String s3="bc";
String s4=s2+s3;
System.out.println("s1的值:"+s1);
System.out.println("s4的值:"+s4);
System.out.println("s1与s4的地址是否相等:"+(s1==s4));
}
运行结果: