OnJava8笔记4 -- 抽象类和接口

抽象类和接口

抽象类

  • 被abstract修饰的方法为抽象方法,只能声明,不能有具体实现,具体实现在子类中
  • 一个类中只要有一个abstract方法就得声明为抽象类
  • 抽象类不能被创建实例,会编译错误
  • 可以将一个不包含抽象方法的类声明为抽象类,这样做是为了阻止类的具体实例的创建
abstract class Basic {
    abstract void unimplemented();
}
  • 抽象类的子类必须为所有抽象方法提供具体实现。如果不这么做,新的子类就必须也要声明为抽象类,同时方法也要声明为抽象方法

    abstract class Basic2 extends Basic {
        int f() {
            return 111;
        }
    
        abstract void g() {
            // unimplemented() still not implemented
        }
    }
    
  • 抽象类中的抽象方法默认为public权限,且只能使用public 和 protected 修饰抽象方法,provate被禁止(因为provate方法也不能被继承呀)

接口

由于一个类只能实现一个抽象方法,故出现了接口,一个类可以实现多个接口

接口的创建

Java8之前和之后的接口有些许变化。

共性
  • 接口的默认权限是public,且只能是public
  • 接口不允许存在对象属性,可以有静态属性。在声明时就初始化好的变量默认是 static & final 的。字段必须被初始化,可以使用非常量表达式初始化
  • 接口也能继承父接口,且和类继承不一样的是,一个接口可以继承多个接口
Java8之前
public interface PureInterface {
    int value = 1; // 必须被初始化,否则编译错误
    int m1(); 
    void m2();
    double m3();
}
  • 接口只允许抽象方法
  • 接口中的方法不能有具体实现,都是抽象方法
Java8之后
  • 提供了默认方法:使用default修饰,为接口方法的实现提供了默认实现

    public interface DefaultInterface {
        default void defaultFunc() {
            System.out.println("默认方法");
        }
    }
    
  • 支持接口中的静态方法

实现多个接口

  • 多个接口中有相同的方法名和相同的参数列表,会编译报错。不过可以Override这个方法,重写之后新方法覆盖了接口。
  • 不同接口中有相同的方法名和不同的参数列表(重载),可以使用(Java8新特性)

你可能感兴趣的:(OnJava8笔记4 -- 抽象类和接口)