(一)抽象类的定义

  • 如果至上而下在类的继承层次中上移,位于上层的类更具有通用性,甚至可能更加抽象。举个例子,考虑一下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类,则输出员工信息。


(三)抽象类总结(重点知识)

  1. 象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
  5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

相关文章: