Thinking in Java——笔记(9)
Polymorphism
Abstract classes and methods
- If you have an abstract class, objects of that specific class almost always have no meaning.
- You create an abstract class when you want to manipulate a set of classes through its common interface.
- A class containing abstract methods is called an abstract class.
- It cannot safely create an object of an abstract class, so you get an error message from the compiler.
- If you inherit from an abstract class and you want to make objects of the new type, you must provide method definitions for all the abstract methods in the base class. If you don’t, then the derived class is also abstract.
- It’s possible to make a class abstract without including any abstract methods. you want to prevent any instances of that class.
- Making a class abstract doesn’t force you to make all the methods abstract.
- Abstract classes are also useful refactoring tolls, since they allow you to easily move common methods up the inheritance hierarchy.
Interfaces
- The abstract keyword allows you to create one or more undefined methods in a class.
- The interface keyword produces a completely abstract class, one that provides no implementation at all.
- The interface is used to establish a "protocol" between classes.
- It allows you to perform a variation of "multiple inheritance" by creating a class that can be upcast to more than one base type.
- An interface can also contain fields, but these are implicitly static and final.
- Once you’ve implemented an interface, that implementation becomes an ordinary class that can be extended in the regular way.
- When you implement an interface, the methods from the interface must be defined as public.
- It doesn’t matter if you are upcasting to a "regular" class, an abstract class, or to an interface.
Complete decoupling
- Creating a method that behaves differently depending on the argument object that you pass it is called the Strategy design pattern.
- The method contains the fixed part of the algorithm to be performed, and the Strategy contains the part that varies.
- In this approach to Adapter, the Adapter constructor takes the interface that you have, and produces an object that has the interface that you need.
“Multiple inheritance” in Java
- This act of combining multiple class interfaces is called multiple inheritance.
- In Java, you can perform the same act, but only one of the classes can have an implementation.
- If you do inherit from a non-interface, you can inherit from only one. All the rest of the base elements must be interfaces.
- You can upcast to each interface, because each interface is an independent type.
- When you combine a concrete class with interfaces this way, the concrete class must come first, then the interfaces.
- To prevent the client programmer from making an object of this class and to establish that it is only an interface.
- If it’s possible to create your base class without any method definitions or member variables, you should always prefer interfaces to abstract classes.
Extending an interface with inheritance
- Normally, you can use extends with only a single class, but extends can refer to multiple base interfaces when building a new interface.
Name collisions when combining Interfaces
- Using the same method names in different interfaces that are intended to be combined generally causes confusion in the readability of the code, as well.
Adapting to an interface
- You write a method that performs certain operations, and that method takes an interface that you also specify.
- It means that a method that takes an interface provides a way for any class to be adapted to work with that method.
Fields in interfaces
- Any fields you put into an interface are automatically static and final.
- Interface is a convenient tool for creating groups of constant values.
Initializing fields in interfaces
- Fields defined in interfaces cannot be "blank finals," but they can be initialized with non-constant expressions.
- Since the fields are static, they are initialized when the class is first loaded, which happens when any of the fields are accessed for the first time.
- The fields, of course, are not part of the interface. The values are stored in the static storage area for that interface.
Nesting interfaces
- Implementing a private interface is a way to force the definition of the methods in that interface without adding any type information.
- An interface nested within another interface is automatically public and cannot be made private.
- When you implement an interface, you are not required to implement any interfaces nested within.
- private interfaces cannot be implemented outside of their defining classes.
Interfaces and factories
- A typical way to produce objects that fit the interface is the Factory Method design pattern.
- Instead of calling a constructor directly, you call a creation method on a factory object which produces an implementation of the interface.
- In this way, in theory, your code is completely isolated from the implementation of the interface, thus making it possible to transparently swap one implementation for another.
- Why would you want to add this extra level of indirection? One common reason is to create a framework.
Summary
- Almost anytime you create a class, you could instead create an interface and a factory.
- Any abstraction should be motivated by a real need.
- An appropriate guideline is to prefer classes to interfaces.
- Start with classes, and if it becomes clear that interfaces are necessary, then refactor.
Thinking in Java——笔记(9)的更多相关文章
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- java笔记00-目录
--2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射:
- java笔记整理
Java 笔记整理 包含内容 Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...
- 转 Java笔记:Java内存模型
Java笔记:Java内存模型 2014.04.09 | Comments 1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记 ...
- servlet(6) - servlet总结 - 小易Java笔记
垂阅前必看: 这都是我总结的我觉得是学习servlet应该掌握的,我在学习期间也做了一个博客项目来让所学的知识得以巩固.下面就是博客项目链接.前面的servlet相关的笔记总汇,还有就是我把觉得在学习 ...
- Java笔记 —— 继承
Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...
- Java笔记 —— 方法重载和方法重写
Java笔记 -- 方法重载和方法重写 h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: red ...
- Java笔记 —— 初始化
Java笔记 -- 初始化 h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: red !impo ...
- Java笔记 —— this 关键字
Java笔记 -- this 关键字 h2{ color: #4ABCDE; } a{ color: blue; text-decoration: none; } a:hover{ color: re ...
- Java 笔记 —— java 和 javac
Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...
随机推荐
- 5分钟弄懂Docker--转载
编者按:7月3日的“CSDN在线培训:Docker之道”,同时在线人数达到了历史新高,但是最后的QA环节,笔者发现大家的问题 还是很初级的,Docker技术还处在Gartner技术曲线的萌芽期.刚好前 ...
- Python基础3- 变量与数字
1.Python变量不需要声明,其赋值操作既是变量声明和定义的过程;2.Python中每个变量在使用前都必须赋值,变量赋值后该变量才会被创建;3.Python变量是存储内存中的值,若变量赋值时内存中存 ...
- 请将 php.ini 中的 short_open_tag 设置为 On,否则无法继续安装。
安装的wamp套件,访问http://localhost/Discuz/install/index.PHP进行安装操作,提示 对不起,请将 php.ini 中的 short_open_tag 设置为 ...
- POJ3613 Cow Relays(矩阵快速幂)
题目大概要求从起点到终点恰好经过k条边的最短路. 离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778. 这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以 ...
- ural 1250. Sea Burial
1250. Sea Burial Time limit: 1.0 secondMemory limit: 64 MB There is Archipelago in the middle of a s ...
- POJ 1681 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1681 题目大意:一堆格子,或白或黄.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部变黄,最少需要改变 ...
- ACM:HDU 2199 Can you solve this equation? 解题报告 -二分、三分
Can you solve this equation? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Su ...
- 洛谷 P1341 无序字母对 Label:欧拉路 一笔画
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- DBLink创建 ORA-12154: TNS: 无法解析指定的连接标识符
因为对oracle不了解,这个问题可TM的搞了好久! 走的弯路: 1. 在客服端的PLSQL连接工具上折腾,而不是在服务器的PLSQL解决 2. 配置的tnsnames.org文件在环境变量path( ...
- 不同版本vpb与osg对应关系
不同版本vpb与osg对应关系 转自:http://blog.sina.com.cn/s/blog_668aae780101k6pr.html VirtualPlanetBuilder是一种地形数据库 ...