在【第25条】中已经讲过“应该使用接口,而不是类作为参数的类型”。更进一步地讲,应该优先使用接口而不是类来引用对象。也就是说,当我们在考虑引入一个引用变量的时候,应该首先考虑的是,我们需要一个具有什么样功能的变量,也就是选择一个什么接口。之后才是在众多的实现类中选择一个合适的实现进行初始化。
// Interface object = new Class();
Map myTable = new Hashtable();
如果你养成了使用接口作为类型的习惯,那么你的程序将会更加灵活。
如果没有合适的接口存在的话,那么,用类而不是接口来引用一个对象,是完全合适的。在写本条笔记之前,我也曾在论坛上发过两个帖子讨论类似的问题。一个案例是,我的一个应用中,需要一个 key—value 对的数据类型,并需要能够得到当前所有的 keys 和所有的 values,甚至为了“保护性拷贝”(参考【第24条】)时还需要 clone 之。
然而 Map 接口,可能并不能完全满足我的需求, values() 方法来自Map接口,而 keys() 方法来自Dictionary抽象类,clone() 方法则当然来自Cloneable接口。所以,没有一个合适的接口的时候,我只有使用 Hashtable 类了。
public class Hashtable extends Dictionary implements Map, Cloneable, ...
具体讨论贴:http://www.iteye.com/topic/392921
另外一个帖子,是关于接口与抽象骨架实现类及其子类的关系的:http://www.iteye.com/topic/385733
【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208
分享到:
相关推荐
第34条 用组合代替继承 58 第35条 避免从并非要设计成基类的类中继承 60 第36条 优先提供抽象接口 62 第37条 公用继承即可替换性。继承,不是为了重用,而是为了被重用 64 第38条 实施安全的覆盖 66 ...
34 接口的应用(面向对象分析) 49 34.1 案例(第一版,使用接口) 50 34.2 案例(第二版) 52 35面向对象设计原则 54 1、找出应用中可能需求变化的代码,把它们独立出来,不要和那些需求不变化的的代码混在一起 54 ...
第三章 * 选择题: + Java的构造方法是指在创建对象时被调用的方法。 + Java的this关键字是指当前对象的引用。 * 填空题: + 构造方法是用来初始化对象的状态的。 + this关键字是指当前对象的引用。 第四章 *...
三、类与对象的创建 1. 类定义:使用class关键字,包含属性(变量)和方法(函数)。 2. 对象创建:使用new关键字调用构造器实例化对象。 3. 构造器重载:为创建不同初始状态的对象,可以提供多个构造器,参数不同。...
#### 十四、Java文档注释 Java文档注释(Javadoc)是一种特殊的注释格式,使用`/** */`来标记。这些注释可以被工具提取出来生成API文档。 #### 十五、类的继承 继承是面向对象程序设计中的一个重要特性,它允许一...
十、面向对象编程的优点 面向对象编程的优点包括便于程序模拟现实世界中的实体、隐藏细节、对象的行为和属性被封装在类中、可重用等。 十一、数据类型 数据类型包括基本数据类型和引用数据类型。基本数据类型没有...
在《面向对象技术与方法》这门课程中,第十四讲主要讲述了面向对象编程中一个重要概念——对象容器。对象容器作为面向对象编程的一个核心部分,不仅在理论上具有重要意义,而且在实际应用中也非常广泛。本篇文章将...
第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这...
第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这...
第三章 单目和双目操作符 第四章 语句和声明 第五章 模式匹配 第六章 子过程 第七章 格式 第八章 引用 第九章 数据结构 第十章 包 第十一章 模块 第十二章 对象(上) 第十二章 对象(下) 第十三章 重载 第...
Java 面向对象编程基础知识点总结 Java 面向对象编程是 Java 语言的核心内容,本文将对 Java 面向对象编程的基础知识点进行总结和归纳。 一、类和对象的概念 * 类是对象的模板,定义了对象的属性和行为。 * 对象...
#### 第三章:字符串 **知识点概述**: 1. **字符串创建与操作**:字符串是不可变的对象,通过`String`类来创建和操作。 2. **字符串比较**:使用`equals`方法进行内容比较;`==`用于比较引用是否相等。 3. **字符...
例如,第三题中展示了如何通过指针调用成员函数来改变对象的状态。正确答案是C,`ptr->setn(34)`,因为`ptr`是一个指向`A`类对象的指针,`->`运算符用于调用指针指向的对象的成员函数。 动态内存分配在C++中是通过`...
面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化...
#### 第三章:原子操作(Atoms) - **主题**: - 接口: 介绍了原子操作的接口设计。 - 实现: 详细说明了原子操作的具体实现方式。 #### 第四章:异常处理与断言 - **主题**: - 接口: 描述了异常处理和断言的接口...
个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也称对象引用 为对象。 6.如何去使用对象中的成员 上面看到PHP 对象中的成员有两种一种是成员属性,一种是成员方法。对象我们以经可以...
2. **Composite(组合)**:实现了Component接口,并且持有对其他Component对象的引用,负责管理和维护这些子组件。它提供了一种方式来增加、删除或遍历子组件。 3. **Leaf(叶子)**:代表组合中的基本元素,没有子...
Spring.NET是一个应用程序框架...第三十二章. Java开发人员必读 32.1.简介 32.2.Beans和Objects 32.3.PropertyEditor和TypeConverter 32.4.ResourceBundle和ResourceManager 32.5.异常 32.6.应用程序配置 32.7.AOP框架