在整个Java的继承体系中,层次越高的类所具有的通用性越高,甚至可能更加抽象。在某种程度上而言,祖先类更加通用,人们在大部分时间里都将祖先类作为其他类的一中派生。
在Employee类和Student类中,每个人都会有一些诸如名字这样的属性,所以我们为什么不把getName这样的方法放置在地位更高的通用父类中》?
现在再添加一个getDescription方法,他可以返回一个人的一些基本信息。例如:an Employee with salary of 12,333
a Student majoring in Science
如果我在Student类和Employee类的共同父类Person中实现这个方法该如何进行呢?我可以让Person.getDescription()方法返回一个空的字符串,但同时,也可以让Person类家关键字abstract,这样就完全不需要去具体的对这个方法进行实现了。
public abstract class Person{
public abstract getDescription();
}//抽象方法定义
无论是抽象类还是抽象方法,都需要添加关键字abstract
在抽象类的内部还可以包含具体的数据和具体方法,例如,Person类可以保存姓名的实例域和一个返回姓名的具体方法。
public abstract class Person{
private String name;
public Person(Sring name){
this.name=name;
}
public String getName(){
return name;
}
public abstract getDescription();
}
类即使不含抽象方法,也可以将类声明为抽象类,但是抽象类不能被实例化,例如说上述的抽象类,我使用表达式 new Person("Reus")
是会被编译器报错的。
但是我可以通过具体子类来对抽象类进行实例化,例如Person p=new Employee(“Rues”,11);
是合法的
这里的p是一个抽象类Person的变量,Person引用了一个非抽象子类Employee的实例对象。
一个人完整的定义抽象超类Person和两个具体子类的方法程序如下;供参考
主方法所在的类:
public class StringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person[] p=new Person[2];
p[0]=new Employee("Reus",11);
p[1]=new Student("Brant","football");
for(Person pa:p)
System.out.println(pa.getName()+","+pa.getDescription());
}
}
Person抽象父类:
public abstract class Person {
public abstract String getDescription();
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Employee子类:
public class Employee extends Person implements Comparable {
private String name;
private double salary;
public Employee(String name,double salary) {
super(name);
this.name=name;
this.salary=salary;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public void raiseSalary(double byPercent) {
double raise=salary*byPercent/100;
salary+=salary;
}
public int compareTo(Employee Other) {
return Double.compare(salary, Other.salary);
}
public String getDescription() {
return String.format("a Employee called "+name+" whose salary is "+salary);
}
}
Student子类:
public class Student extends Person {
private String name;
private String major;
public Student(String name,String major) {
super(name);
this.name=name;
this.major=major;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return String.format("a Student names "+name+" major in "+major);
}
}