Java abstract关键字

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
	}

猜你喜欢

转载自blog.csdn.net/weixin_43956248/article/details/112833750