从概念上,抽象类描述的是这个类是什么,而接口指的是可以做什么。
抽象类中可以定义普通方法和抽象方法,被子类继承之后,抽象方法必须被实现,而普通方法可以选择或者不选择重写。
抽象类public abstract class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay() {
System.out.println("Inside Employee computePay");
return 0.0;
}
public abstract void getName(int number);
}
public class TureEmployee extends Employee {
@Override
public void getName(int number) {
}
}
- 抽象类不允许被实例化,只能被继承。也就是说,你不能 new 一个抽象类的对象出来(Employee e = new
Employee(“George W.”, “Houston, TX”, 43);会报编译错误)。 - 抽象类可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现,不包含代码实现的方法叫作抽象方法。
- 子类继承抽象类,必须实现抽象类中的所有抽象方法。对应到例子代码中就是,所有继承 TureEmployee抽象类的子类,都必须重写 getName() 方法。
- 子类必须实现抽象类的最少一个的构造器
public interface EmployeeInterface {
int a;//报错
public static final int field1 = 0;
//static 修饰定义静态方法
static void staticMethod() {
System.out.println(field1);
System.out.println("接口中的静态方法。");
}
//default修饰符定义默认方法
default void defaultMethod() {
System.out.println("接口中的默认方法。");
}
}
- 接口可以包含属性(常量,默认未public static final),但是不能包含变量。
- 接口只能声明方法,方法不能包含代码实现。
- 类实现接口的时候,必须实现接口中声明的所有方法。
JDK1.8后接口也可以有默认方法和静态方法了,默认方法因为非抽象方法,所以继承这个接口可以实现或者不实现。
静态方法,只能调用对象.方法去实现(EmployeeInterface.staticMethod),这个设定就很奇怪。



