● 咖啡是Java程序员的最佳燃料,但写出的稳定代码,才是让你能安心喝咖啡的底气。
● 程序界的成功秘诀:复制、粘贴,以及能正确理解你复制粘贴的代码。

一、抽象类

1.1 抽象方法

在我们理解抽象类之前我们要先了解抽象方法。
首先,我们学过继承与多态,当我们有一个父类 Animal 和两个子类 CatDog,子类都继承了父类,他们都定义了各自的 eat 方法,而当我们 new 一个 Cat 实例时,调用 eat 方法,调用的是子类自己的 eat 方法。

那我们说既然 父类 Animal 的 eat 方法不会被调用,那我们可不可以不具体实现它呢?

这是就要说到抽象方法了,抽象方法就是在父类声明这个方法,但是不具体实现这个方法

public abstract void eat();

而具体的实现交给继承了这个父类的子类进行实现。

1.2 抽象类的定义

抽象类可以说是专门用来继承的,抽象类内部只实现部分逻辑,而很大一部分声明的抽象方法,这些抽象方法就是交给子类来进行实现的。
我认为抽象类是一个模板,它约束了它的子类,必须实现它所声明的抽象方法。

继续延用 AnimalCatDog的例子,

public abstract class Animal {
    public abstract void eat();
}

这就是最简单的抽象类的语法,而如果一个类带有 abstract 关键字修饰的抽象方法,那它就是一个抽象类,在 class 前也要用 abstract 修饰,证明这是一个抽象类。

1.3 抽象类的使用

abstract 所修饰的抽象类不能实例化,因为 Animal 类中的抽象方法只是被声明了并没有被实现,所以不允许方法没有实现的类被实例化。
在这里插入图片描述

继承了 Animal 类的子类需要实现 Animal 类的抽象方法

在这里插入图片描述

如果不想实现 Animal 类的抽象方法,那就必须也是一个抽象类

public abstract class Cat extends Animal {
	//未实现 eat 方法
}

这时 Cat 类就是 Animal 类的子类,不过这个子类也是一个抽象类,它将 eat 方法传递给继承 Cat 类的类去实现。

抽象类不能被privatestaticfinal 修饰,因为抽象方法是要交给子类重写的

添加 private 时:
在这里插入图片描述

添加staticfinal 时:

在这里插入图片描述

1.4 抽象类总结

● 被 abstract 所修饰的抽象类不能实例化
● 继承了 Animal 类的子类,需要实现 Animal 类的抽象方法
● 如果不想实现 Animal 类的抽象方法,那就必须也是一个抽象类
● 抽象类不能被privatestaticfinal 修饰
● 抽象类中不⼀定包含抽象方法,但是有抽象方法的类一定是抽象类

说到底抽象类就是一个is - a的关系,继承了父类的类都要按照父类所规定的基本模板进行实现,可以说是对子类的一种约束。当然子类也可以定义自己的方法。

二、接口

2.1 接口的定义

如果说抽象类是 is - a 那接口就是 has - a 接口定义了行为规范,而 implement 了一个接口就要实现这个接口定义的行为规范也就是接口定义的抽象方法。

抽象类决定了其子类的基本框架,而接口相当于拓展了这个类的功能,这个子类不仅可以使用父类所提供的方法,也要实现接口定义的方法。

如下:

public interface Flying {
    //这就是一个接口
    void fly();
}

这个类就是一个接口,它定义类一种行为,也就是 fly 这个方法。

2.2 接口的使用

2.2.1 关键字

首先接口不能用 class 关键字来修饰,而实现这个接口用的也不是使用 extends 关键字

interface 关键字
接口名前使用 interface 来修饰
implement 关键字
要实现接口的类,在类名后使用 implement 关键字进行实现

如下:

public class Bird implements Flying {

}

2.2.2 接口的使用规则

1. 接口和抽象类一样,都不可以直接实例化

2. 接口里的方法都是抽象方法,如果要在接口内部进行实现,idea 就会报错

在这里插入图片描述
3. 在接口定义的属性(字段)都默认被 public static final 所修饰

在这里插入图片描述

    public static void main(String[] args) {
        String name = Flying.name;
        System.out.println(name);
    }

结果:

在这里插入图片描述
4. 接口中不能有静态代码块和构造方法
5.如果一个类没有实现接口中的所有抽象方法,则类必须设置为抽象类
6. jdk8 中:接口中还可以包含default方法

2.3 接口总结

● 接口和抽象类一样,都不可以直接实例化
● 接口里的方法必须都是抽象方法
● 在接口定义的属性(字段)都默认被 public static final 所修饰
● 接口中不能有静态代码块和构造方法
● 如果一个类没有实现接口中的所有抽象方法,则类必须设置为抽象类
● jdk8 中:接口中还可以包含default方法


END

写的第十八篇,感谢大家的观看!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐