目录

抽象类和接口

1. 什么是抽象类

2.抽象类的特点

3.什么是接口

4.详解接口中的static,default,public abstract方法

5.抽象类和接口的区别(面试题)


抽象类和接口

我们知道,Java中的类是对对象的描绘,就像现实中对具体事物的描绘一样,但现实中有一些词语只有抽象的含义,没有具体的事物,在Java中也有这样的描绘(不能描绘对象),便是抽象类和接口,接口可以理解为更加抽象的抽象类,下面我来为大家详解一下两者以及两者的区别。

1. 什么是抽象类

abstract修饰的类称为抽象类,语法格式如下:

// 抽象类:被abstract修饰的类public abstract class Shape {// 抽象方法:被abstract修饰的方法,没有方法体abstract public void draw();abstract void calcArea();// 抽象类也是类,也可以增加普通方法和属性public double getArea(){return area;}protected double area; // 面积}

抽象类中可以包含被abstract修饰的抽象方法,抽象方法在抽象类中仅仅被声明,具体的实现代码可以在继承他的类中被实现。

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

2.抽象类的特点

  1. 抽象类不能直接实例化对象
  2. 抽象方法不能是private的
  3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
  4. 抽象类必须要被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类必须用abstract修饰
  5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
  6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

抽象类在实例化对象时会直接在编译层面报错。

3.什么是接口

Java中类不能实现多继承,为了让一个类继承多个类型,Java中引入了接口,接口也是一种引用数据类型,可以把他当做比抽象类更抽象的引用数据类型

interface定义的类被称为接口,语法格式如下:

public interface 接口名称{// 抽象方法public abstract void method1(); // public abstract 是固定搭配,可以不写public void method2();abstract void method3();void method4();// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁}

接口的设计者们在设计接口时就是为了让他被继承,所以最初版的接口之中只能有被publicabstract修饰的方法和被public static final修饰的变量,在之后的jdk发展中引入了可以被static和default修饰的方法。因为初版接口内默认只有这两种东西,所以我们在使用时一般省略public abstract和public static final。

接口可以被类实现多继承,接口和接口之间也可以实现多继承

  • 类继承接口通过implements关键字
    class Duck extends Animal implements IRunning, ISwimming, IFlying{...}
  • 接口之间继承通过extends关键字
    interface IAmphibious extends IRunning, ISwimming {...}class Frog implements IAmphibious {...}

tips:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类

4.详解接口中的static,default,public abstract方法

在JDK8之前接口中的方法类型只有public abstract方法,在JDK8之后接口中可以添加default或者static修饰的方法。

public abstract:不能拥有自己的方法实现,具体实现完全交给实现类自己完成。

default:default修饰方法只能在接口中使用,在接口中这种方法被称为普通方法,可以直接写方法体。该方法有三种使用途径。

  1. 实现类继承接口中的default方法,如果接口中有default方法,则会被继承。
    public interface demo {public default void demoFun(){System.out.println("我是接口");}}public class Test implements demo {}public class Test2 {public static void main(String[] args) {Test t = new Test();t.default();}}
  2. 如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

    public interface A {public default void c(){System.out.println("方法A");}}public interface B {public default void c(){System.out.println("方法B");}}public class Test implements A,B {@overriedpublic default void c(){System.out.println("方法A,B");}}
  3. 如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么继承的方法覆盖了实现接口的b方法。

    public interface A {public default void b(){System.out.println("A方法");}}public class C {public void b(){System.out.println("C方法");}}public class Test extends C implements A{}Test test=new Test();test.b()输出值为:C方法

static: 用法和普通的类中的static方法一样(里面可以有方法体),可以被接口名直接调用使用。

5.抽象类和接口的区别(面试题)

核心区别 : 抽象类中可以包含普通方法和普通字段 , 这样的普通方法和字段可以被子类直接使用 ( 不必重写 ), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法