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)!