最近在看JAVA核心技术卷1,下面是我自己的理解,如果有不对的地方,欢迎大家指正
抽象类和抽象方法都由abstract关键字标记,拥有抽象方法的类就肯定是抽象类,但是抽象类不一定包含抽象方法
抽象方法
先来看下抽象方法的写法
// 类和方法都由abstract 标记,因为包含抽象方法的类肯定是抽象类,所以类也要由abstract 标记
public abstract class Person{
// 抽象方法没有方法体{},不需要具体实现其中的内容
// 抽象方法应该被定义为public或protected,如果定义为private则不能被子类继承,就没法实现这个方法
// 如果不指定访问权限,则默认为public
public abstract void getDescription();
}
抽象类
上面已经说过了,拥有抽象方法的类就肯定是抽象类,但是抽象类也可以不包含抽象方法
我们已经有父类和子类了,一般会继承父类来创造想要的特定实例,那为什么还会提供一个高层次的抽象类呢?这是因为非抽象方法都是要有具体实现的,而我们有时候只是知道一组子类的共同特性,但还不清楚具体要怎么实现,而定义成抽象方法就不需要实现了。子类只需要继承抽象类,再实现其抽象方法即可。
举个例子
比如学生类(Student),员工类(Employee),人类(Person)
Person类是Student类,Employee类的父类
我们都知道无论是学生还是员工他们都有姓名,年龄,以及个人性格,
姓名和年龄我们明确知道要怎么实现,所以定义成普通方法即可,但是个人性格我们还不太清楚,所以定义成抽象方法
public abstract class Person{
private String name;
private int age;
public Person(String name ,int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public abstract String getDescription();
}
public class Student extends Person(){
public abstract String getDescription(){
return "a student";
}
}
public class Employee extends Person(){
public abstract String getDescription(){
return "a Employee ";
}
}
抽象类的使用
-
抽象类不能被实例化,如果将一个类声明为abstract,就不能创建这个类的对象,new Person()会报错,但可以创建具体的子类对象;
-
扩展抽象类的两种选择
在子类中保留抽象类中的部分或所有抽象方法,扔不具体实现,这样就必须将子类也设置成抽象类; 在子类中定义全部方法,这样子类就不是抽象类了。