面试问到了,感觉答的很简单,加上本来就有不熟悉的,所以查了一下别的资料,顺便记录一下。
抽象类
普通类可以有构造方法、普通方法、static方法、常量和变量等内容。抽象类也是类,所以这些它都可以有,抽象类和普通类的区别就在于抽象类由abstract修饰,它内部可以有abstract修饰的方法,这种方法不需要实现,只要定义好名和参数就行了。这些没有具体实现的抽象方法将由抽象类的子类实现,除非子类也是抽象类。既然是类,那么就避免不了被其他的修饰符修饰,抽象类则与private、final、static有一些问题。
final
final修饰的对象是不能被更改的,意为最终。被final修饰的类无法被继承,被修饰的方法无法被重写,这就与我们使用abstract的想法相违背,所以二者相互冲突,天生八字不合。
private
抽象类不能用private修饰,只能用public或protected。因为如果使用private修饰的话会无法被继承或重写,那样又与我们使用abstract的想法相反,所以冲突。
被abstract修饰的类是为了让非抽象子类看到并强制重写。如果抽象类中有私有的抽象方法,那么该抽象方法不被子类所知,就无法被复写。 而抽象方法出现的就是需要被复写。
static
如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。众所周知,抽象方法是没有方法体的,可见运行也就没意义了。不过可以在类内部定义static修饰的抽象内部类。
抽象类的特点
- 1、抽象类不能被实例化。
- 2、抽象类应该至少有一个抽象方法,否则它没有任何意义。
- 3、抽象类中的抽象方法没有方法体。
- 4、抽象类的子类必须给出父类中的抽象方法的具体实现,除非该子类也是抽象类。
接口
可以看做是一种特殊的抽象类,它内部所有的方法都是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
接口不能直接被实例化,必须要有类实现接口后才能实例化,
Interfacename interfacename = new Computer();
接口的内部也可以是空的,接口的抽象方法不能是 private、protected 或者 final
使用static定义内部interface是冗余的字段。
两者的区别
语法角度:
- 抽象类的方法可以有具体的实现细节,而接口的方法只有抽象的,即被public abstract修饰的方法
- 抽象类可以有多种成员变量,而接口只能有public abstrack final修饰的变量
- 抽象类可以有静态代码块,而接口不行。
- 一个类只能继承一个抽象类,但可以实现多个接口。
- 抽象类可以有构造方法,而接口不行。
设计角度:
抽象类是对一种事物的抽象,即对类抽象,继承抽象类的子类和抽象类本身是一种 is-a 的关系。而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。