1.抽象类
类的声明中有abstract关键字的类称为抽象类,抽象类位于类的层次较高层次,不能被实例化,即不能创建抽象类的实例对象。没有abstract关键字修饰的类称为具体类,具体类可以实例化。
在程序设计中,抽象类常用于对某些类进行概括和抽象,即抽象类定义其子类共有的属性和方法,以免子类重复定义。也就是说,抽象类主要用于定义为若干个功能类同的类的父类。
定义抽象类的目的是为了其子类奠定基础,而不是作为创建对象的模板。
抽象类的声明语句格式如下:
public abstract class 抽象类名{ 类体; }
抽象类具有以下特点。
(1)不能new创建抽象类的实例。
(2)与具体类相同的是,类中可以有成员变量和成员方法,包括构造方法,但与具体类不同的是,抽象类中可以定义抽象方法。
(3)抽象方法只能出现在抽象类中,但抽象类中可以没有抽象方法。
(4)抽象类中的所有抽象方法必须在其非抽象子类中加以实现,否则子类也必须声明为抽象类。
2.抽象方法
类的成员方法中声明有abstract关键字修饰的方法称为抽象方法。抽象方法用来描述系统的功能或者规范某些操作。没有abstract关键字修饰的方法称为具体方法,具体方法必须有方法体。
抽象方法的格式如下:
权限修饰符 abstract 返回值类型 方法名(形式参数列表);
例如:
abstract void eat(); //抽象方法
则声明类中的eat()方法为抽象方法。但是,需要说明的是构造方法不能被声明为抽象的;abstract和static不能同时存在,即不能有abstract static 方法。
Java中规定,任何包含抽象方法的类必须被声明为抽象类。因为抽象类中包含没有实现的方法,所以抽象类是不能直接用来定义对象。
在程序设计中,抽象类主要用于定义为若干个功能类同的类的父类。
package page106; abstract class Animal{ String str; Animal(String s){ //定义抽象类的一般方法 str=s; } abstract void eat(); //定义抽象方法 } class Horse extends Animal{ String str; Horse(String s){ super(s); //调用父类的构造方法 } void eat() { //重写父类的抽象方法 System.out.println("马吃草料!"); } } class Dog extends Animal{ String str; Dog(String s){ super(s); } void eat() { System.out.println("狗吃骨头!"); } } public class Test { public static void main(String[] args) { Animal h=new Horse("马"); Animal d=new Dog("狗"); h.eat(); d.eat(); } }
输出结果为:
马吃草料!
狗吃骨头!
上述例子说明:
<1>在程序设计中,抽象类一定是某个类或某些类的父类。
<2>若干个抽象类的子类要实现一些同名的方法。
3.最终类和最终方法
最终类是指不能被继承的类,即不能再用最终类派生子类。在Java语言中,如果不希望某类被继承,可以声明这个类为最终类。最终类用关键字final来说明。
例如: public final class FinalClass{ //... }
Java规定,最终类中的方法都自动成为final方法。在Java中Math类是最终类,因为里面的方法不能被修改。
如果创建最终类似乎不必要,而又想保护类中的一些方法不被重写,可以用关键字final来指明那些不能被子类重写的方法,这些方法称为最终方法。
例如: public final void fun();
package page107; class Person{ String name; public Person() { } final String getName() { return "person"; } } class Student extends Person{ public Student() { } //final String getName(){ // return "student"; //} //重写父类的最终方法,不允许 }
在程序设计中,最终类可以保证一些关键类的所有方法,不会再以后的程序维护中,由于不经意的定义子类而被修改;最终方法可以保证一些类的关键方法不会再以后的程序维护中由于不经意定义子类和覆盖子类的方法而被修改。
需要注意的是一个类不能既是最终类又是抽象类,即关键字abstract和final不能合用。在类声明中,如果需要同时出现关键字public和abstract(或final),习惯上,public放在abstract(或final)的前面。