java对象实例化有多少种方法?一般我们常用的有这么几种
1)用类的new ()创建
2)用clone方法创建, 需要类实现 Cloneable 接口
3)用 Class.forName方法获取类,在调用类的newinstance()方法
4)将一个对象实例化后,进行序列化,再反序列化,也可以获得一个对象(远程通信的场景下使用)
下面的例子,有两个类,一个是要操作的对象类,一个是对这个类的使用,代码如下:
User.java
package com.study.javainstance;
import java.io.Serializable;
public class User implements Cloneable,Serializable {
//实现Serializable,才有这个
private static final long serialVersionUID = -1L;
//用户名
String Name="";
//用户联系方式
String Phone="";
//用户公司
String Company="";
/*
* default 方法,没有这个方法,class.forname 会报错
*/
public User( ) {
this.Name = "default";
this.Phone = "default";
this.Company = "default";
}
public User( String name,String phone, String company ) {
this.Name = name;
this.Phone = phone;
this.Company = company;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getPhone() {
return Phone;
}
public void setPhone(String phone) {
Phone = phone;
}
public String getCompany() {
return Company;
}
public void setCompany(String company) {
Company = company;
}
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
public String toString(){
return "Name:"+this.Name+", Phone:"+this.Phone+", Company:"+this.Company+";";
}
}
UserTest.java
package com.study.javainstance;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class UserTest {
public static void main(String[] args) {
// java 实例化1,通过new方法
System.out.println("++++++++++通过Class New()方式实例化+++++++++++++");
User user1 = new User("Kong zi", "13800010001", "Greatwalk");
System.out.println(user1.toString());
System.out.println();
// java 实例化2,通过clone方式
System.out.println("++++++++++通过 clone()方式实例化+++++++++++++");
try {
User user2 = (User) user1.clone();
user2.setName("zhuang zi");
System.out.println(user2.toString());
System.out.println();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println("++++++++++通过Class.forName 反射方式 实例化+++++++++++++");
// java 实例化3,通过反射方式,先获取class,再获取实例
{
Class<?> c1 = null; //类泛型
try {
c1 = Class.forName("com.study.javainstance.User");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
User p1 = null;
try {
p1 = (User) c1.newInstance();
p1.setPhone("18600010002");
System.out.println(p1.toString());
System.out.println();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//通过序列化进行对象的序列化和反序列化
System.out.println("++++++++++通过序列化和反序列化进行 实例化+++++++++++++");
try{
ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream("E:/objectUser.txt"));
//序列化对象
out.writeObject(user1); //"Kong zi", "13800010001", "Greatwalk"
out.close();
//反序列化对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("E:/objectUser.txt"));
User user4 = (User) in.readObject();
System.out.println("反序列化user:" + user4);
in.close();
}
catch(ClassNotFoundException e ){
e.printStackTrace();
}
catch(FileNotFoundException e ){
e.printStackTrace();
}
catch(IOException e ){
e.printStackTrace();
}
}
}
上面的例子,执行的结果如下:
++++++++++通过Class New()方式实例化+++++++++++++
Name:Kong zi, Phone:13800010001, Company:Greatwalk;
++++++++++通过 clone()方式实例化+++++++++++++
Name:zhuang zi, Phone:13800010001, Company:Greatwalk;
++++++++++通过Class.forName 反射方式 实例化+++++++++++++
Name:default, Phone:18600010002, Company:default;
++++++++++通过序列化和反序列化进行 实例化+++++++++++++
反序列化user:Name:Kong zi, Phone:13800010001, Company:Greatwalk;