方法重写、重载与多态

参考内容

方法重写(方法覆盖):

1.子类方法的形参列表、方法名称要和父类的形参列表、方法名称完全一致。

2.子类的返回类型和父类的返回类型一致,或者是父类返回类型的子类

3.子类的方法不能缩小父类方法的访问权限(public > protected > 默认 > private)

父类私有方法,子类看不到,因此父类私有方法的重写也就无从谈起。

静态只能覆盖静态

执行顺序:父类静态代码块→子类静态代码块→父类构造代码块→父类构造方法→子类构造代码块→子类构造方法

重写与重载的比较:

重载overload,覆盖override,重写overwrite,这三者之间有什么区别?

a. overload,将语义相近的几个函数用同一个名字表示,但是参数和返回值不同,这就是函数重载。

特征:相同范围(同一个类中)、函数名字相同、参数不同、virtual关键字可有可无。

b. override,派生类覆盖基类的虚函数,实现接口的重用。(虚拟函数的行为可以用同名的继承类函数重写。它基本上是在基类中定义的,并在继承类中重写。

Java中的虚拟函数应该在派生类中定义。我们可以通过使用基类的引用或指针引用派生类的对象来调用虚函数。Java中的每个非静态方法默认都是虚方法。Java没有像C 那样的虚拟关键字,但是我们可以定义它们,并将它们用于运行时多态性等概念。)

特征:不同范围(基类和派生类)、函数名字相同、参数相同、基类中必须有virtual关键字C(必须是虚函数)。

c. overwrite,派生类屏蔽了其同名的基类函数。

特征:不同范围(基类和派生类)、函数名字相同、参数不同或者参数相同且无virtual关键字。

Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法(这个说法存在争议,但是我认同这一说法,继承之后,子类也拥有父类的方法,那么这重载的方法和原方法可以看成在一个类中的重载吧)

多态:

 编译时期多态:其又被称为静态多态,编译时期的多态是靠重载实现的,根据参数个数,类型和顺序决定的(必须在同一个类中)

运行时的多态:运行时期的多态是靠方法的重写实现的,在编译期间被视作相同方法,但是运行期间根据对象的不同调用不同的方法

注意点:

(1)一个对象的编译类型和运行类型可以不一致

(2)编译类型在定义对象时就确定了,不能改变

(3)运行类型是可以改变的

(4)编译类型看定义时的“=”左边,运行类型看“=”右边

例如: Animal animal = new Dog();        animal = new Cat();

此处的Animal是编译类型,Dog和Cat都是运行类型

对象多态的前提:两个类之间存在继承关系。

(一)向上转型:(本质是父类的引用指向了子类的对象)

语法:父类类型 引用名 = new 子类类型()

特点:变异类型看左边,运行类型看右边,可以调用父类的所有成员(但也要看访问权限),不能调用子类特有的成员,因为本质上是一个父类的引用,在编译阶段,能调用哪些成员,是由编译类型决定的。

最终的运行效果要看子类的具体实现,即调用方法时,按照从子类开始查找方法,然后调用,子类没有,调用父类,与继承调用方法一致。

(二)向下转型

语法:子类类型  引用名 = (子类类型)父类引用;

只能强转父类的引用,不能强转父类的对象。一定不能够将父类的对象转换成子类类型!父类的引用指向子类对象,该引用可以被提升,也可以被强制转换多态自始至终都是子类对象在变化!

要求父类的引用必须是指向当前目标类型的对象

比如:Animal  animal = new Cat();        Dog dog = (Dog)animal;//这样是错误的,因为目标类型是cat类,不是dog类。

可以调用子类类型中所有的成员,因为是子类的引用。

!!!属性没有重写之说,属性的值要看编译类型!!!

!!!属性按照编译类型,方法按照运行类型查找!!!

instanceOf:比较操作符,用于判断对象的类型是否为XX类型或者为XX类型的子类型

因为方法当发生重载时,调用同一个类的不同重载方法,也是一种多态的思想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值