Java和C++在细节上的差异(三) (四)

2014-11-24 03:03:10 · 作者: · 浏览: 3
if (beep)
8 Tookkit.getDefaultToolkit().beep();
9 }
10 }
11 new Timer(interval,l).start();
12 }
5) 静态内部类,其功能和C++中的嵌套类非常相似,但是和Java自身的非静态内部类之间还是存在一些差异,如静态内部类不能直接访问外围类的对象引用域字段,但是可以访问外部类的static域字段(包括private)。在Java中只有内部类可以被定义为static的,外围类是不可以这样定义的。
1 public class TestMain {
2 private static boolean classField = false;
3 private boolean objectField = false;
4 static class InnerClass {
5 public void test() {
6 //这里由于classField是静态域字段,所以静态内部类可以直接访问,
7 //但是对于objectField对象域字段而言,由于静态内部类中没有包含
8 //外部类的引用,因此不能直接访问objectField.
9 if (classField)
10 System.out.println("Hello.");
11 }
12 }
13
14 public static void main(String[] args) {
15 classField = true;
16 new InnerClass().test();
17 }
18 }
以下示例中的内部类只能是静态内部类,因为该外部类的静态方法在返回内部类的实例时,无法将一个外部类的对象引用传递给该内部类,因为必须要求该内部类为静态内部类,否则将会报编译错误。
1 public class TestMain {
2 static class InnerClass {
3 public void test() {
4 System.out.println("Hello.\n");
5 }
6 }
7
8 private static InnerClass createInnerClass() {
9 return new InnerClass();
10 }
11 public static void main(String[] args) {
12 createInnerClass().test();
13 }
14 }
如果InnerClass不是静态内部类,则需要将上例改写为:
1 public class TestMain {
2 class InnerClass {
3 public void test() {
4 System.out.println("Hello.\n");
5 }
6 }
7
8 private static InnerClass createInnerClass() {
9 //为了确保InnerClass可以得到外部类的对象引用。
10 return new TestMain().new InnerClass();
11 }
12 public static void main(String[] args) {
13 createInnerClass().test();
14 }
15 }
6) 代理类:通过以下代码step by step解释代理类的机制
1 import java.lang.reflect.InvocationHandler;
2 import java.lang.reflect.Proxy;
3 import java.util.Arrays;
4 import java.util.Random;
5
6 public class TestMain {
7 public static void main(String[] args) {
8 Object[] elements = new Object[1000];
9 for (int i = 0; i < elements.length; ++i) {
10 Integer v = i + 1;
11 //h(调用处理接口)是代理类的核心处理单元。由于代理类对象只是包含了InvocationHandler
12 //这样一个对象实例,并且是存放于超类Proxy中的,而实际的被代理实例必须存放于InvocationHandler
13 //的实现类中,如这里的Integer对象v。其中的核心代理代码也是在InvocationHandler子类的
14 //invoke方法中完成的。
15 InvocationHandler h = new TraceHandler(v);
16 //1. 第一个参数表示ClassLoader,这里使用缺省加载器,因此传入null即可。
17 //2. 第二个参数表示该代理类需要implement的接口数组(Java中可以实现多个接口)。
18 //3. 调用处理器接口,是代理类如果实现代理的核心,后面会介绍该类。
19 //4. 将该代理类作为Integer的代理存入数组。
20 elements[i] = Proxy.newProxyInstance(null, new Class[] {Comparable.class}, h);
21 }
22 Integer key = new Random().nextInt(elements.length) + 1;
23 //1. 由于代理类也都实现Comparable接口,因此可以用于Arrays.binarySearch中。
24 //2. 对代理类进行二分查找的比较时,将会直接调用代理类的compareTo方法。
25 //3. 该自动生成的Pr