本文共 3710 字,大约阅读时间需要 12 分钟。
方式2> 使用 Object 的 clone 方法
<1> 实现 clone类 首先实现 Cloneble接口,Cloneable接口 实质上是一个标识接口 类似于 Serializable 接口,没有任何方法
<3> 在 clone方法中调用 super.clone(),无论 clone类 的继承结构是什么,super.clone() 都会直接或间接调用 Object类 中的 clone方法
public class Obj implements Cloneable { System.out.println("construct Obj"); public void setA(int a) { // 将 protected 作用域改成 public public Object clone() throws CloneNotSupportedException { public static void main(String[] args) { System.out.println(a.getA()); System.out.println(b.getA()); // construct Obj # 只打一个一次,说明没有进行两次 new 操作 // 0 # 两次打印的结果不同,说明 a b 指向的不是同一个对象 private String name = "Jack"; System.out.println("construct Person"); public String toString() { public static void main(String[] args) { clazz = Class.forName("com.chenshun.test.object.Person"); Person p = (Person) clazz.newInstance(); public class People implements Serializable { private static final long serialVersionUID = 8561166444504657722L; System.out.println("construct people"); public String toString() { public static void main(String[] args) { ObjectOutputStream oos = null; ObjectInputStream ois = null; FileOutputStream fos = new FileOutputStream("test.out"); oos = new ObjectOutputStream(fos); FileInputStream fis = new FileInputStream("test.out"); ois = new ObjectInputStream(fis); p1 = (People) ois.readObject(); Java 中 Class.forName() 和 ClassLoader 都可用来对类进行加载
1> Class.forName() 用于将类的 .class文件 加载到 JVM,还可以对类进行解释,执行类中的 static块。另外,Class.forName(name, initialize, loader) 带参函数也可控制是否加载 static块。并且只有调用 newInstance()方法采用调用构造函数,创建类的对象
2> ClassLoader 只干一件事情,就是将 .class文件加载到 JVM 中,不会执行 static 中的内容,只有在 newInstance 才会去执行 static块
System.out.println("静态代码块执行:loading point"); private static void testClassloader(String wholeNamePoint) { ClassLoader loader = ClassLoader.getSystemClassLoader(); point = loader.loadClass(wholeNamePoint); // demo = ClassloaderAndForNameTest.class.getClassLoader().loadClass(wholeNamePoint); // 这个也是可以的 System.out.println("point " + point.getName()); } catch (ClassNotFoundException e) { private static void testForName(String wholeNamePoint) { Class point = Class.forName(wholeNamePoint); System.out.println("point " + point.getName()); public static void main(String[] args) { String wholeNamePoint = "com.chenshun.test.object.Point"; System.out.println("下面是测试Classloader的效果"); testClassloader(wholeNamePoint); System.out.println("----------------------------------"); System.out.println("下面是测试Class.forName的效果"); testForName(wholeNamePoint); point com.chenshun.test.object.Point ---------------------------------- point com.chenshun.test.object.Point 这个案例需要注意的是如果 main 方法在 Point 中将会先打印 "静态代码块执行:loading point" 然后再执行其它操作,这是由于运行 main 方法前会先运行静态代码块 有 Java 成员运行顺序决定
转载地址:http://qagab.baihongyu.com/