Think in java 学习手记(三)

来源:互联网 发布:锐度男士 知乎 编辑:程序博客网 时间:2024/05/01 18:32

 

Chap 8 接口与内部类

1、接口与抽象类

       接口是一种更纯的抽象形式。

       接口的实现类必须用public 声明接口方法。而且必须声明这些接口方法。

       接口中声明的方法根本没有方法体。例如:抽象类中定义int a(){};而接口中定义为:int a();

       同抽象类一样,接口照样可以定义成员变量。

2、接口与抽象类的选用

       接口与抽象类在很大程度上可以互相取代,但应该优先使用接口,因为其含义更明确。更重要的是:它能够实现多重继承。

3、用接口实现enum

       java没有enum,而接口里的变量自动是finalpublicstatic的,所以可以直接将常量写进接口,来模拟enum

4、接口嵌套

       接口可以嵌套在另一接口中,也可以嵌套在一个类中。当然目前我还没有发现这种做法的用途。

5、内部类的定义

       可以在:类的内部、方法的内部、甚至结构块内部单独定义一个类。

       可以在类外定义接口,然后用内部类实现接口。调用的时候采用上传的方法进行。这样就完全隐藏了接口的实现。

内部类可以调用宿主类的成员(各种权限的),也就是默认内部类与宿主类存在某种联系。如果你不想要这种联系,即不想让内部类调用宿主类的非static参数,你应该将内部类设成static的——这就是嵌套类。只有在嵌套类里,可以调用宿主类的static成员,也可以设置自己的static成员。

嵌套类可以是接口的一部分,如下所示:

public interface II{

       static class Inner{

              int I;

              int j;

              int value(){};

       }

}

内部类的引用:在宿主类里要引用内部类,必须给出宿主类的reference。如:

class A{

       class AA{}

       public static void main(String args[])

              A.AA  aa new A().new AA();

}

注意上面那行:A.AA  aa new A().new AA()。绝不能是new A.AA()。即只能用宿主类的对象来创建内部类的对象。这是可以想象的:没有宿主类的实例,哪来内部类?

当然,上述例子对于嵌套类来说,就简单多了,只需AA  aa = new AA()

至于内部类的继承等,就不必深究了——实际用得并不多。

6、匿名内部类

       据说能很好地解决多重继承(抽象类或类)的问题。当然多重继承接口的问题不需要它。这里还需要多总结。尽管作者讲了N多好处,还是不太明白到底有什么用——主要是他没结合实例去讲,而只是在语义上讲它的便利。

       匿名内部类必须是一个派生类。

       关于匿名内部类的参数:凡是在内部类内部使用的参数全部应设成final。而只是通过基类构造函数调用的,则不需要。

7、回调callback

       给某个对象一段信息,在某个时段,反过来调用发起调用的原始对象。说得更简单些,就是你写一个方法,而这个方法会被别的程序自动调用。例如main(),再如线程的start()会自动调用run()。而在java中,回调是通过内部类来实现的。

 

Chap 9 异常

1、关于System.out System.err

       对于异常来说,最好将错误送到System.err为好。因为out可能会被重定向,导致无法打印在屏幕上。而Err即便被重定向,也会被打印在屏幕上。

 

Chap 10 RTTI

1、装载类

       Class.forName(类名);实现将类装载。注意这个类必须与异常ClassNotFoundException同时使用。

       在装载类的同时,将初始化静态成员。而对象将只在需要的时候装载。

2、如何得到类名

       设有类A,实例变量a = new A();

       则可通过两种方式得到类名:A.classa.getClass();得到的结果都是class A(注意前面多个class)。

       对于primitive、数组、接口,都可以按同样的办法。

       对于与primitive对应的wrap类,如short对应的Short,应用Short.TYPE可以得到”short”

3RTTI(动态类型检查)的方法

       1)经典的类型转换:如(Shape)

       2)上面提到的class方法。

       3instanceof方法。