Java学习笔记——抽象类

    xiaoxiao2022-07-07  210

    在整个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); }

    }

    最新回复(0)