Java方法覆盖Override

一、是什么:

方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法。这样就能在子类中弄出一个同名的、更适合自身或者是效率更高的方法。

其实,“重写”和“覆盖”这两个词是从两个不同的角度描述了这种编程机制。“重写”是从编码的角度来说的,它体现了子类“重新编写”了父类的某个方法,因此叫“重写”。而“覆盖”是从代码运行效果的角度来说的,它形象的体现出:当子类重写了父类的某个方法之后,当子类对象通过方法名称调用该方法,不会调用到父类中定义的那个方法,只能调用到子类中所定义的那个同名方法,父类中的那个方法如同被子类中重新定义的同名方法覆盖住不见踪影一样,因此叫“覆盖”。

和重载对比:
在这里插入图片描述

二、三同不降不多抛

1、三同:子类重写的方法要与父类中原方法的名称、参数和返回值都相同。其中子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类。

eg:
在这里插入图片描述

2、不降:子类方法不能缩小父类方法的访问权限:public>protected >默认>private

eg:父类声明方法的访问度为“public”,子类就不能擅自将方法的访问度降为“protected”或者是更低的访问度,否则将无法通过语法检查。

3、不多抛:子类重写父类方法时,不能用throws关键字声明抛出更多的异常。这里的“更多”并不是指数量上的多,而是指范围不能扩大。

eg:
在这里插入图片描述

三、@Override

我们在实际开发过程中,有的时候会因为粗心导致子类并没有真正的重写父类的方法。比如说父类定义的方法名为”sum”,而子类中却把这个方法错误的写成了”snm”。程序员可能因为粗心没有发现这个错误,导致自己写了半天代码却没有实现“覆盖”的效果。为了避免这种错误,我们在重写某个方法的时候,可以在方法的上面加上@Override注解。一旦加上这个注解,编译器就知道这个方法是意图覆盖父类中的某个方法,于是就会检查父类中是否有同名方法,如果发现子类中的方法与父类中任何一个方法都不同名,那么就标出语法错误来提示程序员。同时,其他程序员看到@Override注解,也能立刻明白这个方法是重写了父类的某个方法。因此,我们最好在所有重写的方法前面都要加上@Override注解。

当子类重写了父类中的某个方法之后,如果从子类内部去调用这个方法的时候,调用到的一定是重写之后的那个方法。
在这里插入图片描述
从图上我们可以看出,在子类的method()方法中去调用test()方法,调用到的是子类重写过的test()方法。但是,如果我们希望在子类内部调用父类中那个被覆盖了的test()方法该怎么办呢?这时候,我们必须在方法的前面加上super关键字,代码如下:
在这里插入图片描述

四、final

如果我们定义一个类,能否不让子类去重写这个类中的方法呢?当然是可以的,我们只要在某个方法的前面加上一个final关键字,那么子类就无法重写这个方法啦!

五、屏蔽父类属性

1、子类屏蔽父类属性与父类属性的类型及访问修饰符无关
在这里插入图片描述
父类中定义了一个属性名叫a,类型为int,访问度为public,子类中完全可以再定义一个叫a的属性,这个a属性可以与父类中a属性类型不同、访问度不同、初始值不同,完全不会有任何语法问题,只要属性的名称相同就能实现屏蔽效果。

2、属性的访问由引用(而非对象)决定

在这里插入图片描述
通过上图我们可以看到,代码中分别创建了三个对象,其中第二条语句是父类的引用指向了子类的对象。在这种情况下,通过父类的引用super2去访问a属性,访问到的是父类(即SuperClass类) 中的a,而非子类中的a。这一点与方法的访问效果是不同的,小伙伴们一定要注意这个细节。

3、通过super关键字访问被屏蔽的属性
在这里插入图片描述

子类的方法如果直接访问a,那么肯定是访问子类自身的a。如果我们想要访问被屏蔽的父类a属性,只要加上一个super关键字就可以了,这跟访问被子类覆盖了的方法是一样的效果。

4、final关键字无法阻止屏蔽

在这里插入图片描述
从图中的代码可以看出,父类的a属性前即使加上了final关键字,子类仍然可以定义一个同名属性来屏蔽父类中的a属性,完全不会出现任何语法问题。有小伙伴会问:既然加上final关键字无法阻止屏蔽,那么这个关键字有什么意义呢?答案是:这个final关键字能够防止父类中的a属性被修改值,使之成为一个常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值