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