抽象类(abstract)
- 用abstract修饰的类就称为抽象类
- 抽象类中用abstract修饰的方法叫抽象方法,抽象方法在本类中只能声明,不能实现
- 抽象类中可以有抽象方法,也可以没有抽象方法
- 抽象类无法创建对象
- 若子类继承了一个抽象类,则必须重写抽象类中抽象方法
- 若抽象类继承了一个抽象类,则不用重写父类的抽象方法,但最终子类必须重写父类的所有抽象方法
例如:
abstract class Person{
public void commonFunc(){
System.out.println("非抽象方法"); //抽象类中可以有非抽象方法
}
public abstract void abstractFunc(); //抽象方法只能声明,而不能具体实现,实现需要交给子类完成
}
class Student extends Person{
public void abstract abstractFunc(){
System.out.println("子类实现的抽象方法"); //若子类不实现父类的抽象方法,则报错
}
}
接口(interface)
- 用interface代替class可以定义一个接口
- 接口中的方法默认自带修饰词public abstract
- 由上条可知接口中的方法都是抽象方法,都只能声明,不能实现
- 类通过implements继承接口
- 继承接口的类必须重写接口中的所有方法
- 抽象类同样可以继承接口,并且可以不用重写接口中的方法
- 接口之间可以通过extends实现继承
例如:
interface Person{
void run(); //默认自带修饰词public abstract
void say();
}
class Student implements Person{
public void run(){
System.out.println("Student--run");
}
public void say(){
System.out.Println("Student--say"); //子类必须重写所继承接口中的全部方法
}
}
abstract class Teacher implements Person{
//抽象类继承接口可以不用重写接口中的方法
}
interface Adult extends Person{
//接口可以通过extends继承其他接口
void play();
//后续最终继承接口的子类必须重写接口中的所有方法
}
接口的属性
- 接口的属性默认自带修饰符public static final
- 这意味着接口的属性直接隶属于该接口,可通过该接口直接访问
- 同时该属性也不允许二次赋值(参考类的静态常量)
- 所以该属性也须遵守静态常量的命名方式,即单词全部大写,不同单词间用下划线隔开
例如:
interface Hello{
int TOTAL_NUMBER = 100;
}