java对象实例化的几种方法

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;

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值