抽象类与接口
接口与抽象类
一、抽象类
说起抽象类,我们先说一下如何定义一个抽象方法。
abstract class Person {
public abstract void print();
}
class Women extends Person {
@Override
public void print() throws RuntimeException{
System.out.println("Women");
}
}
Person 类的 print 方法就是抽象方法,抽象方法用 abstract 修饰,没有方法体,直接以分号结束。
访问修饰符 abstract 返回值类型 方法名(参数列表);
**使用 abstract 修饰的类就是抽象类。**比如上面的 Person 就是抽象类。
**一个类如果包含一个或多个抽象方法,那么该类必须是抽象类。**如果我们尝试将 Person 类变为非抽象类,可以看到 idea 的错误提示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDKz5Vmk-1594129396595)(https://i.loli.net/2020/07/07/wlJfnq82TcmGuhM.jpg)]
抽象类可以包含具体数据和方法,也可以不包含抽象方法。
在 Person 类定义一个 name 属性,定义一个 printName 方法在控制台打印 name 值:
我们可以注释掉抽象方法 print,发现无报错:
抽象类不可以被实例化,但是抽象类可以定义对象变量,这个对象变量可以引用非抽象类的子类对象。
比如,这行代码就会报错:
Person p = new Person();
Person 是抽象类,抽象类无法实例化,我们可以使用对象变量 p 来引用 Women 类(Person 子类)的对象
Person p = new Women();
二、接口
在 Java 中,接口不是类,它是规范,所有实现接口的类都必须遵守其规范。接口使用 interface
定义
interface Demo {
}
我们需要记住接口中可以有什么,不可以有什么?
接口中可以定义常量,可以有方法,在 Java 8 之前,接口中的方法无法拥有具体实现,在 Java 8 可以用 default
修饰方法,就可以有具体的实现:
接口中的域会被自动设置为 public static final,所有方法会被自动设置为 public。
Java 8 之前,接口无法拥有静态方法,Java 8 之后,接口可以拥有静态方法。
interface Demo {
int A = 1;
default void print() {
System.out.println("这是一个接口");
}
}
接口不是类,所以不可以被实例化,但是可以定义对象变量,对象变量可以引用这个接口的实现类的对象,实现类需要使用 implement
关键字。
DemoImpl 是 Demo 的实现类,接口无法实例化,我们可以看到 idea 的报错提醒。
接口不能拥有实例域。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mK5JmcgV-1594129396605)(https://i.loli.net/2020/07/07/qB4oT6H7xAdF31b.jpg)]
三、抽象类与接口的区别与联系
- 抽象类是类,使用
class
定义,需要有 abstract
修饰,接口是使用 interface
定义。 - 在 Java 中,类只能单继承。接口可以多实现。
- 接口中的所有方法只能是 public,所有的变量都会被设置为 public static final,所以接口只能有常量,而抽象类中没有这个限制。
- 接口无法拥有实例域,抽象类可以拥有实例域。
- 在 Java 8 之前,接口中的方法无法有具体实现,在 Java 8 后可以。而抽象类中的非抽象方法可以拥有具体实现。
- 在 Java 8 之前,接口中不能有静态方法,Java 8 后可以。而抽象类可以有静态方法。
- 抽象类和接口都不能被实例化,但可以定义对象变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)