abstract修饰符可用来修饰类和实例成员方法
用abstract修饰的类表示抽象类,抽象类不能被实例化。没有用abstract修饰的类称为具体类,具体类可以被实例化。
用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。没有用abstract修饰的方法称为具体方法,具体方法必须要有方法体。
使用abstract修饰符需要遵守以下语法规则:
(1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须被定义为抽象类,否则编译出错。
(2)没有抽象构造方法,也没有抽象静态方法。
abstract class Base {
abstract Base() {} //编译出错,构造方法不能是抽象的
static abstract void method1(); //编译出错,static和abstract修饰符不能连用
static void method2() {...} //合法,抽象类中可以有静态方法
}
(3)抽象类中可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法。抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。
(4)抽象类及抽象方法不能被final修饰符修饰。即,abstract与final不能连用。这是因为abstract与final的作用是恰恰相反的,如:抽象类只允许创建其子类,而final修饰的类不允许拥有子类; 抽象方法必须被子类的具体方法来实现,而final修饰的方法不允许被子类方法覆盖。
为什么抽象类不允许被实例化?
在语义上,抽象类表示从一些具体类中抽象出来的类型。从具体类到抽象类,这是一种更高层次的抽象。如:苹果类、香蕉类和桔子类是具体类,而水果类则是抽象类,在自然界并不存在水果类本身的实例,而只存在它的具体子类的实例。
Fruit fruit = new Apple(); //创建一个苹果对象,把它看做是水果对象
在语法上,抽象类中可以包含抽象方法,如果抽象类可以实例化,那么在访问抽象方法时将无法执行,因为抽象方法中根本就没有方法体。由此可见,Java编译器不允许创建抽象类的实例是必要的。
abstract class Base {
public void method1() {...} //具体方法
public abstract void method2(); //抽象方法
}
Base base = new Base(); //假定Java编译器没有报错
base.method1();
base.method1(); //运行时Java虚拟机无法执行这个方法
posted on 2006-11-29 00:46
EricWong 阅读(583)
评论(0) 编辑 收藏 所属分类:
Java