一. 重写
继承的主要功能首先是让子类能复用父类的成员(属性 方法),
但最主要的继承原因其实是让子类扩展父类的功能
扩展功能有两种实现形式:
1. 增加子类特有的功能
2. 重写父类已有的功能
问: 什么时候重写?
当对父类的方法功能不满意或者不符合子类的要求, 就需要重写
问: 如何实现重写 ?
最基本的重写就是子类的方法描述和父类方法的描述完全一致
访问修饰符 public / private
返回类型 void
方法名 method
参数列表 (int a, double b)
问: 如何实现方法重载 ?
同名不同参(方法名相同, 参数列表不同)
参数列表要求: 个数不一样, 类型不一样, 顺序不一样(鸡肋)
子类中可以实现父类方法重载;
★: 重写之后如何分析对象调用的方法
1. 实例化的是哪个类
2. 实例化的类中调用的方法是否为重写的方法,
如果没重写则调用父类的方法
有哪些方法看前面的类型
以下示例是否构成重写 ?
1. 关于返回值类型不同
class Parent{
public void run(){
System.out.println("跑步");
}
}
class Child extends Parent{
public int run(){ //int会编译报错
System.out.println("子类跑步");
return 2;
}
}
结论: 子类在重写父类方法的时候, 返回类型不一致会产生编译错误
2. 关于访问修饰符不同
class Parent{
public void run(){
System.out.println("跑步");
}
}
class Child extends Parent{
private void run(){ //编译报错
System.out.println("子类跑步");
}
}
结论: 子类在重写父类方法的时候, 访问权限一定要大于等于父类的访问权限,
如果父类的方法的public, 那么子类的访问修饰符就一定要是public
问: 当一个子类重写了父类的方法后, 如果再想调用父类被重写的方法, 而不是自己的方法时怎么办 ?
答: super.run();
★★★★★
思考 : 父类使用了private , 子类重写用了public , 有没有实现重写 ?
答: 这种情况虽然没有编译报错, 但是也没有到达重写的机制
二. 多态 ★★★★★ 封装: 安全性 继承: 重用性
多态是面向对象的第三大特性, 主要是作用是提高程序的扩展性
多态有两种形式:
1. 方法多态
静态多态(编译时多态): 重载
同一个方法名, 根据参数列表不同执行不同的方法体
在编译的时候就确定调用的方法
add(int a)
add(int a, int b)
add(int a, int b, int c)
动态多态(运行时多态): 重写
同一个方法名, 根据子类对象的不同执行的不同的方法体
在运行的时候才确定调用的方法
剪(): 能到达多态的形式
医生.剪();
理发师.剪();
园林师.剪();
2. 对象多态 : ★★★★★
多态只发生在有继承关系的子类与父类之间
向上转型(自动转换 安全) 动物 dw = new 猫();
术语: 父类引用指向子类对象
向下转型(强制转换 危险) 猫 m = (猫)dw;
之前基本类型类似语法:
double a = 10; 自动转型
int b = (int)32.5; 损失精度 强制转型