Java - 28 抽象类 + 接口

Java 抽象类+接口

抽象类

当父类的某些方法需要声明,但又不确定如何实现时(父类方法不确定性问题),可以将其声明为 抽象方法,这个类就是 抽象类

public abstract class Animal{
  abstract public void eat(); // 抽象方法没有方法体
}

一般来说,抽象类会被继承,由其子类具体实现

细节

  • 抽象类不能被实例化

  • 抽象类 不一定要包含抽象方法,还可以有实现方法

  • 抽象类本质就是类,类有的它都有

  • abstract 只能修饰类和方法

  • 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它也声明为抽象类

    class Cat extends Animal{
      @Override
      public void eat(){
        // 有方法体就是重写,不管方法体里写了什么
      }
    }
    
  • 抽象方法不能使用 private,final,static 来修饰(这些关键字和重写相违背)

接口

把一些没有实现的方法封装到一起,到某个类要使用时再根据具体情况把这些方法写出来

interface 接口名{
  // 属性
  // 方法
}
class 类名 implements 接口{
  // 自己属性
  // 自己方法
  // 必须实现的接口抽象方法
}

在jdk7.0之前,接口里的所有方法都没有方法体(都是抽象方法)

jdk8.0之后,接口可以有 静态方法默认方法,也就是接口中可以有方法的具体实现

public interface AInterface{
  public int n1 = 1;
  void hi(); // 在接口中,可以省略abstract
  // 默认方法
  default public void ok(){
    
  }
  // 静态方法
  pulic static void cry(){
    
  }
}
class A implements AInterface{
  @Override
  public void hi(){
    
  }
}

细节

  • 接口 不能被实例化

  • 接口中的 所有方法都是 public 方法,接口中的抽象方法,可以不用 abstract 修饰

  • 一个普通类实现接口,就必须将该接口的所有抽象方法都实现

  • 抽象类实现接口,可以不用实现接口的方法

  • 一个类可以同时实现多个接口

    interface IA{
      void hi();
    }
    interface IB{
      void hello();
    }
    class A implements IA,IB{
      @Override
      public void hi(){
        
      }
      @Override
      public void hello(){
        
      }
    }
    
  • 接口中的 所有属性只能是 public final static 的(必须初始化)接口名.属性名

  • 接口不能继承其它的类,但可以继承多个别的接口

  • 接口的修饰符只能是 public 和 默认,和类一样

继承与接口

  • 当子类继承了父类,就自动拥有父类的功能,如果子类需要扩展功能,可以通过实现接口的方式扩展

  • 继承的价值在于 解决代码的复用性和可维护性

    接口的价值在于 设计好各种规范,让其它类去实现这种方法

  • 接口在一定程度上可以实现 代码解藕(接口规范性+动态绑定)

接口的多态性

  1. 多态参数:接口类型的变量 可以指向 实现了接口的类的对象实例

  2. 多态数组:接口类型数组

  3. 多态传递

    IN in = new AA();
    IM im = new AA();
    
    interface IM{}
    interface IN extends IM{}
    class AA implements IN{}
    

练习

interface A{
  int x = 1;
}
class B{
  int x = 10;
}
class C extends B implements A{
  public void pX(){
    // 明确指定x
    System.out.println(super.x);
    System.out.println(A.x);
  }
  
  public static void main(String[] args){
    new C().pX();
  }
}
posted @ 2024-11-07 19:39  wajiez  阅读(32)  评论(0)    收藏  举报