抽象就是从多个事物中将共性的,本质的内容抽象出来。
Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
抽象方法一定在抽象类中;
抽象方法和抽象类都必须被abstract关键字修饰;
抽象类不可以用new创建对象,因为调用抽象方法没意义;
抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用; 如果子类只覆盖了部分的抽象方法,那么该子类还是一个抽象类;
抽象类中可以有抽象方法,也可以有非抽象方法,抽象方法用于子类实例化;
如果一个类是抽象类,那么,继承它的子类,要么是抽象类,要么重写所有抽象方法。
特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
成员变量:静态变量、常量和成员变量
构造方法:有构造方法;
成员方法:可以是抽象方法,也可以是非抽象方法。
只要是class定义的类里面就肯定有构造函数。抽象类中的函数是给子类实例化的。
final:如果方法被抽象,就需要被覆盖,而final是不可以被覆盖,所以冲突。
private:如果函数被私有了,子类无法直接访问,怎么覆盖呢?
static:不需要对象,类名就可以调用抽象方法。而调用抽象方法没有意义。
接口是抽象方法和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,而没有变量和方法的实现。
接口不能被实例化。
一个类如果实现了接口,要么是抽象类,要么实现接口中的所有方法。
接口中的成员修饰符是固定的!
成员常量:public static final,接口里定义的变量是全局常量,而且修饰符只能是这三个关键字,都可以省略,常量名要大写。
成员方法:public abstract,接口里定义的方法都是抽象的,两个修饰符关键字可省略。
//两个接口有相同的默认方法
public interface A {
default void show(){
}
}
public interface B{
default void show(){
}
}
//实现类必须重写这个方法,否则报错,因为如果不实现,创建对象调用的时候,不知道调用哪个接口的方法。
public class Test implements A,B{
@Override
public void show() {
System.out.println("重写");
}
}
相同点:
两者都不能实例化,都有抽象方法;
不同点:
| 抽象类 | 接口 | |
|---|---|---|
| 变量 | 静态变量、常量和成员变量 | 常量 |
| 构造 | 抽象类可以有构造方法 | 接口不可以有构造方法 |
| 方法 | 抽象方法、普通方法 | 抽像方法(1.8之后,增加了静态方法和默认方法) |
| 设计理念 | 对类抽象,包括属性、行为 | 对行为抽象 |
| 抽象类是自下而上,抽取出共同点。 | 接口是一种规范, 它是自上而下的一种要求,要求实现类必须做到这种规范 |
来源:https://www.runoob.com/w3cnote/java-extends.html