Java——覆写(概念、覆写的意义、覆写的要求)

举报
Winter_world 发表于 2021/09/29 00:59:45 2021/09/29
【摘要】 目录 1、方法的覆写 2、属性覆盖 3、总结 1、方法的覆写 当子类定义了与父类中完全一样的方法时(参数名称、参数类型及个数、返回值类型),这样的操作就为方法的覆写。 【举例】:观察方法的覆写 public class MainActivity extends AppCompatActivity { @Overr...

目录

1、方法的覆写

2、属性覆盖

3、总结


1、方法的覆写

当子类定义了与父类中完全一样的方法时(参数名称、参数类型及个数、返回值类型),这样的操作就为方法的覆写。

【举例】:观察方法的覆写


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. B b = new B();
  6. b.print();
  7. }
  8. }
  9. class A{
  10. public void print(){
  11. System.out.println("********A*********");
  12. }
  13. }
  14. class B extends A{
  15. }

B是A的子类,B中没有定义方法

此时,在B中定义与A中完全一样的方法:


  
  1. class B extends A{
  2. public void print(){
  3. System.out.println("********B*********");
  4. }
  5. }

以上实例化的是B类,B类中定义了与其父类完全相同的方法print(),所以最后调用的一定是被覆写过的方法。

1)方法覆写的意义:

  • 1、父类中定义的方法名称是其他程序认可的,但是子类使用时发现,原有方法不能满足现在的操作要求,但要保留原方法名称,因此出现了覆写的概念;
  • 2、this方法与super方法的区别:

           --this.方法():先找本类中是否有指定的方法,若没有,则使用父类继承的方法;
           --super.方法():不查找本类的方法,直接找父类的方法;

2)但是覆写本身也是有要求的:

被覆写的方法不能有比父类更严格的访问控制全权限。对于访问控制权限,严格来讲一共有四个,目前我们接触有3个,

private  <  default < public,即若父类中的方法使用了public访问权限声明,子类只能使用public,若父类使用的是default,子类只能使用default或public。举例如下:


  
  1. class A{
  2. public void print(){
  3. System.out.println("********A*********");
  4. }
  5. }
  6. class B extends A{
  7. void print(){
  8. System.out.println("********B*********");
  9. }
  10. }

但是有一点需要注意,在父类中若是用private声明的方法,该方法不能被子类所覆写,且这样的操作没有什么实际意义。实际开发中,对于方法的定义,基本都使用public声明。

【注意】Overloading与Override的区别?在进行OverLoading时能否改变返回值类型?

No. 区别 方法重载 方法覆写
1 单次 Overloading Override
2 范围 发生在一个类中 发生在继承关系中
3 定义 方法名称相同,参数类型及个数不同 方法名称、参数类型、个数及返回值全部相同
4 权限 没有权限要求 被覆写的方法不能有比父类更为严格的访问控制权限

进行方法重载时,可以使用不同的返回值类型,但是从设计标准来说,不建议这么做。

2、属性覆盖

当子类中定义了与父类属性名称相同的属性,就成为属性的覆盖。

【举例】:观察属性的覆盖


  
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. B b = new B();
  6. System.out.println(b.info);
  7. }
  8. }
  9. class A{
  10. String info = "hello";
  11. }
  12. class B extends A{
  13. int info = 1;
  14. }

实际开发的标准要求来讲,类的属性必须使用private封装,封装后,覆盖属性就没有意义了。

【注意】:this与super的区别?

No. 区别 this super
1 概念 表示调用本类属性、方法 调用父类属性、方法
2 构造要求 调用构造方法时必须在构造方法的首行,所以this()与super()不能同时出现,但是子类永远会调用父类的构造方法
3 特殊要求 表示当前对象 ----

使用this实际上会先从本类查找需要的内容,若没有,查询父类,而使用super,直接去查找父类。

3、总结

1)所以类中的属性都必须用private定义,这样属性覆盖就没有意义了;

2)方法 的覆写调用特点:

  • 看实例化的是哪个子类的对象;
  • 观察调用的方法是否已经被子类覆写过,若是,则调用覆写过的方法,否则,调用从父类继承而来的方法。

 

作于202004191530,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/105614980

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。