Java基础知识强化25:Java创建对象的四种方式
1. Java程序中对象的创建有四种方式:
● 调用new语句创建对象,最常见的一种
● 运用反射手段创建对象,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法
● 调用对象的clone()方法
● 运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.
2. 四种方式的代码演示,如下:
(1)创建Java工程,如下:
(2)代码如下:
Person.java,如下:
1 package com.himi.demo; 2 3 public class Person implements Cloneable { 4 5 private int age; 6 private String name; 7 8 public Person() { 9 10 } 11 public Person(int age, String name) { 12 this.age = age; 13 this.name = name; 14 } 15 public int getAge() { 16 return age; 17 } 18 public void setAge(int age) { 19 this.age = age; 20 } 21 public String getName() { 22 return name; 23 } 24 public void setName(String name) { 25 this.name = name; 26 } 27 28 29 @Override 30 protected Object clone() throws CloneNotSupportedException { 31 // TODO Auto-generated method stub 32 return super.clone(); 33 } 34 35 36 37 }
与此同时,Person2.java,如下:
1 package com.himi.demo; 2 3 import java.io.Serializable; 4 5 public class Person2 implements Serializable { 6 7 private static final long serialVersionUID = 8735345334183008720L; 8 private int age; 9 private String name; 10 11 public Person2() { 12 13 } 14 public Person2(int age, String name) { 15 this.age = age; 16 this.name = name; 17 } 18 public int getAge() { 19 return age; 20 } 21 public void setAge(int age) { 22 this.age = age; 23 } 24 public String getName() { 25 return name; 26 } 27 public void setName(String name) { 28 this.name = name; 29 } 30 31 32 @Override 33 public String toString() { 34 // TODO Auto-generated method stub 35 return "name=" + name + ", age=" + age; 36 } 37 38 39 40 }
测试类,如下:
1 package com.himi.demo; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.ObjectInputStream; 6 import java.io.ObjectOutputStream; 7 import java.util.Date; 8 9 public class TestDemo { 10 11 public static void main(String[] args) throws Exception { 12 //1. 使用new构造方法 13 Person p1 = new Person(23,"Jack"); 14 System.out.println("使用new构造方法:"+p1); 15 16 //2. 使用反射,默认调用空构造,必须实现,负责报错:InstantiationException 17 Person p2 = (Person) Class.forName("com.himi.demo.Person").newInstance(); 18 System.out.println("使用反射:"+p2); 19 20 //3. 使用clone,必须实现Cloneable接口,否则抛出CloneNotSupportedException 21 Person p3 = (Person) p1.clone(); 22 System.out.println("使用clone:"+p3); 23 24 //4. 用对象流来实现,前提是对象必须实现 Serializable 25 System.out.println(); 26 System.out.println("----------用对象流来实现,前提是对象必须实现 Serializable---------"); 27 ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream("p.txt")); 28 //序列化对象 29 Person2 obj = new Person2(24,"haobo"); 30 out.writeObject("你好!"); 31 out.writeObject(new Date()); 32 out.writeObject(obj); 33 out.writeInt(123); //写入基本类型数据 34 out.close(); 35 36 //反序列化对象 37 ObjectInputStream in = new ObjectInputStream(new FileInputStream("p.txt")); 38 39 System.out.println("obj1=" + (String) in.readObject()); 40 System.out.println("obj2=" + (Date) in.readObject()); 41 42 Person2 obj1 = (Person2) in.readObject(); 43 System.out.println("obj1=" + obj1); 44 45 int num = in.readInt(); 46 System.out.println("num=" + num); 47 48 in.close(); 49 } 50 51 }
运行结果,如下: