抽象类
- java抽象类的构造方法与普通类的构造方法都是用来初始化的,只是抽象类不能直接调用构造方法创建抽象类的实例对象(抽象类不能实例化)。
- 但一旦普通类继承了抽象类,普通类的构造函数就会强制调用其抽象类的构造函数(如含有有参构造器,则强制要求实现有参构造函数)。
- 抽象类 == 不能实例化的类(一个普通类加上abstract就不能实例化了)。
- 如果父类抽象类中有有参构造函数,在子类继承是就必须写一个构造函数来调用父类的有参构造函数(默认实现为参数一致的,可以为参数不一致的)。
- 如果父类抽象类中无有参构造函数,在子类中可以不显示的写父类的构造函数,Java会自动生成并调用没有参数的构造函数。
- 实例化子类就会初始化父类,初始化一个类会先初始化父类(无论父类是否抽象类都会调用父类的构造方法)。
- 抽象类可以有静态方法,可调用(静态方法的调用不需要实例化)
- 装饰器模式使用到了抽象类的特性,装饰类会继承抽象类,并组合抽象类。
- 抽象是一个天然的规范+模板,不是拿来用的(实例化)。既可以全是规范,也可以全是模版。
接口
- 接口成员变量是常量:public static final ;
- 接口是一种实现多态的规范。多态调用时主要关注里边的方法(不用去关注方法初始化)
- 接口是一个天然的规范,制定规则。
一种特殊的接口: protected 构造器
只能使用匿名类实现
- 用法: 用 protected 构造器. 例如:
SimpleFileVisitor.class
public class SimpleFileVisitor<T> implements FileVisitor<T> {
/**
* Initializes a new instance of this class.
*/
protected SimpleFileVisitor() {
}
...
}
- 构造器是 protect 所以只有子类能访问构造器: 只能使用匿名类
// 匿名类显然继承自 SimpleFileVisitor
return new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
if (file.toString().endsWith(".jar")) {
System.out.println(file);
jarCount.incrementAndGet();
}
return super.visitFile(file, attrs);
}
};