一、java 实例化几种方式
1、用new语句创建对象,这是最常见的创建对象的方法。
2、使用Class静态方法 Class.forName 方法
3、使用 .loadClass() 方法
4、使用Constructor类的newInstance方法
运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Object obj = Class.forName("java.lang.Object").newInstance();
5、调用对象的clone()方法。
无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法
6、使用反序列化。
通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
注意: Class.forName 和 .loadClass 方法的区别 : https://www.cnblogs.com/Jomini/p/13749568.html
二、代码
Person 类
class Person { private String name; private int age; public Person( String name,int age) { this.name = name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name){ this.name =name; } @Override public String toString() { // TODO Auto-generated method stub return "姓名是:"+name+"; 年龄是:"+age; } }
1、new 的方式实例化
Person p1 = new Person("王豪博",25); System.out.println(p1.tostring())
2、使用Class静态方法 Class.forName 方法 (再调 newInstance方法 )
Person emp2 = (Person) Class.forName("org.pro.com.Person").newInstance();
或者
Persone emp2 = Person.class.newInstance();
3、class.loadClass 方法
ClassLoader cl; // 如何获得ClassLoader参考1.6 Class cls = cl.loadClass("com.rain.B"); // 使用第一步得到的ClassLoader来载入B B b = (B)cls.newInstance(); // 有B的类得到一个B的实例
4、和Class类的newInstance方法很像, java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。
Constructor<Person > constructor = Person .class.getConstructor(); Person emp3 = constructor.newInstance();
5、使用 clone
class Person implements Cloneable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "姓名是:" + name + "; 年龄是:" + age; } }
测试
public static void main(String[] args) { Person p1 = new Person("Jone", 25); Person p2 = null; try { p2 = (Person) p1.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } p2.setName("Ken"); p2.setAge(24); System.out.println(p2); }
6、使用反序列化
import java.io.*; import java.util.Date; public class ObjectSaver { public static void main(String[] args) throws Exception { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:/objectFile.swf")); //序列化对象 Customer customer = new Customer("haobo", 24); out.writeObject("你好!"); out.writeObject(new Date()); out.writeObject(customer); out.writeInt(123); //写入基本类型数据 out.close(); //反序列化对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/objectFile.swf")); System.out.println("obj1=" + (String) in.readObject()); System.out.println("obj2=" + (Date) in.readObject()); Customer obj3 = (Customer) in.readObject(); System.out.println("obj3=" + obj3); int obj4 = in.readInt(); System.out.println("obj4=" + obj4); in.close(); } } class Customer implements Serializable { /** * */ private static final long serialVersionUID = -88175599799432325L; private String name; private int age; public Customer(String name, int age) { this.name = name; this.age = age; } public String toString() { return "name=" + name + ", age=" + age; } }
--------------------------------------
https://blog.csdn.net/u012524415/article/details/80327705