1.概念
抽象类:被abstract 修饰的类就是抽象类 如:abstract class Animal{ },抽象类的作用就是为了去让子类去继承它,提高代码重用性!
接口:我们可以把它看做是一种特殊的抽象类,接口中的所有方法都必须是抽象的,接口中的方法定义默认为 public abstract 类型,接口中的成员产量类型默认为 public static final。
2.抽象类和接口的异同点
相同点:
- 二者都不能实例化
- 一个类如果继承了某个抽象类或者实现了接口,都需要对里面的抽象方法全部进行实现,否则还需被声明为抽象类。
不同点:
抽象类 | 接口 | |
实现 | 子类使用extends关键字来继承抽象类 | 子类使用implements关键字来实现接口 |
构造器 | 抽象类中可以定义构造器 | 接口中不可以定义构造器 |
成员变量 | 抽象类中可以定义成员变量 | 接口中的成员变量其实就是常量,默认被public、static、final修饰 |
方法 | 可以有抽象方法和普通方法 | 可以有抽象方法(默认被public、abstract修饰)和普通方法(必须声明default修饰) |
静态方法 | 抽象类中可以有静态方法 | JDK1.8 以后可以有静态方法 |
3.程序说明
抽象类:
abstract class Animals{
//抽象方法
public abstract void f1();
//普通方法
public void f2() {};
protected void f3(){};
void f4(){};
private void f5(){};
//静态方法
public static void f6() {};
}
//不实现抽象方法,则跟着抽象
abstract class Dog extends Animals{
}
//实现抽象类中的方法
class Cat extends Animals{
@Override
public void f1() {
System.out.println("猫会跑");
}
}
接口:
interface B1{
// 接口这里的方法默认是被public修饰的
void f1() ;
//接口中可以有普通方法,但必须声明 default
default void f2() {
System.out.println("我是普通方法");
}
//静态方法
public static void f6() {};
}
interface C{
}
class E implements B1,C{
// 这里如果不写public程序会报错,因为如果不写的话, f1()方法是被默认修饰符修饰的,它的访问权限小于public
public void f1() {
System.out.println("B接口的抽象方法在我这里实现了");
}
}