视频地址:https://www.bilibili.com/video/BV17p4y1S7jD
目录
1、抽象类
中间省略N行代码
其中Pet类为抽象类,toHospital为抽象方法
1.1抽象类VS普通类
- 抽象类不能被实例化
但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例(多态)
Base son = new son();
- 普通类可以被实例化
1.2抽象方法VS普通方法
- 抽象方法没有方法体
- 普通方法有方法体
1.3抽象类与抽象方法的使用
- 抽象类中可以没有抽象方法,但包含了抽象方法的类必须定义为抽象类
- 如果子类没有实现父类所有的抽象方法,那么子类必须定义为抽象类
- 没有抽象构造方法,也没有抽象静态方法
- 抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
2、接口
2.1认识一下接口
- 概念性的接口,指系统对外提供的所有服务
- interface定义的实实在在的接口,即接口类型
2.2JDK1.8之前的接口特性
1、接口中的变量都是静态常量(public static final),必须显式初始化
2、接口中所有的方法默认都是public abstract
3、接口没有构造方法,不可以被实例化,但是可以被实现
4、实现类必须实现接口的所有方法,除非实现类也是抽象类
5、实现类可以实现多个接口(接口的存在弥补了java单根继承的缺点)
总结:
- 接口(interface),在java中是一个抽象类型,在JDK1.8之前接口是抽象方法的集合
- 一个类通过实现的方式,从而来继承接口的抽象方法
- 一个类只能继承一个类,但是可以实现多个接口
- 一个接口不能实现另一个接口,但是可以继承多个其他接口
2.3JDK1.8新增接口特性
1、JDK1.8后,接口里可以有默认方法(方法体)了
2、JDK1.8后,接口里可声明(并且可以提供实现)静态方法了
2.4JDK1.8接口新特性解决的问题
- 默认方法:解决了接口与其实现类之间耦合度过高,修改接口,所有实现类必须随之修改的问题(实现类默认继承默认方法)
- 静态方法:帮我们实现静态工厂类,不用重新创建工具类了
3、抽象类VS接口
- 相同点
1. 接口和抽象类都能定义方法和属性。
2. 接口和抽象类都是看作是一种特殊的类。大部分的时候,定义的方法要子类来实现
3. 抽象类和接口都可以不含有抽象方法。接口没有方法就可以作为一个标志。比如可序列化的接口Serializable,没有方法的接口称为空接口。没有抽象方法的抽象类,小编不知道有什么作用,总之是可以通过编译的。
4. 抽象类和接口都不能创建对象。
5. 抽象类和接口都能利用多态性原理来使用抽象类引用指向子类对象。
6. 继承和实现接口或抽象类的子类必须实现接口或抽象类的所有的方法,抽象类若有没有实现的方法就继续作为抽象类,要加abstract修饰。若接口的子类没有实现的方法,也要变为抽象类。
- 不同点
1. 接口能够多实现,而抽象类只能单独被继承,其本质就是,一个类能继承多个接口,而只能继承一个抽象类。
2. 方法上,抽象类的方法可以用abstract 和public或者protect修饰。而接口默认为public abstract修饰。
3. 抽象类的方法可以有需要子类实现的抽象方法,也可以有具体的方法。而接口在老版本的jdk中,只能有抽象方法,但是Java8版本的接口中,接口可以带有默认方法。
4. 属性上,抽象类可以用各种各样的修饰符修饰。而接口的属性是默认的public static final
5. 抽象类中可以含有静态代码块和静态方法,而接口不能含有静态方法(JDK8后可以有静态方法)和静态代码块。
6. 抽象类可以含有构造方法,接口不能含有构造方法。
7. 设计层面上,抽象类表示的是子类“是不是”属于某一类的子类,接口则表示“有没有”特性“能不能”做这种事。如飞机和鸟都能飞,但是他们在设计上实现一个Fly接口,实现fly()方法。远比两个类继承飞行物抽象类好得多。因为,飞机和鸟有太多的属性不一样。
8. 设计层面上,另外一点,抽象类可以是一个模板,因为可以自己带集体方法,所以要加一个实现类都能有的方法,直接在抽象类中写出并实现就好,接口在以前的版本则不行。新版本Java8才有默认方法。
9. 既然说到Java 8 那么就来说明,Java8中的接口中的默认方法是可以被多重继承的。而抽象类不行。
10. 另外,接口只能继承接口。而抽象类可以继承普通的类,也能继承接口和抽象类。