抽象类与接口的区别
1.了解访问控制修饰符
- 仅对本类可见 —— private
- 对本包可见 —— 默认的(default),不需要修饰符
- 对本包及子孙类可见 —— protected
- 对外部类都可见 —— public
修饰符 | 本类 | 本包 | 子孙类(本包) | 子孙类(其他包) | 其他包 |
---|---|---|---|---|---|
private | Y | N | N | N | N |
default(不需要写) | Y | Y | Y | N | N |
protected | Y | Y | Y | Y | N |
public | Y | Y | Y | Y | Y |
2.抽象类
抽象类由关键字abstract class修饰,如下:
public abstract class Test{
private String s; //实例变量
public Test(String s){ //带参构造器
this.s = s;
}
public String getS(){ //getter方法
return s;
}
public abstract void abstractMethod(); //抽象方法
}
实际上,抽象类除了不能实例化对象之外,其他用法和普通类差不多,但是需要注意:
1.
抽象方法不能被声明成静态类型;
2.
含有抽象方法的类必定是抽象类;
3.
抽象类的子类必须要实现父类的抽象方法,否则该子类也必须是抽象类;
4.
由于子类必须实现父类的抽象方法才能实例化,所以抽象方法也不能被final、private修饰。
3.接口
接口由关键字interface修饰。示例:
interface InterfaceName{
int MAX_INTEGER = 1000; //常量
int addMAX_INTEGER(int t); //抽象方法
}
接口像是抽象方法的集合,但不需要abstract修饰,需要注意:
1.
类使用implements实现一个接口后才能实现接口中的抽象方法;
-
public class Test implements InterfaceName{ //实现 @Override public int addMAX_INTEGER(int t) { return MAX_INTEGER + t; } }
2.
接口不是类!所以不能有构造器,不能使用new来实例化实例化一个接口,但可以声明接口;
3.
接口中所有的方法都是自动赋 public abstract ,故不需要写访问修饰符;但Java 8新增可以使用default关键字修饰的非抽象方法、可以增加静态方法,Java 9中方法可以使用private修饰;
4.
接口中的字段总是自动赋 public static final,绝不会有实例字段。
5.
可以使用 instanceof 检查一个对象是否实现了某个特定接口。
4.抽象类和接口的异同
-
实现类通过implement实现接口,类通过extends继承抽象类;
-
类只能继承一个抽象类,但可以实现多个接口;
public class Test extends Abstract implements A,B,C{...}
-
如果抽象类和接口中的方法发生冲突了,超类优先,接口方法屏蔽;
public class Realization extends A implements B{ @Override public String cry() { //这是抽象类A中cry方法 return null; } }
抽象类与接口的使用我经常会出错,笔记错误请各位大佬多多指正,欢迎评论区留言,不胜感激!!!