1.抽象类
在面向对象的概念中,所有的对象都是通过类进行描绘的,但是,并不是所有的类都是用来描绘对象的。如果在一个类中没有包含足够的信息描绘一个具体的对象,这样的类就是抽象类。
1.抽象类和抽象方法
- 什么是抽象类呢?顾名思义,抽象类就是抽象的类,抽象往往是相对于具体而言的。一般来说,具体类有直接对应的对象,而抽象类没有,它往往表现的是抽象的概念。例如,一只猫是具体对象,而猫科动物则是抽象概念;玉米是具体对象,而作物则是抽象概念。
- 在java中,当一个类被abstract关键字修饰时,该类被称为抽象类。定义一个抽象类的语法格式如下:
- <访问修饰符> abstract class <类名>{}
- abstract关键字表示该类被定义为抽象类。
- 抽象类与普通类的最大区别就是:普通类可以被实例化,而抽象类不能被实例化。
2.抽象方法
在java中,当一个类的方法被abstract关键字修饰时,该方法被称为抽象方法。抽象方法所在类必须是抽象类。
一个方法被定义为抽象方法,意味着该方法不会有具体的实现,而抽象类的子类中通过方法重写实现。定义抽象方法的语法如下:
[访问修饰符] abstract<返回类型> <方法名> ([参数列表]);
abstract关键字表示该方法被定义为抽象方法。
抽象方法与普通方法最大的区别是:普通方法有方法体,而抽象方法没有方法体。
观察下面的代码,判断它们是否为抽象方法。
public void print(){}
public abstract void print();
在以上代码中,代码第一行不是抽象类,而是有实现但实现为空的普通方法,代码第二行为抽象类方法,切记不要忘记语句最后的分号。这里,abstract关键字可以用来修饰类和方法,但不能用来修饰属性和构造方法。
2.final修饰符
在前面的学习中,大家已经对final修饰符有了一定的认识。final是java的关键字,表示“最后”、最终的、不可变的。使用final修饰符的变量,只能进行一次赋值操作,并且在整个程序的生命周期中它的值都不可改变,被称为"常量"。final修饰符除了可以定义常量,还可以用来修饰类和类的方法。
用final修饰的类不能再被继承。
public final class Ssk(){}
class prsy extends Ssk(){}
3.接口
1.为什么需要接口
在某些应用抽象类具有一定的局限性。
2.初识接口
- 生活中的接口就是一套规范,满足这个规范的设备就可以组装到一起。大家熟悉的计算机,主板上的周边元件扩展接口(Peripheral Component Interconnection,PCI)插槽就可以被理解为接口,它有统一的标准,规定了尺寸,排线等。主板厂商和各种卡的厂家都遵守了这个统一的接口规范,因此,声卡、显卡、网卡尽管内部结构和功能都不一样,但是都可以插在PCI插槽上正常工作。
- 在java中接口的作用和生活中的接口类似,它是一种规范和标准,可以约束类的行为,使实现接口的类(或结构)在形式上保持一致。
- 接口是一些方法特征的集合,从这个角度来讲,接口可以被看作一种特殊的“抽象类”,但是采用与抽象类完全不同的语法来表示,两者的设计理念也不同。抽象类利于代码复用,接口利于代码的扩展和维护。
3.定义和实现接口
理解了接口的概念和应用场景后,究竟如何将接口应用于程序开发呢?
1.定义 一个简单的接口
- JDK1.8版本与之前的版本相比,接口的功能更加强大灵活。下面将以JDK1.8版本为基础讲解如何定义一个接口。
- 简单地说,接口是一个不能实例化的类型接口类型的定义语法格式如下:
- [访问修饰符] interface接口名{ 接口成员 }
- 类实现接口的语法格式如下:
- class 类名 implements 接口名{ 类在员 }
- 从JDK1.8开始,接口允许有默认方法和静态方法,其主要的是,允许开发人员在新的方法添加到已有接口时无需改动已经实施该接口的所有实现类,这也就是我们所说的向后兼容。
2.接口的应用
接口定义了一种协议和规范,使类可以以某种规范的形式与其他外部类进行交互。例如,PCI、通用串行总线(Universal Serial Bus, USB) 接口,实现这些接口的设备就可以按照统一的行为与其他设备进行交互。
3.面向对象设计原则
- 摘取代码中变化的部分,形成接口
- 多用组合,少用继承
- 面向接口编程,不依赖于具体实现
- 针对扩展开放,针对改变关闭