抽象类和接口

abstract

语法格式

[修饰符列表] abstract class 类名{
          类体;
}

重要细节:

  • 抽象类不能实例化对象
//抽象方法不能有方法体 {},即不能new实现
public abstract void eat();
  • 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。
  • 抽象方法就是没有实现的方法 (父类方法如果具有不确定性,我们可以考虑将其设计为abstract),
  • 所谓没有实现就是没有方法体
  • 一个类中存在抽象方法,那么这个类必须声明为抽象类
  • 抽象类可以没有抽象方法,抽象方法一定在抽象类中
  • abstract只能修饰抽象类和抽象方法
  • 抽象类还是类!可以有任意成员

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

//~比如
abstract class Animal{
public abstract void fly();
}
/* one
abstract class bird extends Animal{
}*/
// two
class Brid extends Animal{
@Override
    public void fly() {
    
    }
}

抽象方法不能使用private、final和static(和重写无关)关键字修饰,很明显这是违背abstract的初衷的

interface

语法格式

[修饰符列表] interface 接口名{}{
}
class 类名 implements 接口{
}

重要细节:

  • like-a  (继承是is-a)符合标准的可以考虑设计为接口
  • 接口是完全抽象的。(抽象类是半抽象)也可以说接口是特殊的抽象类。
  • 语法格式:[修饰符列表] interface 接口名{}
  • 抽象类实现接口的话,可以不实现接口中的方法
  • 接口支持多继承,一个接口可以继承多个接口,担任各自功能,解耦性强--比如电脑同时有多个USB接口,来分担不同的功能
  • 接口也是一种“引用数据类型”,编译之后是一class字节码文件。
  • 接口中主要包含两部分内容,一部分是:常量。一部分是:抽象方法。在JDK8之后接口类可以有静态方法,默认方法,也就是说接口可以有方法的具体实现,但是需要加default关键字修饰

抽象类和接口(Abstract and Interface)精湛细节_修饰符

    接口中所有的元素都是public修饰的。在下面案例可以看到-->冗余

    接口中的抽象方法定义时:public abstract修饰符可以省略

    

抽象类和接口(Abstract and Interface)精湛细节_抽象方法_02

    接口中常量的public static final也是可以省略的

    (即写一个数据类型就会默认加上public static final)

抽象类和接口(Abstract and Interface)精湛细节_抽象类_03