欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-22 11:21:45
...

前言

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

        使用抽象类,也就是继承,是一种强耦合的设计,用来描述“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接口和抽象类



相关标签: 抽象类 接口