自学内容网 自学内容网

Java学习笔记(15)——面向对象编程

学习资料来自抽象类 - Java教程 - 廖雪峰的官方网站

面向对象基础

目录

面向对象基础

抽象类

引子

抽象类

面向抽象编程

练习


抽象类

引子

定义方法时必须实现方法的语句,所以如果父类的run()方法没有实际意义,也不能去掉方法的执行语句。

也不能去掉父类的run()方法,因为这样失去多态的特性,而且:

public void runTwice(Person p) {
    p.run(); // Person煤油run()方法,导致编译错误
    p.run();
}

如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法:

class Person {
    public abstract void run();
}

把一个方法声明为abstract,表示它为抽象方法,本身没有实现任何方法语句。

抽象方法本身无法执行,所以这个这个方法的类也无法被实例化,那么要把类本身也声明为abstract 才行。

abstract class Person {
    public abstract void run();
}

抽象类

一个类定义了方法,但没有具体执行代码,这个方法就是抽象方法,用abstract修饰。

因为无法执行抽象方法,因此这个类也必须申明为抽象类,抽象类无法被实例化。

面向抽象编程

尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。

本质是:

  • 上层代码只定义规范(例如:abstract class Person)
  • 不需要子类就可以实现业务逻辑
  • 具体的业务逻辑由不同的子类实现,调用者并不关心

练习

public class Main {
    public static void main(String[] args) {
        // TODO: 用抽象类给一个有工资收入和稿费收入的小伙伴算税:
        Income[] incomes = new Income[] {
                new Income(3000) {
                    @Override
                    public double getIncome() {
                        return income;
                    }
                    @Override
                    public double getTax() {
                        return 0;
                    }
                },
                new SalaryIncome(7500),
                new RoyaltyIncome(12000)
        };
        double total = 0;
        // TODO:
        for (Income income : incomes) {
            total += income.getTax();
        }
        System.out.println(total);
    }
}

abstract class Income {
    protected double income;

    public Income(double i) {
        income = i;
    }

    Income() {
    }

    public abstract double getIncome();
    public abstract double getTax();
}

class SalaryIncome extends Income {
    @Override
    public double getIncome() {
        return income;
    }
    // TODO
    public SalaryIncome(double income) {
        this.income = income;
    }
    @Override
    public double getTax() {
        if(income <= 5000) {
            return income;
        }
        return (income - 5000) * 0.2;
    }
}
class RoyaltyIncome extends Income {
    @Override
    public double getIncome() {
        return income;
    }

    @Override
    public double getTax() {
        return 0;
    }

    public RoyaltyIncome(double income) {
        this.income = income;
    }
}


原文地址:https://blog.csdn.net/Sthamansa/article/details/144677263

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!