类 public class A { public void print() { System.out.println("Using Class A"); } } public class B { public void print() { System.out.println("Using Class B"); } } public class Main { public static void main(String[] args) { A a=new A(); B b; a.print(); } } javac *.java java -verbose:class Main [Loaded Main from file:/C:/] [Loaded A from file:/C:/] Using Class A [Loaded java.lang.Shutdown from shared objects file] [Loaded java.lang.Shutdown$Lock from shared objects file] 没有看到 [Loaded Main from file:/C:/] [Loaded A from file:/C:/] [Loaded B from file:/C:/] -------------------------------------------动态加载的例子 三个类 public class Word { public void start() { System.out.println("Word start"); } } public class Excel { public void start() { System.out.println("Excel start"); } } public class Office { public static void main(String[] args) { if(args.length!=1) { return ; } if(args[0].equals("Word")) { Word w=new Word(); w.start(); }else if(args[0].equals("Excel")) { Excel e=new Excel(); e.start(); } } } 依需求加载的优点是节省内存,但是仍有其缺点。举例来说,当程序第一次
用到该类别 的时候,系统就必须花一些额外的时间来加载该类别,使得整体执行效能受到影响, 尤其是由数以万计的类别所构成的 Java 程序。可是往后需要用到该类别时,由于类别 在初次加载之后就会被永远存放在内存之中,直到 Java 虚拟机关闭, 所以不再需要花费额外的时间来加载。 总的来说,就弹性上和速度上的考虑,如此的设计所带来的优点(弹性和省内存)远超过 额外加载时间的花费(只有第一次用到时),因此依需求加载的
设计是明智的选择。 如果我们新增了 Access.java 和 PowerPoint.java 这两个新类别时, Office.java 里的主程序就必须增加两个 if … else 的循环 那么如何来更好的展示 java 在可扩展性的优势呢 ---------------------------------------------------------使 JAVA 程序更有动态性的方法有两种 1)implicit 隐式,即利用实例化才载入的特性来动态载入 class 2)explicit 显式方式,又分两种方式: 1)java.lang.Class 的 forName()方法 2)java.lang.ClassLoader 的 loadClass()方法 隐式的:new 关键字 生成类的实例 第一种方法: Class.forName() 加载类 一个接口 public interface Assembly { public void start() ; } 三个类 public class Office { public static void main(String args[]) throws Exception { Class c = Class.forName(args[0]) ; /*Object o = c.newInstance() ; Assembly a = (Assembly) o ; */ Assembly a = (Assembly) c.newInstance(); a.start() ; } } public class Word implements Assembly { public void start() { System.out.println("Word Start") } } public class Excel implements Assembly { public void start() { System.out.println("Excel Start") } } ------------------------------------