天天看點

java基礎第四篇(續1)

 java基礎第四篇(續1)

                          -------------Java建立對象的四種方法

上一篇說到了關于對象建立的四種方法,和注意事項,本篇作為續篇自然要有一個執行個體了。

執行個體代碼1:本文以PersonInfo為例進行說明

package cn.com.basicOne;

import java.io.Serializable;
/**
 * 
 * @author fcs
 * 2014年8月10日
 * PersonInfo
 * 說明:生成對象的類,java序列化對象
 * 為了說明四種生成對象的方式都可行的情況下,需要personInfo類實作Serializable,Cloneable這兩個接口。
 */
public class PersonInfo implements Serializable ,Cloneable{
	//生成序列化ID
	private static final long serialVersionUID = -8066305480316658321L;
	private String name;
	private String addr;
	private int    age;
	private String sex;
	
	public PersonInfo(){}
	
	public PersonInfo(String name, String addr, int age, String sex) {
		super();
		this.name = name;
		this.addr = addr;
		this.age = age;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	//下面四種方法分别被四種生成的對象調用
	public void newInstance1(){
		System.out.println("我是被第一種方式,建立的對象調用的方法。。。。。這種方式很常用哦。。。。");
	}
	public void newInstance2(){
		System.out.println("我是被用第二種方式建立的對象調用的方法。。。。。這種方式很非主流卻高大上:java反射機制實作建立對象。。。");
	}
	public void newInstance3(){
		System.out.println("我是被第三種方式建立的對象調用的方法。。。。。這種方式不常用,卻是java克隆機制的完美展現");
	}
	public void newInstance4(){
		System.out.println("我是被第四種方式建立的對象調用的方法。。。。。這種方式運用到javaIO流,在網絡對象傳遞方面和第二種方式配合的相當默契。。。");
	}
	
	//重寫Object方法的clone方法,傳回Object對象,
	public Object clone(){
		Object obj = null;      //也可以直接聲明為PersonInfo對象,因為Object是所有類的超類,傳回類型并沒有錯。
		try {
			obj = (PersonInfo)super.clone();  //Object中的clone方法會識别出你建立的是哪一個對象。
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		} 
		return obj;
	}
}

執行個體代碼2:該類是一個測試類,分别用四種方法産生對象。
package cn.com.basicOne;

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 Client {
	/**
	 * 
	 * 作者:FCs
	 * 描述:第一種方式建立對象:最常用,
	 * 時間:2014年8月10日
	 * 傳回:void
	 */
	public void newInstance1(){
		PersonInfo  person = new PersonInfo();
		person.newInstance1();
	}
	
	/**
	 * 
	 * 作者:FCs
	 * 描述:第二種方式建立對象:要捕獲異常,或者在方法聲明中抛出異常。
	 * 該方法涉及到虛拟機的類加載機制。有興趣的話可以看一下java虛拟機方面的知識。
	 * 時間:2014年8月13日
	 * 傳回:void
	 */
	public void newInstance2(){
		try {
			//注意class.forName()裡的參數是類在項目包下的路徑,否則隻寫一個類名會找不到該類而報錯。
			PersonInfo person = (PersonInfo) Class.forName("cn.com.basicOne.PersonInfo").newInstance();
			person.newInstance2();
		} catch (Exception e){
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 * 作者:FCs
	 * 描述:第三種方式建立對象:這種方式的前提是要有一個該類的執行個體,并且實作Cloneable接口,重寫Object的
	 * clone方法。
	 * 時間:2014年8月13日
	 * 傳回:void
	 */
	public void newInstance3(){
		PersonInfo person = new PersonInfo("張三","長春",23,"男");
	    PersonInfo  person1 = (PersonInfo) person.clone();
	    person1.newInstance3();
	    System.out.println("驗證person 與person1 是否是一個對象:person==person1   ?   "+(person==person1));
	}
	
	/**
	 * 
	 * 作者:FCs
	 * 描述:對象建立的第四種方式:采用了java序列化的技術
	 * 說明:首先建立對象的類需要實作Serializable接口或者Externalizable接口,然後聲明對象輸出流和,對象輸入流,參數為檔案流。
	 * 時間:2014年8月13日
	 * 傳回:void
	 */
	public void newInstance4(){
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		try {
			
			 oos = new ObjectOutputStream(new FileOutputStream("E:/person.txt"));
			PersonInfo person = new PersonInfo("張三","長春",24,"男");
			oos.writeObject(person);   //将該對象寫入E盤下的person.txt檔案裡,裡面顯示的是位元組亂碼稱為位元組序列。。
			 ois = new ObjectInputStream(new FileInputStream("E:/person.txt"));
		
			PersonInfo person1 =(PersonInfo) ois.readObject(); //将對象從磁盤檔案中恢複。并讀取其中的資料
			person1.newInstance4();
			System.out.println("name:"+person1.getName()+"  addr: "+person1.getAddr()+" age:  "+person1.getAge()+" sex:"+person1.getSex());

		}catch (ClassNotFoundException e) {
				e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//在操作IO流方面最後一定要關閉流,釋放系統資源。
			try {
				oos.close();
				ois.close(); 
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	//測試方法
	public static void main(String[] args) {
		Client client = new Client ();
		client.newInstance1();
		System.out.println("\n");
		client.newInstance2();
		System.out.println("\n");
		client.newInstance3();
		System.out.println("\n");
		client.newInstance4();
			
	}
}
           

篇後說明:這四種方法除了第一種常見之外,其他三種涉及到的知識挺豐富的,也很廣泛,需要有一定的java基礎,作為進階者是必須要了解的内容。後面會給出這些知識的博文,敬請期待,如有不正确之處,歡迎拍磚。