· 以廖雪峰Java教程为复习本
· 面向对象三大特性- - -继承、封装、多态
1 方法
1.1 方法的作用
作用一
一个类通过定义方法,就可以给外部代码暴露一些操作的接口,同时也能保证类自己内部的逻辑一致性。
· 每个类都会有属性,如果属性的访问不加限制都用public,那么这个类的属性可以被外部代码随意更改,类就失去了封装特性,具体如下图:
· 为了保证类的封装性不被破坏,就给类中的属性加上更严格的访问控制符private,也就是只有类自己可以访问,其他外部代码其他外部类都不能访问更不能更改
· 那么定义这个属性干啥子呢?又不能访问也不能修改。没关系,接下来就是方法出场的时候了。在方法中配置一些保证这些属性在正确范围内的逻辑,就可以让外部代码通过调用方法在合理的情况下访问属性修改属性了,具体如下:
· 虽然外部代码不能直接修改private字段,但是,外部代码可以调用方法setName()和setAge()来间接修改private字段。在方法内部,我们就有机会检查参数对不对 比如,setAge()就会检查传入的参数,参数超出了范围,直接报错。这样,外部代码就没有任何机会把age设置成不合理的值。
作用二
** 外部调用方法的代码不知道自己得到的这个返回值究竟是一个存储在某字段的值,还是一个通过方法得到的实时计算值**
1.2 this变量
1.3 方法的参数
参数传值
参数传址
2 方法重载(overload)
3 继承
3.1 继承的功能- - -代码复用
3.2 继承树
3.3 控制符 protected
3.4 变量super
4 多态
4.1 覆写(override)
· 方法签名 = 方法名 + 形参(个数、类型)
· 不同的方法:方法名 、形参、返回值类型其中任意一个不同都是不同的方法
· 同一个方法:方法名、形参、返回值类型都相同
· 覆写override是在父类子类之间,方法签名和返回值类型都相同,只有方法体不同
· 重载overload 是在同一个类中发生的,方法名和返回值类型是相同的,形参的个数和类型有可能不同
4.2 多态
· 针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法;
· 运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法。
·允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码
· 方法重载overload:一个对象有多个功能相似的方法,这些方法的返回值类型一般是相同的,因为不同的形参个数和类型,所以在方法体内的安排上有一些差异,所以这个时候使用方法重载,这些功能相似的方法可以简便的使用同样的方法名
· 方法重写override:子类继承父类时,会继承父类protect的所有方法和属性字段,子类对于某个属性字段的方法或父类其他的功能方法有不同的处理方式。其中对“相同”属性字段的处理功能扩展,就是方法重写的应用场景:外部使用者只需要传入实际的参数,外部使用者指出的方法名也是统一的,这个参数对应的所有子类和父类内部会判断这个实际参数是哪个类的类型并在运行时调用这个类对应的这个方法;也就是根据实例所属的类,调用它对应的方法;是一种简化的“接口封装”思想,同时便于功能扩展,当然这里的功能扩展就是如果想要添加新的对象,这个对象想要创新扩展的父类方法也能很方便的被扩展,父类提供一个底层方法就可以一劳永逸,剩下的事情交给子类们自己看着办
public class Main {
public static void main(String[] args) {
// 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
Income[] incomes = new Income[] {
new Income(3000),
new Salary(7500),
new StateCouncilSpecialAllowance(15000)
};
System.out.println(totalTax(incomes));
}
public static double totalTax(Income... incomes) {
double total = 0;
for (Income income: incomes) {
total = total + income.getTax();
}
return total;
}
}
class Income {
protected double income;
public Income(double income) {
this.income = income;
}
public double getTax() {
return income * 0.1; // 税率10%
}
}
class Salary extends Income {
public Salary(double income) {
super(income);
}
@Override
public double getTax() {
if (income <= 5000) {
return 0;
}
return (income - 5000) * 0.2;
}
}
class StateCouncilSpecialAllowance extends Income {
public StateCouncilSpecialAllowance(double income) {
super(income);
}
@Override
public double getTax() {
return 0;
}
}
4.3 调用super
4.4 控制符 final
5 抽象类
5.1 抽象方法
5.2 抽象类
6 接口
7 实例字段v.s.静态字段