什么是抽象类和接口?

抽象类

abstract修饰的类。

1
2
3
abstract class 类名 {
abstract int 方法名(参数列表); // 抽象方法
}

特点:

  • 抽象的方法没有方法体。需要注意的是在抽象类中既可以有抽象方法,也可以有普通方法。

抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  • 抽象类不能被实例化,如果被实例化,编译就无法通过。

  • 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

  • 构造方法和类方法不能声明为抽象方法。

  • 抽象方法必须用public、或者protected修饰(不能使用private,子类无法重写,无意义)默认缺省为 public。

接口

interface关键字声明接口

1
2
3
public interface 接口名 {
返回值 方法名(参数列表);
}

特点:

  • 接口中每一个方法都是隐式抽象的,接口中的方法会被隐式的指定为public abstract并且只能是。
  • 接口中可以含有成员变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法(java8存在变化)。

java8之后接口的变化

在JDK1.8之前的版本(不包括JDK1.8),接口中不能有静态方法,抽象类中因为有普通方法,故也可以有静态方法。

在JDK1.8后(包括JDK1.8),在抽象类中依旧可以有静态方法,同时在接口中也可以定义静态方法了。

以下代码在JDK1.8之后是没有问题的(可以通过接口名来调用静态方法 :Main.prinf(); ):

1
2
3
4
5
public interface Demo{
public static void print() {
System.out.println("Hello World!");
}
}

在JDK1.7,接口中只包含抽象方法,使用public abstract 修饰。

1
2
3
public interface Demo{    
public abstract void method();
}

在JDK1.8,接口中新加了默认方法和静态方法:

默认方法:使用default修饰,在接口的实现类中,可以直接调用该方法,也可以重写该方法。

静态方法:使用static修饰,通过接口直接调用。

1
2
3
4
5
6
7
8
9
10
public interface Demo{    
//默认方法
public default void method(){
System.out.println("default method...");
}
//静态方法
public static void print(){
System.out.println("static method...");
}
}

在JDK1.9,接口中新加了私有方法,使用private修饰,私有方法供接口内的默认方法和静态方法调用。

1
2
3
4
5
public interface Demo{
private void method() {
System.out.println("Hello World!");
}
}

接口与抽象类区别?

  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  • 抽象类只能单继承,接口可以多继承。
  • 抽象类中可以有普通成员变量,接口中没有普通成员变量。
  • 抽象类可以有构造方法,接口不能有构造方法。
  • 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只是public static final 类型,并且默认即为 public static final 类型。
  • ….

接口和抽象类之间的区别真的要硬说真的还有很多,从各个方面,抽象类是is-a关系,接口是has-a关系;还有他们的使用场景也不同,等等。。这个了解就好。