我觉得面试就真不该问这种问题,不了解的同学建议去看看 JDK
集合类的源码,对接口和抽象类的理解会更深刻。
接口
接口是方法的集合,不同的实现类可以去实现这个接口中的方法,因此有点像抽象类里的抽象方法,但是和抽象方法不同的是,接口更加通用,规定了一整套行为(例如java.util.List
),而抽象方法往往是规定了该抽象类里的某种行为。
抽象类
抽象类的作用大多是抽取多个 Java
类的通用逻辑,对于子类特有的逻辑可以放在抽象方法中,由这些子类去各自实现,本质是通过子类继承的方式达到代码复用的目的(例如 java.util.AbstractList
)。
面向对象三要素
我们都知道,面向对象编程有三要素:封装、继承和多态。
封装很简单,就是设定边界,避免暴露内部状态;
继承则是一种紧密耦合的关系,有利于代码复用;
多态就是父类引用指向具体的子类实现,在编程时这种对应关系无法确定,只有在程序运行时才能知道。
重写和重载
重写(Overwrite)
是指,父子类中相同名字和参数的方法,不同的实现,体现在父类与子类这种上下层关系里。
重载(Overload)
则是相同名字的方法,但是不同的参数,本质上这些方法签名是不一样的,体现在某个类中,是并行的关系。
这里有个问题,方法名称和参数一致,但是返回值不同,这种情况在 Java
代码中算是有效的重载吗?面试里经常问道。答案是不行,编译直接报错。