天天看点

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基础,作为进阶者是必须要了解的内容。后面会给出这些知识的博文,敬请期待,如有不正确之处,欢迎拍砖。