(一)抽象类的定义
- 如果至上而下在类的继承层次中上移,位于上层的类更具有通用性,甚至可能更加抽象。举个例子,考虑一下Employee类层次的扩展。一名雇员是一个人,一名学生也是一个人,(俩个类之间的关系如下图)为什么要花精力进行这样高层次的抽象呢?因为每个人都有一些诸如姓名这样的属性,因此我们可以将getName方法放置在位于继承关系较高层次的通用超类中。
(二)抽象类的操作与分析
(1)操作
- 我们可以在Person里再添加一个getDescription方法,返回一个人的描述,为了提高程序的清晰度,包含一个及以上的抽象方法的类必须被声明为抽象的。抽象类还可以包含具体数据和具体方法
public abstract String class Person{
private String name;
public Person(String name){
this.name=name;
}
public abstract String getDescription();
public String getName(){
return name;
}
}
- 下面是一个扩展抽象类Person的具体子类Student,这个类定义了getDescription方法
public class Student extdens Person{
private String major;
public Student(String name,String major){
super(name);
this.major;
}
public String getDescription(){
return "a student major in"+major;
}
}
(2)分析
- 类即是不含抽象方法,也可以声明为抽象类。
- 抽象类不能实例化,就不能创建这个类的对象。
//实例化对象
new Peroson("Vince Vu");
- 但是可以创建一个具体子类的对象,需要注意,可以定义一个抽象类的对象变量,但是他只能引用非抽象子类的对象,例如:
//测试类
//这里p是一个抽象类Person的变量,Person引用了一个非抽象子类Student的实例
public class Test{
public static void main(String [] args){
Person p =new Student("小明",“数学”);
System.out.println(p.getDescription());
}
}
上面中你可能会有个疑问,这不是调用了一个没有定义的方法吗 p.getDescription(); 记住由于不能构造抽象类Person的对象,所以p永远不会引用Person对象,而是引用Employee或Student这样的具体子类对象,如上上述中p指向Student类,输出学生信息,如果指向Employee类,则输出员工信息。
(三)抽象类总结(重点知识)
- 象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
- 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。