Discuss / Java / 打卡~~

打卡~~

Topic source
/*
*****************************************************************************
* @authur      : tangxi.zq
* @time        : 2019-06-17
* @file         : 抽象类
* @Description : 如果父类方法无需实现功能,仅仅是为了定义签名,目的是让子类去覆写,那么可以把父类的方法声明为抽象方法。
                 含有抽象方法的类必须定义为抽象类,无法实例化。
                 抽象类本身被设计成只能继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错,相当于定义了规范。

                 
                 
******************************************************************************
*/

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

    public Income(double income)
    {
        this.income = income;
    }
    public abstract double getTax();
}
/**
 * 工资计税
 */
class SalaryIncome extends Income
{
    public SalaryIncome(double income)
    {
        super(income);
    }

    @Override
    public double getTax()
    {
        if (this.income <= 5000) {
            return 0;
        }
        return (this.income - 5000) * 0.2;
    }
}
/**
 * 稿费计税
 */
class RoyaltyIncome extends Income
{
    public RoyaltyIncome(double income)
    {
        super(income);
    }

    @Override
    public double getTax()
    {
        return this.income * 0.1;
    }
}

-hanzx

#2 Created at ... [Delete] [Delete and Lock User]

可以的胖友

不明白。

【含有抽象方法的类必须定义为抽象类,无法实例化】,

然而,代码里却又

Income[] incomes = new Income[] {new SalaryIncome(7500), new RoyaltyIncome(12000) };

明明是抽象类,却被实例化了。为什么?而且,这种编译也能通过的,搞不明白

回楼上:

因为这里实际上并没有对Income类进行实例化,Income[]数组中实际上实例化的是 new SalaryIncome() 和 new RoyaltyIncome(),Income类只是变量类型而非实例类型。

就好像上面的教程当中有Person类为抽象类,Student类和Teacher类则为具体的子类,Person p = new Student()这样写是没有问题的,因为本质上实例化的是Student而不是Person类,

这里也是一样,代码中并没有new Income(),所以没有问题。

回复 楼上 明明是抽象类,却被实例化了。为什么?  这里是通过 匿名子类 创建 对象的 后面章节 内部类 会讲到 

仔细看 后面 有对 {}

想一想 之前,你 创建对象的时候 后面 有 {} 的么???

我去 成功 被楼上带偏了  

Income[] incomes = new Income[] {new SalaryIncome(7500), new RoyaltyIncome(12000) };

这不就是创建了一个 Income 类型的数组么???

根据多态 原理 父类引用指向了 子类 对象

这个“求女票上微博”一句话打这么多空格,跟个不会组织语言的nt一样

🌙

#8 Created at ... [Delete] [Delete and Lock User]

我去 之前是真的白 才会被 带偏...

创建数组  还可以进一步 简化 ,这个  Income 是普通类啊 哪里是抽象类了....

Income[] incomes ={ new Income(3000), new Salary(7500), new StateCouncilSpecialAllowance(15000) };

最后,打字 风格 也会被人病垢 么? 算了,懒得理他...

又咬不到...

🌙

#9 Created at ... [Delete] [Delete and Lock User]

就是创建了一个Income类型的数组....

Junes_99994

#10 Created at ... [Delete] [Delete and Lock User]

抽象类(数组)存放的是其子类的引用地址,也就是访问子类的钥匙,被实例化的仍是子类。


  • 1
  • 2

Reply