Java面试—JDK1.8接口和抽象类

前言

接口是对动作的抽象,抽象类是对根源抽象。

        使用抽象类,也就是继承,是一种强耦合的设计,用来描述“A is a B” 的关系,即如果说A继承于B,那么在流程中将A当做B去使用应该完全没有问题。

        接口设计目的就是对类的行为进行约束,,也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。对“接口为何是约束”的理解,我觉得配合泛型食用效果更佳。

抽象类:

  • 被Abstract关键字修饰的类是抽象类;
  • 含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法;且抽象方法必须是public或protected,否则不能被子类继承。默认为public。
  • 抽象方法中不能有实现,否则编译报错;
  • 抽象类中可以定义自己的成员变量和成员方法,权限没要求,private,protected,public。
  • 抽象方法要被实现,不能是static,也不能是private。
  • 子类继承抽象类时,必须实现抽象类中的所有抽象方法,否则该子类也要被定义为抽象类;
  • 抽象类不能被实例化,实例化的话,就是多态了。
  • 可以有main方法,不可以new一个抽象类
  • 可以有构造器,初始化块,内部类
  • abstract不能修饰成员,局部变量,更不能修饰构造器
public abstract class Test {
    private int a;
    protected int b;
    public int c;
    int d;

    abstract int geta();            //不能有方法体,不能用private
    protected abstract int getb();
    static void fun1(){
        System.out.println("静态方法");
    }

    private void fun(){
        System.out.println("私有普通方法");
    }
    
    static{
        System.out.println("静态代码块");
    }

    {
        System.out.println("代码块");
    }

    public Test(){
        System.out.println("构造函数");
    }

}


接口:

  • 接口中变量类型默认且只能是public staic final
  • 接口中声明抽象方法(普通方法),且只能是默认的public abstract,没有具体的实现;
  • 默认的方法没有方法体,但JDK1.8之后默认方法,静态方法是要有方法体的。
  • 可以有main方法,可以new一个接口,需要在方法体中实现所有接口函数
  • 子类必须实现所有接口函数;
  • 不能定义构造器和初始化块
public interface  Test {
    int a =1;       //常量

    void fun();     //抽象方法

    default void fun1(){
        System.out.println("默认方法");
    }
    
    static void fun2(){
        System.out.println("静态方法");
    }
}

区别:

  • 一个类只能继承一个抽象类,但可以实现多个继承
  • 抽象类中可以包含静态代码块和静态方法,接口则不能。
  • 接口方法都是抽象的,抽象类可以同时包含抽象和非抽象的。
  • 实现接口必须要实现所有方法,而抽象类可以不用全部实现抽象方法,但是其子类也得是抽象类
  • 两者都不能直接实例化,要实例化的话就涉及到多态了。

Java面试—JDK1.8接口和抽象类_第1张图片



你可能感兴趣的:(Java基础)