第10章 接口、继承与多态----抽象类和接口
一、抽象类
在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。回想继承和多态原理,继承树中越是在上方的类越抽象,如:鸽子类继承鸟类、鸟类继承动物类等。在多态机制中,并不需要将父类初始化对象,我们需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化对象,因为图形类不能抽象出任何一种具体图像,但它的子类却可以。
抽象类的语法如下:使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法,抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承之外没有任何意义。
只要类中有一个抽象方法,此类就被标记为抽象类。
public abstract class Test{abstract void testAbstract(); //定义抽象方法 }
从图中可以看出,继承抽象类的所有子类需要将抽象类中的抽象方法进行覆盖。
这样在多态机制中,就可以将父类定义为抽象类,将draw()方法设置为抽象方法,然后每个子类都重写这个方法来处理。
但这会导致程序中会有太多冗余的代码,同时这样的父类局限性很大,也许某个不需要draw()方法的子类也不得不重写draw()方法。
如果将draw方法放置在另外一个类(下面介绍的接口)中,这样让那些需要draw()方法的类继承该类,而不需要draw()方法的类继承图形类,但所有的子类都需要图形类,因为这些类是从图形类中被导出的,同时某些类还需要draw()方法,但是在Java中规定,类不能继承多个父类,面临这种问题,接口的概念便出现了。
二、接口
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中所有方法都没有方法体。上面遇到的问题,可以将draw()方法封装到一个接口中,使需要draw()方法的类实现这个接口,同时也继承图形类,这就是接口存在的必要性。
接口使用interface关键字进行定义,其语法如下:
public interface drawTest{void draw();//接口内的方法,省略abstract关键字 }备注:在接口中定义方法必须被定义public或abstract形式,其他修饰权限不被Java编译器认可,即使不讲该方法声明为public形式,它也是public 在接口中定义的任何字段都自动是static和final的
一个类实现一个接口可以使用implements关键字,代码如下:
public class Parallelogram extends Quadrangle implements drawTest{ ...// }
interface drawTest{//定义接口 public void draw();//定义方法 } //定义平行四边形类,该类继承了四边形类,并实现了drawTest接口 class ParallelogramgleUseInterface extends QuadrangleUseInterfaceimplements drawTest{public void draw(){//由于该类实现了接口,所以需要覆盖draw()方法System.out.println("平行四边形.draw()");} void doAnything(){//覆盖父类方法 } } class SquareUseInterface extends QuadrangleUseInterface implements drawTest{ public void draw(){System.out.println("正方形.draw()");} void doAnything(){ } } class AnythingUseInterface extends QuadrangleUseInterface{void doAnything(){ } } public class QuadrangleUseInterface {//定义四边形类void doAnything(){ }public static void main(String[] args){drawTest[] d={ //接口也可以进行向上转型操作new SquareUseInterface(), new ParallelogramgleUseInterface()};for(int i=0;i<d.length;i++){d[i].draw();//调用draw()方法 }} }
运行结果如图:
分析:在本实例中,平行四边形类与正方形类分别实现了drawTest接口并继承了四边形类,所以需要覆盖接口中的方法。在调用draw()方法时,首先将平行四边形类对象与正方形类对象向上转型为drawTest接口形式。
在Java中无论是将一个类向上转型为父类对象,还是向上转型为抽象父类对象,或者向上转型为该类接口,都是没问题的。
然后使用d[i]数组中的每一个对象调用draw(),由于向上转型,所以d[i]数组中的每一个对象分别代表正方形类对象与平行四边形类对象,最后结果分别调用正方形类与平行四边形类中覆盖的draw()方法。
三、接口与继承
在Java中不允许多重继承,但使用接口就可以实现多重继承,因为一个类可以同时实现多个接口,这样可以将所有需要继承的接口放置在implements关键字后并使用逗号隔开,但这可能会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有方法。多重继承的语法如下:
class 类名 implements 接口1,接口2,...,接口n
注释:一个接口可以继承另一个接口
interface inf1{ } interface inf2 extends inf1{ }
第10章 接口、继承与多态----抽象类和接口相关推荐
- Java11-day02【多态(成员访问、多态转型、内存图解)、抽象类(成员特点)、接口(成员特点)、类和接口的关系、抽象类和接口的区别、综合案例】
视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java ...
- 9继承进阶_抽象类_接口
9继承进阶_抽象类_接口 导语: 想到在写 子父类中成员变量的特点 子父类中成员函数的特点.★★★★★ 子父类中构造函数的特点.★★★★★ final关键字的使用,重点在于常量的定义 抽象类的由来,犬 ...
- 初始Java Java SE 包,继承,组合,多态,抽象类,接口
目录 包 1.静态导入 2.将类放到包中 3.包的访问权限控制 继承 基本语法: 注意事项: protected 关键字 final 关键字 组合 多态 向上转型: 动态绑定 方法重写 重写的规则 : ...
- JAVA 继承基本类、抽象类、接口
Java是一个面向对象的语言,java面向对象一般有三大特征:封装.继承.多态. 封装:就是把一些属性和方法封装到一个类里. 继承:就如子类继承父类的一些属性和方法. 多态:就如一个父类有多个不同特色 ...
- java继承和接口的优缺点_Java抽象类和接口的优缺点---总结-2
51Testing软件测试网[P/WX?\ 解决方案二:~+j;Hw/U1{@4g0 A^9@5]p7j:Rys0既然open.close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定 ...
- php 抽象类 接口 区别,PHP中抽象类、接口的区别与选择分析
本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过 ...
- php接口调用实例化,PHP抽象类和接口用法实例详解
本文实例讲述了PHP抽象类和接口用法.分享给大家供大家参考,具体如下: 前言 对于oop,估计大多数人并不陌生.有些人除PHP外也学习不少其他语言,会发现php的不同之处,可能语法极其丑陋,但并不妨碍 ...
- java中抽象类 接口_java中的抽象类与接口
1.抽象类的定义 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 2.简单实例 ...
- php 抽象类 接口 区别,PHP中抽象类和接口有什么区别
PHP中抽象类和接口有什么区别 发布时间:2021-02-18 15:02:14 来源:亿速云 阅读:70 作者:Leah 这篇文章将为大家详细讲解有关PHP中抽象类和接口有什么区别,文章内容质量较高 ...
最新文章
- CSU OJ1960
- HK Openstack Summit 归来有感
- android adb 联系人,使用adb命令向Android模拟器中导入通讯录联系人的方法
- 【数据结构与算法】之深入解析“填充每个节点的下一个右侧节点指针”的求解思路与算法示例
- 初涉网络流 POJ 1459 Power Network
- php同学录网站设计_基于PHP的校友录系统的设计与实现
- ArcGIS Maritime Server 开发教程(二)ArcGIS 海图软件系列
- 2021年太原理工大学程序设计竞赛等获奖总结
- UVA11349 Symmetric Matrix【数学】
- 调用 Windows 7 中英文混合朗读
- 找到多个与名为“Login”的控制器匹配的类型
- 用DISKGEN恢复硬盘数据
- su vary注册机_vray for sketchup2018下载
- QQ扫码登录实现与原理
- 国内最火的10款Java开源项目,都是国人开发,CMS居多
- 图像梯度-scharr算子
- Apache Tomcat安全漏洞列表及整改建议合集
- Mockito之使用Answer
- 字符串题目:重新排列字符串
- SEO优化要以“大局为重”