方法重写 多态

简介: 方法重写 多态

11、方法的重写

重写的规定

@Override

权限修饰符返回值类型方法名(形参列表){

    // 方法名

}

  • 子类重写父类的方法
  • 方法名必须相同
  • 参数列表必须相同
  • 方法体(具体的实现不同)
  • 修饰符:
  • 范围可以扩大但不能缩小
  • 抛出的异常:范围可以被缩小,但不能扩大
  • 特殊情况:
  • 子类不能重写父类private的方法
  • 返回值类型:
  • 父类被重写的方法返回值为void,则子类重写的方法的返回值类型只能是void
  • 父类被重写的方法的返回值是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
  • 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的基本数据类型
  • 子类和父类的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写,随着类加载而加载)
  • 静态方法:方法的调用只和左边,定义的数据类型有关(即调用的数据类型)。所以重写只能是非静态方法
  • 非静态方法,子类重写父类的方法,重写之后都执行子类的方法

重载是同一类里,方法名相同,参数类型不同。 重写是子父类间,子类重写父类的方法,alt+insert,方法名相同,方法内容不同。使用public方式,且不使用static方式。

为什么需要重写

  • 父类的功能子类不一定需要,或者不一定满足

12、多态(声明对象时的多种形态)

  • 父类的引用指向子类的对象 (向上转型) (狗是动物)Father f = new Son();
  • (方法)编译看左边,运行看右边
  • 多态是方法的多态,属性没有多态(编译、运行都看左边)

什么是多态性

  • 父类的引用指向子类的对象

多态的使用:虚拟方法调用

  • 当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法
  • 编译看左边,运行看右边
  • 有了对象的多态性之后,我们在编译期,只能调用父类中声明的方法,但是在运行期间实际执行的是子类重写父类的方法(父类中没有,子类中新加的方法无法通过编译!!!)

多态性的使用前提

  • 必须继承
  • 有方法重写
  • 父类引用子类的对象
  • 只适用于方法,不适用于属性

静态绑定和动态绑定

静态绑定:重载时的调用地址在编译器就绑定了

动态绑定:对于多态,只有等到方法调用的那一刻才知道调用的是什么

13、向上转型和向下转型

  • 前提条件:两种类型必须有继承关系
  • 向上转型就是类的多态
  • 向上转型(子类对象转为父类对象—从右往左看):
  • 父类引用指向子类对象
  • 父类中被子类重写的方法会被子类替换掉,会丢失子类自己所特有的方法
  • Father a = new Son()
  • 可以调用父类类型中的所有成员,但不能调用子类的特有成员

  • 向下转型(父类对象转为子类对象—从右往左看):
  • 使用场景:
    由于向上转型时Person p = new Man();对象p被编译器识别为父类对象而无法调用子类对象所特有的属性和方法,所以需要使用向下转型(其实已经在内存中加载过了,但是由于指向的引用类型限制不能使用)

  • 子类对象指向父类引用
  • Man m = (Man)p 需要强制转换,丢失父类被子类所重写掉的方法
  • 使用强制类型转换时有可能会出现转换失败的问题

向下转型的常见问题

注意:父类对象没有子类对象所特有的功能,不能向下转

Person p = new Person();

Man m = (Man)p; // 编译通过,运行不通过

// Person中没有Man所特有的方法

 

Object obj = new Woman();

Person p = (Person)obj; // 编译通过,运行也通过

instanceof和类型转换

  • 使用场景:为了防止在向下转型之前出现异常
  • 用于判断左边对象是否是右边类/接口的实例
  • 对象 instanceof 类

因为向上转型所以实际指向的是Student类

目录
打赏
0
0
0
0
2
分享
相关文章
|
11月前
|
C++
9. C++虚函数与多态
9. C++虚函数与多态
74 0
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
119 0
|
6月前
用方法重写实现多态
【10月更文挑战第19天】方法重写是实现多态的一种重要手段,它让我们能够根据具体的需求灵活地定义子类的行为,同时也使得代码更加简洁、易读和易于维护。
37 4
C++中的多态和虚函数
#include <iostream> using namespace std; //基类People class People{ public: People(char *name, int age); void display(); protected: char *m_name; int m_age; }; People::People(char *name, int age): m_name(name), m_age(age){} void Peopl
C++中的多态和虚函数
<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数
<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数
192 0
|
11月前
|
C++
C++多继承与多态
C++多继承与多态
35 0
|
11月前
|
C++多态与虚函数
C++多态与虚函数
88 0
『 C++类与对象 』多态之单继承与多继承的虚函数表
『 C++类与对象 』多态之单继承与多继承的虚函数表
【多态-动态绑定-向上转型-抽象类】
【多态-动态绑定-向上转型-抽象类】
62 0