目录
一、抽象类
1、抽象类的概念
我们知道,当一个子类重写了父类的方法后,经过向上转型,父类引用了子类的对象,再去调用这个方法时,调用的是子类的方法,和父类的方法无关,那么父类的这个方法就没有实现的必要了,那么我们就可以把它设计成一个抽象方法,包含抽象方法的类称为抽象类。
2、抽象类的语法
在Java中,我们通过abstract关键字来创建一个抽象类,以及定义抽象方法。
注意:抽象类也是类,它也可以有自己的普通变量、方法和构造方法。
3、抽象类的特点
(1)抽象类不可以被实例化,但是可以被继承;
(2)抽象类的存在就是为了被继承,所以抽象类中的抽象方法不能被private、static、final修饰,否则无法被继承;
(3)抽象类中不一定要有抽象方法,但是有抽象方法的类一定是抽象类;
(4)如果抽象类中含有抽象方法,那么子类在继承时必须重写这些抽象方法,如果子类不重写父类的抽象方法,那么子类也必须被abstract修饰为抽象类;
重写父类抽象方法:
不重写父类抽象方法:
(5)抽象类虽然不能被实例化,但是它可以有构造方法,供子类创建对象时,初始化父类成员。
二、接口
1、接口的概念
在生活中,接口就是值两个设备直接的连接方式,比如电源插座、USB接口等等。
在Java中,接口是一种引用数据类型,可以看成是多个类的公共规范。
2、接口的语法
定义接口需要借助interface关键字,定义方式与定义类的方式相似:
注意:
(1)接口的名称前一般要先写个大写字母I,以此来表示这是一个接口(不写也不会报错);
(2) 阿里编码规范中约定,接口中的方法和属性前不加任何修饰符,保持代码的简洁性。
3、接口的特点
(1)接口中的成员变量,默认都是被public static final修饰的;
(2)接口中的方法,默认都是被public abstract修饰的抽象方法;
(3)接口中的普通成员方法,一般是不能有具体的实现内容的;
(4)接口中的普通成员方法如果要有具体的实现,必须要被default修饰(从JDK8开始才有的);
(5)接口中可以有静态成员方法,它和default修饰的默认方法一样,都是被public修饰的;
(6)和抽象类一样,接口也是不能被实例化的;
(7)接口中不能有静态代码块、实例代码块以及构造方法;
(8)当一个类通过implements实现一个接口后,必须要重写接口中的抽象方法,否则这个类就要被abstract修饰为抽象类;
(9)一个接口引用可以引用一个实现它的类的对象,即向上转型;
4、接口的使用
接口不能直接使用,必须要通过一个类来“实现”接口,并重写接口中所有的抽象方法。
注意:子类和父类的关系是继承(extends),类和接口的关系是实现(implements)。
一个类可以在继承一个父类之后再实现接口:
我们知道,一个类只能继承一个父类,但是一个类可以实现多个接口:
然后我们就可以通过函数传参的方式实现向上转换:
5、接口的继承
在Java中,类和类之间是单继承的,但是接口与接口之间可以是多继承的。所以,我们可以通过接口来达到类的多继承的目的。
上述代码中,ISwimming接口继承了IRunning和IFlying接口,那么ISwmimming接口中也就继承了它们的抽象方法,所以当Pig类实现了ISwimming接口后,就需要重写该接口里的每一个抽象方法。
三、抽象类和接口的区别
1、结构组成不同
抽象类:可以包含普通成员变量和普通成员方法、抽象方法、构造方法等(普通类有的它都有);
接口:包含public static final修饰的常量、抽象方法、静态方法、默认方法。
2、权限不同
抽象类:可以使用各种权限来修饰变量和方法;
接口:属性和方法默认都是public的。
3、子类使用方式不同
抽象类:子类通过extends关键字继承抽象类;
接口:子类通过implements关键字实现接口。
4、子类限制不同
抽象类:一个子类只能继承一个抽象类;
接口:一个子类可以实现多个接口。