一、定义
抽象类:被abstract修饰的类
抽象方法:被abstract修饰的方法(抽象方法没有方法体)
二、特点
- 抽象方法一定要在抽象类中,但是抽象类中可以没有抽象方法。
- 抽象类中可以存在普通方法。
public abstract class Person{//抽象类
public abstract void sleep();//抽象方法
public abstract String eat(String food);//抽象方法
public void drink(){//普通方法
System.out.println("正在喝水");
}
int age=15;//普通变量
}
- 抽象类不能实例化。
Person p = new person();
会报错,但可以直接使用抽象类中静态的内容。System.out.println(Person.age);//输出15
- 抽象类必须被重写才能使用,但是方法可以被多次重写。
- abstract不能和final、static、private、nation一起使用。
三、使用
具体的子类: 重写抽象父类中的所有抽象方法,按需新增其他内容
抽象类的对象必须经过向上转型之后才可以得到实例化对象
public abstract class Person{//抽象类
public abstract void sleep();
public abstract String eat(String food);
public void drink(){
System.out.println("正在喝水");
}
int age;
}
public class Student extends Person{
@Override//重写
public void sleep() {
System.out.println("每天11点睡觉");
}
@Override//重写所有抽象方法
public String eat(String food)
System.out.println("每天吃"+food);
}
void study(){//按需新增
System.out.println("每天学习到深夜");
}
}
public class Test {
public static void main(String[] args) {
Person p =new Student();//向上转型
p.sleep();//每天11点睡觉 子类中的重写
p.eat("营养餐");//每天吃营养餐 子类中的重写
p.drink();//正在喝水 父类中的普通方法
//p.study();//子类中的新增方法,向上转型父类引用对子类新增方法不可见,语句错误
Student s = (Student)p;
s.sleep();//每天11点睡觉 子类中的重写
s.eat("营养餐");//每天吃营养餐 子类中的重写
s.drink();//正在喝水 父类中的普通方法
s.study();//每天学习到深夜 子类的新增方法
}
}
抽象子类: 按需重写抽象方法,按需新增,但是也要有具体的子类(见上方)才可以使用
public abstract class Person{//抽象类
public abstract void sleep();
public abstract String eat(String food);
public void drink(){
System.out.println("正在喝水");
}
int age;
}
public abstract class Teacher extends Person{
@Override//重写
public void sleep() {
System.out.println("每天12点睡觉");
}
void work(){//新增
System.out.println("授课");
}
}