Core Java Volume I 读书笔记---第六章 接口与内部类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyaohuqijun/article/details/78061521

第六章: 接口与内部类

 

6.1接口

 

接口不是类,是对类的一组需求描述

public interfaceComparable

{

                int compareTo(Objecto);

}

 

类声明实现某个接口, 使用关键字implements:

class Employee implements Comparable

然后类需要实现接口中声明的方法

 

接口中不能包含实例域或者静态方法, 只能有普通方法和常量。 接口中的方法自动的被设置为public, 接口中的域自动被设置为public static final.

 

不能构造接口的对象, 却能声明接口的变量, 接口变量必须引用实现了该接口的类对象:

Comparable<Employee> x= new Employee();

 

 

接口与抽象类:

接口实现的特性都可以通过抽象类来实现,为什么还需要接口?

Java 中每个类只能扩展一个类,  却可以实现多个接口, 间接的实现了C++ 多重继承 特性。


局部内部类:  在一个方法中定义局部类

局部类不仅能访问包含它们的外部类, 还可以访问局部变量, 不过局部变量必须被声明为final.



6.2对象克隆

 

拷贝变量, 原始变量和拷贝变量引用同一个对象,  并没有产生新的对象,  这时操作一个变量将会对另一个变量产生影响。

 

clone 方法创建一个对象的新的copy, 最初状态和original 一样,  以后可以各自改变各自的状态。

 

clone 方法也是Object类的方法:

protected native Object clone()throwsCloneNotSupportedException;

 

clone 方法是Native方法,  大致实现是对各个域进行对应的拷贝

(clone方法实际进行的是内存拷贝,  参考http://www.cnblogs.com/zuoxiaolong/p/pattern24.html中相关内容)

如果数据域是数值或者基本类型, copy 对象和original对象是独立的;  如果数据域是对象的引用,  则拷贝的结果会是两个域引用同一个对象,  原始对象与克隆对象共享这部分信息。 这被称为“浅拷贝“。

浅拷贝: 拷贝对象时仅拷贝对象本身(基本类型, 对象变量)而不拷贝对象包含的引用指向的对象

Object.clone 方法是浅拷贝。

 

深拷贝: 不仅拷贝对象自身, 同时拷贝对象包含的引用指向的对象。 深拷贝得到的对象和原来的对象完全是独立的。

 

实现深拷贝clone 方法:

1.      调用父类clone 方法  super.clone(最终调用Objec.clone 完成浅拷贝)

2.      对类中的引用类型进行单独的clone

 

 

要使用clone 方法, 必须实现Cloneable 接口, 否则会抛出CloneNot-SupportException异常。 clone 方法从Object 继承而来,  这里仅做一个标记。  标记接口没有方法, 使用它的唯一目的是可以用instanceof进行类型检查。

 

 

6.3 接口与回调

 

回调是一种常见的程序设计模式, 可以指出在某个特定事件发生时应该采取的动作。

 

C/C++ 中中回调的实现是把函数指针作为参数。

Java 中使用接口变量来实现回调

 

PS. Java 中有函数指针的对应物---Method对象, 不过反射使用起来比较麻烦,速度也稍慢, 编译时不能提供类型的安全性检查。 因此在任何使用C++函数指针的地址, 都应该考虑使用Java中的接口

 

6.4 内部类

 

内部类(innerclass)是定义在一个类中类。

 

使用内部类的主要场景:

1.      内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据

内部类可以访问外部类的私有数据

2.      内部类可以对同一包中的其他类隐藏起来

3.      定义回调函数会使用匿名内部类

 

内部类即可以访问自身的数据域,也可以访问创建它的外围类对象的数据域。

内部类的对象总有一个隐式引用,指向创建它的外部类对象。

 

 

内部类是一种编译器现象,与虚拟机无关。

 

如果一个类只会创建一个对象,就不必命名了,这种类称为匿名内部类

 

静态内部类没有对生成它的外围类对象的引用特权,  在内部类不需要访问外围对象时,应该使用静态内部类。

 

 

6.5 代理

 

利用代理(Proxy)在运行时创建一个实现了一组给定接口的新类。

 

代理是一种比较复杂的高级技术,这里不展开, 使用到时再仔细学习。



6.6 总结

 

 OOP 的核心就是自定义类型的能力, 继承也是为这一目的服务(通过扩展已有类来实现新的类),  多态随着继承自然而然的到来。

继承总让我想起生物学中基因的基础, 所以我对Java/C++等目前我了解的语言的基础特性总是不满意:  子类只能继承父类的属性,增加自己独特的属性, 继承或者改变父类的行为。   

设想一种和生物学中基因继承类似的继承特性:  子类能选择继承或不继承父类的某些属性和行为,只要保证总的属性和方法不必父类的少。  这样的特性应该是非常有趣的!




没有更多推荐了,返回首页