Java学习------抽象类和接口
1. 抽象类
1.1 概念
在Java开发的时候,如果类中的方法无法实现或者没有意义,此时就需要将该方法定义为抽象方法,与此同时,该类也就要定义为抽象类。这样只需要在当前类中提供一个公共代码即可,至于这个方法的具体实现,就交由子类去实现。比如现在有一个动物类Animal,该类中有一个eat()的方法,显然对于不同种类的动物来说,吃这个行为肯定是不一样的,最简单的种类来说,就是食草动物和食肉动物。这个时候,没有办法在类中的方法里去实现,因此只能将eat()的实现交由具体的子类。
1.2 语法
//抽象类
abstract class 类名{
//抽象方法
abstract 方法返回值类型 方法名(形参);
}
/**例子:动物类中的eat()方法对于不同种类的动物来说,有着不同的实现,所以需要将eat()定义为抽象方法,
* 与此同时,Animal也要加上、abstract进行修饰,变为抽象类。
*/
abstract class Animal {
abstract void eat();
}
//狗在继承了Animal这个抽象类之后,就必须要对里面的eat()方法进行实现
class Dog extends Animal {
@Override
void eat() {
System.out.println("狗吃骨头");
}
}
//同样的,猫在继承了Animal这个抽象类之后,也必须要对里面的eat()方法进行实现
class Cat extends Animal {
@Override
void eat() {
System.out.println("猫吃鱼");
}
}
1.3 注意点
- 抽象类有构造方法,但是无法实例化,抽象类中的构造方法是给子类使用的
- 抽象类中不一定非要有抽象方法,但是如果有了抽象方法,那么这个类就一定为抽象类
- 一个非抽象的类继承了抽象类,就必须要对抽象方法进行重写,如果不重写,就会编译报错,除非给这个类再加上abstract,将这个类也变为抽象类,但是一般不这么做
- abstract关键词不可以与private、final、static这些关键字一起使用,本质原因都是因为abstract修饰的方法要重写,如果加上了后面的这些关键字,就无法在子类中得到重写
2. 接口
2.1 概念
在Java中,接口表示一种规范,它定义了一组抽象方法和常量,来描述如果一个类要实现这个接口,需要具有哪些行为和属性。为什么要使用接口呢?在软件开发时,我们要符合软件开发的OCP原则,对扩展开放,对修改关闭,要在不修改原代码的情况下,添加新的代码来实现功能的扩展。因此我们需要使用接口来降低程序的耦合度,提高程序的扩展力。
例如我们的电脑,如果是一个整体,那么当我们要更换里面的一些部件时,就需要将电脑拆开,然后进行更换,这样做不仅麻烦,而且万一出现操作失误,整个电脑也就报废了。所以电脑在设计时,就给了我们很多的USB接口,当我们想更换鼠标或者键盘这些外设时,只需要拔下来,然后将新的鼠标键盘插到USB接口即可。这样不仅不用承担弄坏电脑的风险,而且还能快速地进行更换。
2.2 语法
//接口语法
[修饰符列表] interface 接口名{}
//就以上面举的Usb接口为例,这里创建一个Usb的接口
public interface Usb {
void open();
void close();
}
//然后在定义一个鼠标类实现这个接口,实现的同时,也必须实现Usb接口中的方法
class Mouse implements Usb {
@Override
public void open() {
System.out.println("鼠标连接");
}
@Override
public void close() {
System.out.println("鼠标断开");
}
}
//然后在定义一个键盘类实现这个接口,实现的同时,也必须实现Usb接口中的方法
class Keyboard implements Usb {
@Override
public void open() {
System.out.println("键盘连接");
}
@Override
public void close() {
System.out.println("键盘断开");
}
}
2.3 注意点
- 接口是完全抽象的。接口没有构造方法,也无法实例化。
- 接口中只能定义:常量+抽象方法。接口中的常量的static final可以省略。
- 接口和接口之间可以多继承。
- 类和接口的关系叫做实现,使用implements关键字进行接口的实现。
- 一个非抽象的类实现接口必须将接口中所有的抽象方法全部实现。
- 一个类可以实现多个接口。
- Java8之后,接口中允许出现默认方法和静态方法。
- JDK9之后允许接口中定义私有的实例方法(为默认方法服务的)和私有的静态方法(为静态方法服务的)。
- 所有的接口隐式的继承Object。因此接口也可以调用Object类的相关方法。
3. 抽象类和接口的区别和联系
3.1 联系
- 两者都不能被实例化
- 两者都含有抽象方法
3.2 区别
- 设计目的:抽象类主要强调代码的复用,接口主要强调对类的行为进行约束
- 实现方式:一个类只能继承一个抽象类,一个类可以实现多个接口,并且一个接口还可以继承多个接口
- 访问修饰符:抽象类被abstract修饰,所以不能再被private、static、synchronized修饰,接口中的成员变量默认被public static final修饰,必须赋初始值且不能修改,接口中的方法可以被default、static、private修饰。
- 变量:抽象类中可以包含实例变量和静态变量,接口只能包含静态常量。