我们都知道在多态中子类要重写父类的方法,执行时也执行子类中的方法,这就显得父类中的方法体有点子虚乌有了,
也就是说可以直接省略方法体,而只定义一个方法就可以了。因此,我们称一个没有方法体的方法为抽象方法,
而当一个“类”中有抽象方法时,则该类为抽象类(即要加abstract),否则语法错误,例如:
public abstract class Mammal{
public abstract void move();
public abstract void sleep();
}
也就是说一个抽象类中可以没有抽象方法,但有抽象方法的类一定要是抽象类!!!
而且,当父类中有抽象方法时,子类必须实现父类中的所有抽象方法(即重写),否则该类(子类)也要为抽象类。例如:
public abstract class Cat extends Mammal{
@Override //重写的标志
public void move() {
System.out.println("正在屋顶上飞奔...");
}
}
此外,抽象类不能创建对象,但可以构造方法,例如:
public abstract class Cat extends Mammal{
public Cat (){} //可以有构造方法
}
public class Test{
Cat cat = new Cat();
这是错的×,抽象类不能创建对象
}
还有重要的一点就是,抽象类和抽象方法都不能加final和static,加final的抽象类不能被继承,其中的方法也就不能被实现,不能被重写;
加了final的抽象方法也不能被重写,这都与上面说的相违背!
好了,让我们来总结一下,抽象类和普通类的区别:
- 抽象类有abstract修饰,但普通类没有;
- 抽象类不能创建对象,但普通类可以;
- 抽象类可以(也可以没有)抽象方法,而普通类一定没有抽象方法