Core Java笔记—第6章 接口与内部类

6.1 接口

在Java程序设计语言中,接口不是类,而是一组对类的需求描述,这些类要遵从接口描述的统一格式进行定义.

接口中的所有方法自动设为public,因此在接口中声明方法时,不必提供关键字public.但是方法不能是static的.

接口中的变量域自动设为public static final.

在JDK 5.0中,Comparable接口已经改进为泛型类型.
public interface Comparable<T>
{
    int compareTo(T other);
}

接口不是类,不能使用new运算符实例化一个接口,但能声明接口变量,其必须引用实现了接口的类对象.

与使用instanceof检查一个对象是否属于某个特定类一样,也可以使用instanceof检查一个对象是否实现了某个特定的接口:if(anObject instanceof Comparable){...}.

Java中每个类只能够拥有一个超类,但可以实现多个接口.

6.2 对象克隆

Object类的clone方法是一个protected方法.由于这个类对具体的类一无所知,所以只能将各个域进行对应的拷贝,即默认的clone操作是浅拷贝.

即使clone的默认实现(浅拷贝)能够满足需求,也应该实现Clonebale接口,将clone定义为public,应调用super.clone().

只要在clone中含有没有实现Clonebale接口的对象,Object类的clone方法就会抛出一个CloneNotSupportedException异常.

所有的数组类型均包含一个clone方法,设个方法被设为public,而不是protected,可以利用这个方法创建一个包含所有数据元素拷贝的一个新数组.

6.3 接口与回调

Java有函数指针的对应物—Method对象,然而使用起来比较困难,速度也稍慢,且在编译时不能提供类型的安全性检查,因此在任何使用C++函数指针的地方,都应该考虑使用Java中的接口.

6.4 内部类

内部类是定义在另一个类中的类,使用内部类的原因:
1.内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据.
2.内部类可以对同一个包中的其他类隐藏起来.
3.当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷.

只有内部类可以是私有类,而常规类只能具有包的可见性或共有的可见性.

内部类既可以访问自身的数据域,也可以访问创建它的外围类的数据域.

OuterClass.this表示外围类引用.

内部类是一种编译器现象,与虚拟机无关.编译器将会把内部类翻译成$分隔外部类名与内部类名的常规类文件,而虚拟机对此一无所知.

在方法中定义的类叫做局部内部类,局部类不能用public或private修饰符进行声明,它的作用域被限定在声明该局部类的块中.局部类不仅能访问它们的外围类域,还能访问局部变量.不过,这些局部变量必须被声明为final.

将局部内部类的使用再深入一点,假如只创建这个类的一个对象就不必给它命名了,这种类被称为匿名内部类.

由于构造器的名字必须与类名相同,而匿名类没有类名,所以匿名类不能有构造器.

只有内部类可以声明为static.静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样.

6.5 代理

代理(proxy),是JDK 1.3新增加的特性.利用代理可以在运行时创建一个实现一组给定接口的新类.这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用.

//以下内容并不来自Core Java
关于Java动态代理的参考资料:
java动态代理学习笔记:http://langyu.iteye.com/blog/410071
Java 动态代理机制分析及扩展:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/

使用动态代理的一般步骤
1.声明接口
2.定义实现接口的真正的实现类
3.定义调用处理器类实现InvocationHandler接口,即给出invoke方法的实现
4.使用Proxy.newProxyInstance创建动态代理对象

动态生成的代理类都是继承于Proxy类,类名按格式“$ProxyN”生成,其中 N 是逐一递增的数字.这个动态代理类的代码是在运行时由Proxy类动态构造生成,即代码是由机器产生的,然后被加载到虚拟机,同时创建该类的对象.

JDK的动态代理只能支持接口的代理,而不能实现对类的代理,原因在于动态生成的代理类本身是继承至Proxy类,由于Java不支持多继承导致其不能再继承需要代理的类,因而无法实现对类的代理.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值