Java:抽象类笔记

抽象类:类中没有包含足够的信息来描绘一个具体的对象。

为什么要创建抽象类?

为了更好的继承,以后能更好的扩展,减少类与类之间的耦合。

什么时候需要创建一个抽象类?

(简单粗暴的理解)某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现, 那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类。

tips: 1. 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。如何理解?

        2.抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

如何创建抽象类?

就像写文章先建立大纲一样:创建3个java文件。

1. 父类 - 抽象类: Employee.java 文件。

2. 子类 - 继承抽象类: Salary.java 文件。

3. 实例化子类: SalaryList.java 文件。

再根据大纲填充内容。

首先来填充抽象类的内容。

抽象类可以声明变量、成员方法、和构造方法。

public abstract class Employee {
    private String name;
    private String address;
    private int number;
    public Employee(String name, String address, int number){
        this.name = name;
        this.address =address;
        this.number = number;
    }
    public double computePay(){
        return 0.0;
    }
    public void mailCheck(){
        System.out.println("Mailing a check to " + this.name + " " + this.address);
    }
    public String toString(){ 
        return name + " " + address + " " + number;
    }
    public void setAddress(String newAddress){
        address = newAddress;
    }
    public String getName(){
        return name;
    }
    public String getAddress(){
        return address;
    }
    public int getNumber(){
        return number;
    }

}

再来看子类如何继承:

  任何子类必须重写父类的抽象方法,或者声明自身为抽象类

public class Salary extends Employee {
    private double salary;
    public Salary(String name, String address, int number, double salary){
        super(name, address, number);
        setSalary(salary);
    }
    public void mailCheck(){
        System.out.println("Within mailCheck of Salary class");
        System.out.println("Mailing check to " + getName() + " with salary " + salary);
    }
    public double getSalary(){
        return salary;
    }
    public void setSalary(double newSalary){
        if(newSalary >= 0.0){
            salary = newSalary;
        }
    }

//    @Override  伪代码,表示重写(不写也可以),写上的好处:
    //可以当注释用,方便阅读;编译器可以帮你检查方法的方法名是否父类中所有的,如果没有则报错
    //如果你不加@Override,则编译器将不会检测出拼写错误,而是会认为你为子类定义了一个新方法:
    public double computePay() {
//        return super.computePay();
        System.out.println("Computing salary pay for " + getName());
        return salary/52;
    }
}

最后实例化:

  继承了抽象类Employee的子类Salary的实例化

public class AbstractDemo { //继承了抽象类Employee的子类Salary的实例化
    public static void main(String [] args){
        Salary s = new Salary("aaa", "Beijing", 2, 5.0);
        Employee e = new Salary("bbb", "Beijing", 3, 6.0);
        s.mailCheck();
        e.mailCheck();
    }
}

 

posted @ 2017-08-29 11:38  kiera  阅读(422)  评论(0编辑  收藏  举报