黑马程序员技术交流社区
标题: 抽象类 [打印本页]
作者: 懒猫丶over 时间: 2017-12-4 16:42
标题: 抽象类
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. 图解
作者: 奥斯托洛夫斯基 时间: 2017-12-8 15:24


作者: Yin灬Yan 时间: 2017-12-8 15:44
我来占层楼啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |