抽象方法
概念:只有方法的声明,没有方法的实现。或者说是没有方法体的的特殊方法。
什么时候使用抽象方法呢?
在程序设计中,有时候只需声明类的功能,而不必指出其实现细节时,就可以使用抽象方法。
格式
[修饰符] abstract <方法返回类型> 方法名(参数列表);
如: public abstract int getInt();
注:空方法有方法体,但方法体里没有内容。而抽象方法只有方法的声明,没有方法体。并用abstract(不能省略)修饰,如
public void show(){} //是一个空方法
public abstract void show(); //是一个抽象方法
抽象类
概念:用abstract 修饰的类称为抽象类,抽象类是它所有子类共同属性的集合,是包含一个或者多个抽象方法的类。
如果只想将一个类作为派生其他类的基类,而不作为想使用其特定实例的类,就可以使用抽象类。通常把通用的域和方法(不管是否抽象)放在抽象类中,通过它派生子类来实现其抽象方法
定义格式
[修饰符] abstract class 类名
{
[成员变量声明]
[抽象方法的声明]
[非抽象方法的声明]
}
抽象类的 特点:
- 1.一旦用abstract 修饰的类就是抽象类,无论它内部是否含有抽象方法;
- 2.抽象类中可以有零个或多个抽象方法,也可以有非抽象方法、构造器等;
- 3.抽象类可以派生子类,子类必须实现了抽象类中所有的抽象方法,否则其子类也为抽象类
- 4.抽象类不能创建对象。但可以定义一个抽象类的对象变量,该对象变量只能引用非抽象子类的对象。
- 5.abstract不能与final修饰同一个类或方法。
- 6.在抽象类的派生类中实现抽象方法时,方法的访问权限不能低于其抽象父类抽象方法的访问权限
抽象类的构造器:抽象类既然不能创建对象,那么定义抽象类的构造器有什么作用呢?
通常将一个类中的实例域都定义为private类型,方法定义为public。抽象类派生出的子类并不能访问其抽象父类私有的实例域,此时就可以通过子类的构造器调用父类的构造器来初始化父类私有的实例域
//class Animal //error:Animal不是抽象的,并且未覆盖Animal中的抽象方法eat();
//abstract final class Animal //error:非法的修饰符组合:abstract和final
abstract class Animal
{
//通用的域
private String name;
//抽象类的构造器
public Animal(){
}
public Animal(String name)
{
this.name=name;
}
//抽象方法
//public abstract void eat(){} //error:抽象方法不能有主体
//public void eat(); //error:缺少方法主体,或声明抽象
public abstract void eat();
public abstract void sleep();
//通用的方法
public String getName(){
return name;
}
}
//该类实现了抽象父类的所有抽象方法,所以该类可以是非抽象类
class Cat extends Animal
{
public Cat()
{
}
public Cat(String name)
{
super(name);
}
public void eat()
{
System.out.println("猫吃老鼠");
}
public void sleep()
{
System.out.println("猫在睡觉");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("狗啃骨头");
}
public void sleep()
{
System.out.println("狗在睡觉");
}
public void playGame()
{
System.out.println("狗在玩游戏");
}
}
//class Pig extends Animal //error:Pig不是抽象的,并且未覆盖Animal中的抽象方法
abstract class Pig extends Animal
{
public void eat()
{
System.out.println("猪吃白菜");
}
}
使用抽象类还可以实现 多态,如下述的示例程序
class AbstractDemo
{
public static void main(String[] args)
{
//Animal a=new Animal(); //error:Animal是抽象的;无法实例化
//利用抽象类实现多态
Animal a=new Cat("小白");
a.eat();
a.sleep();
System.out.println(a.getName());
System.out.println("------------");
a=new Dog();
a.eat();
a.sleep();
if(a instanceof Dog)
{
System.out.println("------------");
Dog b=(Dog)a;
b.eat();
b.playGame(); //子类特有的方法
}
}
}
运行结果