Chapter06-接口和内部类

一、接口中的所有方法自动的属于public,不必提供public关键字。接口绝不能含有实例域,也不能在接口中实现方法,提供实例域与方法实现的任务应该由实现接口的哪个类来完成。
二、尽管不能构造接口的对象,却能声明接口的变量,接口变量必须引用实现了接口的类对象,如同使用instanceof检查一个对象是否属于某个特定类一样,也可以使用instanceof检查一个对象是否实现了某个特定的接口,接口也可以被扩展,接口中不可与含静态方法和实例域,但是可以包含常量。
API(java.lang.Comparable<T>)
int compareTo(T other)
API(java.util.Arrays)
static void sort(Object[] a)

三、如果创建一个对象的新的copy,最初状态与original一样,但以后将可以各自改变各自的状态,那就需要使用clone方法。如果对象中的数据域都属于基本数据类型或数值,这样的拷贝没有问题,但是如果包含了子对象的引用,拷贝的结果会使两个域的引用同一个子对象,因此原始对象与克隆对象共享这部分信息。默认的克隆操作是浅拷贝,并没有克隆包含在对象中的内部对象。因此必须重新定义clone方法,以便实现克隆子对象的深拷贝。
对于每一个类都要做出下列判断:
  1. 默认的clone方法是否满足要求;
  2. 默认的clone方法是否能够通过调用可变子对象的clone得到修补。
  3. 是否不应该使用clone
要选择1、2,就必须1.实现cloneable接口;2.使用public访问修饰符重新定义clone方法。
只要在clone中含有没有实现cloneable接口的对象,Object类的clone方法就会抛出一个CloneNot-SupportException异常,因此需要声明异常。

API(javax.swing.JOptionPane)
static void showMessageDialog(Component parent,Object message)//显示一个对话框。对话框在parent组件中央,如果是null则为屏幕中央。
API(javax.swing.Timer)
Timer(ine interval, ActionListener listener)//构造一个定时器,每个interval毫秒通告listener一次
void start()//启动定时器,一旦启动成功,定时器将调用监听器的actionPerformed。
void stop()//停止定时器,一旦停止成功,定时器将不再调用监听器的actionPerformed
API(javax.awt.Toolkit)
static Toolkit getDefaultToolkit()//获得默认的工具箱,工具箱抱哈有关GUI环境的信息
void beep()//发出一声铃响

四、使用内部类的原因有以下三点:
  • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
  • 内部类可以对同一个包中的其他类隐藏起来
  • 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
五、内部类可以访问自身的数据,也可以个访问外围类(outer)对象的数据域,为此内部类的对象总有一个指向外部类的引用。外围类的引用在构造器中设置,编译器修改了所有的内部类的构造器,添加一个外围类引用的参数。
六、事实上,使用外围类引用的正规语法还要复杂一些。表达式OuterClass.this表示外围类的引用。编译器将会把内部类翻译成用$分隔外部类名和内部类名的常规文件,而虚拟机对此一无所知。
七、在一个方法中定义局部类:局部类不能用public或private访问说明符进行声明,他的作用域被限定在声明这个局部类的快中,局部类有一个优势,即对外部世界可以完全地隐藏起来。与其他内部类比较,局部类有一个优点,不仅能够访问包含他们的外部类,还可以访问局部变量,不过,局部变量必须被声明为final。
八、final关键字可以应用于局部变量、实例变量和静态变量。在所有这些情况下,他们的含义都是:在创建这个变量之后,只能够为之赋值一次,此后,再也不能修改他的值了。
九、将局部内部类进一步深入,假如只创建这个类的一个对象,就不必命名了,这种类叫做匿名内部类,用于构造对象的任何参数都要被放在超类名后面的括号内(),通常的语法格式为:
new SuperType(construction parameters){
    inner class methods and data;
}
其中 SuperType可以是接口,于是内部类就要实现这个接口,也可以是一个类,于是内部类就要扩展他,匿名类不能有构造器,将构造器参数传递给超类构造器,尤其是在内部类实现接口的时候,不能有任何构造参数,不仅如此还要像下面这样提供一组括号:
new interfaceType()
{
    methods and data;
}
构造一个类的新对象与构造一个扩展了那个类的匿名内部类的对象之间的差别是,构造参数的闭圆括号跟在一个开花括号,正在定义的就是匿名内部类。
十、静态内部类的对象除了没有对生成他的外围类对象的引用特权外,与其他所有内部类完全一样。
十一、代理,利用代理可以在运行时创建一个实现了一组给定接口的新类。代理类可以在运行时创建全新的类,这样的代理类能够实现指定的接口,他具有下列方法:1.指定接口所需要的全部方法;2.Object类中的全部方法。不能在运行时定义这些方法的新代码,而是要提供一个调用处理器。调用处理器是实现了InvocationHandle接口的类对象。在这个接口中只有一个方法:object invoke(Object proxy,Method method,Object[] args)。无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数,调用处理器必须给出处理调用的方式。要想创建一个代理对象需要使用Proxy类的newProxyInstance方法。这个方法有三个参数:1.一个类加载器;2.一个Class对象数组;3.一个调用处理器

API(java.lang.reflect.InvocationHandler)
Object invoke(Object proxy,Method method,Object[] args)//定义代理对象调用方法时希望执行的动作
API(java.lang.reflect.Proxy)
static Class getProxyClass(ClassLoader loader,Class[] interfaces)//返回实现指定接口的代理类
static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler handler)//构造一个实现指定接口的代理类的实例,所有方法都将调用给定处理器对象的invoke
static boolean isProxyClass(Class c)//如果c是一个代理返回true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值