《Beginning Java 7》 - 7 - abstract class 抽象类 和 interface 接口
1. 抽象类:
为什么用抽象类:
一些 generic 的类本身并没有现实意义,所以不需要被实例化。比如动物,自然界没有动物这个物种,但却有无数的继承自动物的物种,那么动物本身可以是一个抽象类。
抽象类使用规则:
- 抽象类不可以被创建,不能有实例。
- 抽象类不可以是 final 的,因为 final 类不能被继承,那么抽象类就没任何意义了。
- 抽象类可以包含任意可见性的属性。
- 可以包含非抽象方法,但非抽象方法必须实现(必须有函数体)。
- 可以不包含抽象方法。
- 抽象方法只能声明,不能实现。
- 抽象方法在子类中必须被实现,除非子类本身也是抽象的。
- 抽象方法不可以是 private 的,而是 public 或 protected 的。
- 抽象方法不可以是 static 的。
2. 接口:
接口使用规则:
- 接口里的方法默认而且必须是 public abstract 的,只能声明,不可以实现,所以也不可以是 static 的。
- 接口被 implements 时,所有方法都必须被实现,并且改变可见性会报错(必须是 public 的)。
- 接口里可以声明属性,但必须初始化,因为接口属性默认而且必须是 public static final 的。
- 接口命名经常用 XXXable,比如 Adjustable, Callable, Comparable, Cloneable, Iterable, Runnable, 和 Serializable.
- 接口和类一样默认是 friendly 的,只能在同一个包中使用。所以常常需要声明为 public 的。
- 接口可以声明为 abstract 的,但由于它本来就是 abstract 的,所以没有任何意义。
- 接口里可以什么都不写,这样的接口叫 marker interface 标记接口 或 tagged interface 标签接口。比如 Cloneable。
- 接口和继承类似的一点是,可以把一个实现了某接口的类的实例强制转换为此接口的类型。比如 Thread 实现了 Runnable,所以 Thread 可以被强制转换成 Runnable 类型。
Thread t = new Thread();
Runnable r = (Runnable) t; - 接口可以多重继承。我们都知道一个类可以实现多个接口,但和类不同的一点是,一个接口可以继承多个接口。
interface A{}
interface B{}
interface C extends A,B {}这是没有问题的。
什么情况下使用接口:
使用接口可以提高编码的灵活性,便于协作,修改和测试。接口用来赋予一种新的能力。比如我们有一些图形的类,长方形,圆形,三角形。我们想给他们添加一个方法,叫 draw() ,用来画出图形。此时我们就可以让这些图形 implements 一个 interface,我们可以取名叫 Drawable,里面声明一个 draw() 方法,这样所有图形都能画了。
3. 接口和抽象类有哪些区别和联系:
联系:
- 接口是一种特殊的抽象类。两者都不能被创建(实例化)。
- 接口和抽象类可以混合使用(比如抽象类可以实现一个接口,但接口不能继承一个抽象类)。
- 接口和抽象类的抽象方法都不可以是 static 的,因为抽象方法只有声明没有实现,不能被调用。
区别:
- 抽象类的属性可以是任意可见性的,但接口的属性只能是 public static final 的。
- 抽象类里面可以有非抽象方法(有实现),但接口里面只能包含抽象方法(只有声明)。
- 抽象类的方法可以是 默认 friendly, public 或 protected 的,但不能是 private 的。接口的方法只能是 public abstract 的。
- 抽象类和普通类一样,不支持多重继承。而接口可以多重继承。
- 抽象类是继承关系,是 is a 的关系。比如大象是动物。而接口只是赋予能力。一个经典案例是,我们定义一个门,门是可以开和关的。那么我们可以有:
abstract class Door {
abstract void open();
abstract void close();
} interface Door {
void open();
void close();
}看起来并无太大区别,至少都能用。但我们如果想让门加上报警功能变成报警门呢。我们考虑三种方案:门和报警器都是抽象类,都是接口,或一个抽象类一个接口。应该如何设计呢?第一个方案马上就抛弃了,因为多重继承是不可能的。第二种方案不能够准确形象的表达报警门和门和报警器直接的关系。所以正确的方式是,报警门是门的一种,所以门是抽象类,报警门继承门并实现报警器接口。
abstract class Door{
abstract void open();
abstract void close();
}
interface Alarm{
void alarm();
}
class Alarm Door extends Door implements Alarm{
void open(){…}
void close(){…}
void alarm(){…}
}
《Beginning Java 7》 - 7 - abstract class 抽象类 和 interface 接口的更多相关文章
- Java abstract 抽象类 和interface接口的异同点
abstract 抽象类 和interface接口的异同点 相同点: 抽象类和接口都不能实例化,他们都位于继承树顶端,被其他类实现和继承 都可以包含抽象方法,实现接口或者继承抽象类的非抽象类(普通类) ...
- abstract抽象类和interface接口
一.抽象类 1.抽象类不能实例化,因为有抽象方法未实现 2.可以被抽象类或非抽象类继承 3.但不是只能被继承,还可以直接拿来使用的,当然,这个使用是拿来声明,反例如下: public abstract ...
- 抽象类,interface接口,接口和继承的区别
一.抽象类 需要抽象类的原因:父类方法不确定性的问题.考虑将该方法设计为抽象(abstract)方法所谓抽象方法就是没有实现的方法.所谓没有实现就是指,没有方法体.当一个类中存在抽象方法时,需要将该类 ...
- PHP 抽象类 和 interface 接口
静态: 在类里面 定义的变量 在别的地方引用的时候 只要是 静态引用 就一定要加$ 普通成员 : 属于对象的 静态成员: 属于类的 static (通过双冒号调用) 调用静态成员: re ...
- JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别
abstract修饰符可以修饰类和方法. (1)abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型(见后面实例),也就是编译时类型.抽象类就相当于 ...
- JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展
JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...
- Java abstract关键字 抽象类 抽象方法
用 abstract 修饰的类是抽象类,它不能生成对象 含有抽象方法的类称为抽象类 抽象方法使用 abstract 修饰 抽象类不能直接实例化,只能由子类实例化 举例 abstract class T ...
- Java面向对象 第5节 抽象类和接口
一.抽象类和抽象方法 区分抽象方法和普通方法1)当一个方法被abstract修饰时,该方法成为抽象方法2)抽象类所在的类必须定义为抽象类3)抽象方法不会有具体的实现,而是在抽象类的子类中通过方法重写进 ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
随机推荐
- Dubbo限制大数据传输的解决方案
当service层向web层传输大数据容量的对象时,会受到Dubbo的限制,报类似如下异常: com.alibaba.dubbo.remoting.transport.AbstractCodec.ch ...
- Linux 入门知识一(附上如何解决Ubuntu的root密码问题)
.centos有拥有七个控制台,其中第一到第六个是字符界面,第七个是图形界面 切换的快捷键是ctrl+shift+fn(n为自然数) 输入tty的话,可以检查当前处于哪个控制台 如何在cent ...
- Elasticsearch-PHP 索引操作
索引操作 本节通过客户端来介绍一下索引API的各种操作.索引操作包含任何管理索引本身(例如,创建索引,删除索引,更改映射等等). 我们通过一些常见的操作的代码片段来介绍,然后在表格中列出剩下的方法.R ...
- windows版mongodb不知道安装在哪儿
情景还原: 从官网:点击打开链接 下载了 MongoDB-win32-x86_64-2.6.12-signed.msi文件后, 右键安装,各种Next后,没有选择路径,就安装结束了!! 任务管理器里面 ...
- spring与IOC,ioc与di的关系
- MySQL数据库篇之表的增删改查
主要内容: 一.表介绍 二.创建表 三.查看表结构 四.修改表结构 五.复制表 六.删除表 1️⃣ 表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称 ...
- 手动为 Team Foundation Server 安装 SQL Server
本主题中的步骤适用于安装 SQL Server 2012 企业版,你也可以使用安装标准版的相同步骤. 适用于 SQL 2014 的步骤与以上步骤也非常相似. 我们将在 TFS 所在的同一服务器上安装 ...
- 通过args数组获取数据
----------siwuxie095 通过 main 方法的 args数组 可以从控制台获取一组字符串数据 如: package com.s ...
- xdebug 一直报错 upstream timed out (110: Connection timed out) while reading response header from upstream
本地主机(Windows环境192.168.66.1)访问虚拟机(192.168.66.139)里面的搭建的php环境(系统centos6.5版本,php版本是5.5.30 ,xdebug 2.4.0 ...
- Maven详解【面试+工作】 各种安装 没用
1 Maven介绍1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目组加入 ...