抽象类和接口
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关键字修饰
接口中所有的元素都是public修饰的。在下面案例可以看到-->冗余
接口中的抽象方法定义时:public abstract修饰符可以省略
接口中常量的public static final也是可以省略的
(即写一个数据类型就会默认加上public static final)