抽象类:
将关键字abstract置于关键字class的前面可以将类声明为抽象类。抽象类不能实例化。抽象类一般用于提供多个派生类可共享的基类的公共定义。例如:类库可以定义一个包含基本功能的抽象类,并要求程序员在使用该类库时,通过创建派生类来提供自己的类实现。
抽象类与非抽象类相比,具有下列特征:
(1)抽象类不能直接实例化,对抽象类使用new运算符会导致编译错误。可以定义抽象类型的变量,但其值必须为null,或者是其派生的非抽象类的实例的引用。
(2)允许(但不要求)抽象类包含抽象成员。
(3)抽象类不能被密封。
(4)当从抽象类派生非抽象类时,这些非抽象类必须实现所继承的所有抽象成员,从而重写那些成员。
抽象方法:
在抽象类中通过将关键字abstract添加到实例方法的返回类型的前面定义抽象方法(abstract method)。抽象方法声明引入一个新的虚方法,但不提供该方法的任何实际实现,所以抽象方法的方法体只由一个分号组成,而不是常规的方法块。
从抽象类中派生类时,如果派生类为非抽象类,则派生类必须重写抽象方法,以提供它们自己的实现。也就是说,如果一个派生类从基类继承了抽象方法,则要么重写以实现所有的抽象方法,要么使用关键字abstract声明派生类为抽象类。
抽象类与抽象方法示例:
package abstractclass;
abstract class Animal{
public String name;
public abstract void sayHello();
public Animal(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
class Dog extends Animal{
public void sayHello(){
System.out.println(this.name + ":wow"); //此处用super.name //也行
}
public Dog(String name){
super(name);
}
}
public class AbstractDemo {
public static void main(String[] args){
Animal animal = new Dog("jack");
animal.sayHello();
}
}