1. 概念理解 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。 但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢? 分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。 2. 比较区别 与具体类比较 (1) 抽象类不能直接实例化,并且对抽象类使用 new 运算符会导致 编译时错误。虽然一些变量和值在编译时的 类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的 引用(此非抽象类是从抽象类派生的)。 (2) 允许(但不要求)抽象类包含抽象成员。 (3) 抽象类不能被密封。 与接口比较 抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。 接口是引用类型的,和抽象类的相似之处有三点: (1) 不能实例化; (2) 包含未实现的方法声明; (3) 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)。[2] 抽象类与接口紧密相关。然而接口又比抽象类更抽象,这主要体现在它们的差别上: (1) 类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决 多重继承问题的。 (2) 抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。 (3) 抽象类中的 成员变量可以被不同的 修饰符来修饰,可接口中的成员变量默认的都是静态 常量(static final)。 (4) 抽象类是对象的抽象,然而接口是一种行为规范 3. 运用要求 (1) abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。 (2) 在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。 (3) abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 (4) 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。 (5) 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。 (6) 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 (7) 接口中的方法默认都是 public,abstract 类型的。 4. 运用实例 //测试类 /* * 基础班老师,就业班老师 共性 属性 姓名,年龄,性别 行为 讲课 * */ public class AbstractTest { public static void main(String[] args) { //创建的基础班老湿对象 BasicTeacher bt = new BasicTeacher(); //为老湿对象的成员变量进行赋值 bt.setName("风清扬"); bt.setAge(50); bt.setGender("男"); bt.teach(); //创建就业班老湿对象 JobTeacher jt = new JobTeacher(); //为老湿对象的成员变量进行赋值 jt.setName("丁老师"); jt.setAge(18); jt.setGender("女"); jt.teach(); } } //老师类 public abstract class Teacher { private String name;//姓名 private int age;//年龄 private String gender;//性别 public Teacher() { super(); // TODO Auto-generated constructor stub } public Teacher(String name, int age, String gender) { super(); this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public abstract void teach(); } //基础班老师类 public class BasicTeacher extends Teacher { @Override public void teach() { System.out.println(getName() + "讲基础班课程"); } } //就业班老师类 public class JobTeacher extends Teacher{ @Override public void teach() { System.out.println(getName() + "讲就业班课程"); } } 5. 图解
|