标签:return read creat for cep image 方法 clone 面向对象
Java 是面向对象的语言,不可避免的,“对象”这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法。
总结下来有以下4种创建对象的方法:
最常见的 Java 对象的构造方法,通过调用类提供的构造器创建对象。
Java 反射中有一个 newInstance() 方法,可以创建对象,步骤如下:
示例代码:
1 public class MethodNewInstance { 2 3 public static void main(String[] args) throws Exception { 4 5 // 得到类对象 6 Class<?> clazz = Class.forName("com.gerrard.create.method_newInstance.ObjectToCreate"); 7 // 类对象的 newInstance() 方法,只能调用公有的无参构造器 8 clazz.newInstance(); 9 10 // 得到构造器对象数组(不管是私有还是公有的构造器) 11 Constructor<?>[] cons = clazz.getDeclaredConstructors(); 12 cons[1].newInstance(); 13 cons[2].newInstance("Gerrard"); 14 // 先打破私有构造器不可访问的限制 15 cons[0].setAccessible(true); 16 cons[0].newInstance("Gerrard", "Info"); 17 } 18 }
备注:
Object 类是所有类的直接或间接父类,Object 类中提供了 实例方法 native(),在给定对象的基础上,创建一个完全相同的对象。步骤如下:
示例代码:
1 public class ObjectToCreate implements Cloneable { 2 3 // 重写 Object 类的 clone() 方法(native 方法) 4 public ObjectToCreate clone() { 5 ObjectToCreate obj = null; 6 try { 7 obj = (ObjectToCreate) super.clone(); 8 } catch (CloneNotSupportedException e) { 9 // 没有实现 Cloneable 接口就会抛出这个异常 10 e.printStackTrace(); 11 } 12 return obj; 13 } 14 }
备注:
这个方法一共分两步:
序列化:
反序列化:
示例代码:
1 public class ObjectToCreate implements Serializable { 2 3 private static final long serialVersionUID = 1L; 4 5 private Object writeReplace(){ 6 return new Integer(1); 7 } 8 9 private Object readResolve(){ 10 return new Double(2); 11 } 12 }
1 public class MethodSerialable { 2 3 public static void main(String[] args) { 4 5 // 默认路径是项目的根路径 6 final String fileName = "./file/serialable.txt"; 7 8 ObjectToCreate o1 = new ObjectToCreate(); 9 10 // 序列化 11 try (FileOutputStream fos = new FileOutputStream(fileName); 12 ObjectOutputStream oos = new ObjectOutputStream(fos);) { 13 oos.writeObject(o1); 14 } catch (FileNotFoundException e) { 15 e.printStackTrace(); 16 } catch (IOException e) { 17 e.printStackTrace(); 18 } 19 } 20 }
1 public class MethodAntiSerialable { 2 3 public static void main(String[] args) { 4 // 默认路径是项目的根路径 5 final String fileName = "./file/serialable.txt"; 6 Object o2 = null; 7 // 反序列化 8 try (FileInputStream fio = new FileInputStream(fileName); ObjectInputStream ois = new ObjectInputStream(fio);) { 9 o2 = ois.readObject(); 10 } catch (FileNotFoundException e) { 11 e.printStackTrace(); 12 } catch (IOException e) { 13 e.printStackTrace(); 14 } catch (ClassNotFoundException e) { 15 e.printStackTrace(); 16 } 17 System.out.println(o2); 18 } 19 }
备注:
Java 创建对象的4种方法:第一种是最常用的;第二种方法深入至源码会指向 sun.reflect.ConstructorAccessor 类,JDK 中似乎没有提供继续深入下去的源码,但是既然是调用构造器的方法,那么与第一种方法一样,创建的对象是存储在堆(Heap)中的;第三种方法是要实现特定的接口才可以使用,而且是通过调用 native 方法,也就是非 Java 代码(很大可能是 C)实现的,也就是说,这个方法产生的对象,可能不会被 GC 回收(个人的想法),因为 GC 是用来回收 Java 代码创造的对象,所以要慎用;第四种方法在序列化的时候,需要实现特定的接口,而在反序列化时就不关心这一点了,它是将对象暂存于其他媒介中,在反序列化的时候将对象存于堆中。
标签:return read creat for cep image 方法 clone 面向对象
原文地址:http://www.cnblogs.com/jing-an-feng-shao/p/6070627.html