1.abstract修饰类:抽象类
- 定义:随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
- 抽象类不能实例化。一般需要子类继承此抽象类完成相关操作
- 抽象类中一定有构造器 ( 子类实例化时需调用 )
2.abstract修饰方法:抽象方法
- 某些方法在父类中难以实现,则申明为抽象方法。子类一般需要重写该抽象方法以实现相关操作。
- 抽象方法只有方法的声明,没有方法体
abstract class Animal
{
public abstract void eat();
}
- 包含抽象方法的类一定是一个抽象类。抽象类中不一定有抽象方法。(因为方法需要通过对象调用,但是抽象类不可实例化,所以包含抽象方法的类一定是一个抽象类)
- 若子类重写了父类中的所有的抽象方法( 包括直接 / 间接父类)后,此子类方可实例化
- 若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰
3.abstract 修饰注意点 (关键在于抽象方法一般需要被重写)
- abstract不能用来修饰:属性、构造器(若abstract 修饰父类构造器,则子类可申明为abstract 。但是总有一个子类需要重写其构造器才能使用,这与构造器只能重载不能重写矛盾)
- abstract不能用来修饰私有方法(private 方法不能被重写)
- abstract不能用来修饰静态方法(static 方法不能被重写)
- abstract不能用来修饰 final 方法、final类(final 方法不能被重写,final类不能被继承)
4.应用举例
abstract class Employee
{
String name;
public Employee(String name)
{
this.name = name;
}
public abstract double GetSalry(Employee p);//因为雇员薪资由身份决定,父类中不能严格给出
}
class Manager extends Employee
{
public Manager(String name)
{
super(name);
}
public double GetSalry(Employee p)
{
return 1000;
}
}
class Cleaner extends Employee
{
public Cleaner(String name)
{
super(name);
}
public double GetSalry(Employee p)
{
return 200;
}
}
public static void main(String[] args)
{
Manager m=new Manager("Tom");
System.out.println(m.GetSalry(m));//1000.0
Cleaner c=new Cleaner("Alice");
System.out.println(c.GetSalry(c));//200.0
}