抽象类:
包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
特点如下:
- 抽象类可以包含属性,方法,构造方法。但是构造方法不能用new实例化,只能被用来被子类调用。
- 抽象类只能用来被继承
- 抽象方法必须被子类实现,或者子类是一个抽象类(如果子类是抽象类,那么该抽象类可以不覆盖抽象方法)
接口
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
常量定义;
方法定义;
}
- 访问修饰符只能是public或者是默认
- 常量:接口中常量总是
public static final
.不写也是 - 接口中的方法只能是
public abstract
不写也是 - 接口不能用于创建实例,但是接口可以用于声明引用变量类型(注意需要向下转型然后才可使用实现类的方法)。
- PS:一个类实现了接口,必须实现接口中的左右方法,并且这些方法只能是public
当两个接口有同名的方法和常量被一个类实现会发生什么:
编译器会提示你让你确定到底使用的是哪一个接口的常量
JDK1.8之后接口中引入了默认方法和静态方法
默认方法可以继承,静态方法不可继承,只能用接口名进行调用。
既然已经有了接口,那么为什么还需要抽象类
- 抽象类当中可以存在非抽象的方法,可接口不能且它里面的方法只是一个声名必须用public来修饰没有具体实现的方法。
- 抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(public static fainl)。
- 这一点也是最重要的一点本质的一点"抽象类是对象的抽象,然接口是一种行为规范"。GeometricObject(抽象类),comparable(接口)
- 当父类已有实际功能的方法时,该方法在子类中可以不必实现,直接引用的方法,子类也可以重写该父类的方法(继承的概念)。这是抽象类独有的。
- 另外,抽象类不能产生对象的,但可以由它的实现类来声明对象。 在实现接口时,我们也常写一个抽象类,来实现接口中的某些子类所需的通用方法,接着在编写各个子类时,即可继承该抽象类来使用,省去在每个都要实现通用的方法的困扰。
- 总结:普通类就是 具体实现 + 规范(抽象方法);接口 就是 规范
抽象类和接口区别
语法:
1>抽象类使用abstract,接口使用interface
2>抽象类中可以包含抽象方法,也可以包含非抽象方法,接口中只能包含抽象方法和静态常量,jdk1.8之后接口可以包含静态方法和默认方法。
3>抽象类和接口都不能实例化。
4>抽象类可以包含构造方法,接口中没有构造方法。
功能:
1>抽象类一般用来表示同类事物,接口可以表示不同类事物。
2>抽象类可以实现代码的重用,也可以约束子类的功能。接口就是约束实现类的功能,降低代码之间的耦合性。
使用场景:
1>程序或模块内部使用抽象类
2>程序架构或模块之间使用接口
来源:https://blog.csdn.net/qq_38243113/article/details/98843947