关键词: abstract
如果自下而上在类的继承结构中上移,那么位于上层的类就更具有一般性,可能更抽象。超类或者祖先类一般更具有普遍性,不会定义更为详细的方法或功能。例如学生—>人类—>生物,此时生物作为祖先类,不能直接一定到下属成员的具体功能,比如学生学习、唱歌等,一般通过定义一个关键字关键词: abstract
,然后子类进行改写其方法。
abstract
通常可以用来修饰类和方法。abstract
修饰类为抽象类,abstract
修饰方法为抽象方法。
抽象类
- 此类不可以被实例化;
- 抽象类必须要有构造器,便于子类对象实例化调用。
抽象方法
- 包含一个或者多个抽象方法的类本身就必须被声明为抽象的;
- 抽象方法必须不含方法体;
- 子类(可实例化,非
abstract
修饰)必须对父类中的抽象方法进行重写;否则该子类也无法被实例化,需要用abstract
修饰成为抽象类。
1 | abstract class School{ |
接口(interface)
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口不是类,和类属于并列关系。
类包含对象的属性和方法,接口则包含类可以实现的方法或功能。
接口无法被实例化,但是可以被实现。因此在接口定义中绝对不能有构造器。
JDK7之前
只能定义全局常量和抽象方法
全局常量
修饰符:public static final
,但是在interface
范围内书写可省略。
1 | interface Flyable{ |
抽象方法
修饰符:public abstract
,但是在interface
范围内书写可省略。
1 | interface Flyable{ |
JDK8及以后
除了全局常量和抽象方法外,还可以定义静态方法和默认方法。
接口CompareA
1 | public interface CompareA { |
接口CompareB
1 | public interface CompareB { |
静态方法
1 | // 静态方法 |
静态方法只能通过接口来调用
1 | SubClass s = new SubClass(); |
默认方法
1 | // 默认方法 |
默认方法只能通过实现类的对象来调用
1 | // 知识点2:通过实现类的对象,可以调用接口中的默认方法 |
接口冲突
如果实现类实现了多个接口,而这多个接口定义了同名同参数的默认方法,比如CompareA
和CompareB
中的method3
默认方法,那么在实现类没有重写此方法的情况下,将会产生接口冲突,报错。
类优先原则
如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认是父类中的同名同参数的方法。
接口的属性
在C++
中,一个类允许有多个超类(多重继承-multiple inheritance),但是在Java中,类只能有一个父类,通过扩展多个接口,弥补了Java的单继承性。
1 | class Bullet extends Object implements Flyable, Attackable, CC{ |
接口扩展
从通用性较高的接口扩展到专用性较高的接口。
1 | interface AA{ |
内部类(inner class)(用到后继续补充)
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据;
- 内部类可以对同一个包中的其他类隐藏起来;
- 用匿名内部类来定义回调函数会方便很多;
- 内部类能独立地继承一个(接口的)实现,无论外围类是否已经继承了某个(接口的)实现,对于内部类没有影响。
一方面,作为外部类的成员:
- 调用外部类的结构;
- 可以被static修饰;
- 可以被四种不同的权限修饰。
另一方面,作为一个类:
- 类内可以定义属性、方法、构造器等;
- 可以被final修饰,表示此类不能被继承,言外之意,不适用final就可以被继承;
- 可以被abstract修饰。
内部类传送门:Java内部类、java内部类(代码演示)