我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下

首先我们来看几个概念

隐藏 :child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法

覆盖 :child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问parent被覆盖的变量或者方法

首先看一下JAVA中方法和变量在继承时的覆盖和隐藏规则

1.父类的实例变量和静态变量能被子类的同名变量隐藏

2.父类的静态方法被子类的同名静态方法隐藏

3.父类的实例方法被子类的同名实例变量覆盖

还有几点需要注意的是

1.不能用子类的静态方法隐藏 父类中同样标示(也就是返回值 名字 参数都一样)的实例方法

2.不能用子类的实例方法覆盖 父类中同样标示的静态方法

3.这点儿请注意,就是变量只会被隐藏 不会被覆盖 ,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏 父类的实例变量,子类的实例变量可以隐藏 父类的静态变量

O(∩_∩)O哈哈~ 是不是有点儿绕口,没关系 我们看一个实例

创建两个父子类关系的类

  1. //父类
  2. class Parent
  3. {
  4. public static String kind="javastudy.extendsstudy.parent";
  5. public static int age=50;
  6. public String name="Parent";
  7. //静态方法,返回包名
  8. public static String getKind()
  9. {
  10. System.out.println("parent的getKind()方法被调用了");
  11. return kind;
  12. }
  13. //静态方法,返回年龄
  14. public static int getAge()
  15. {
  16. System.out.println("Parent的getAge()方法被调用了");
  17. return age;
  18. }
  19. //实例方法,返回姓名
  20. public String getName()
  21. {
  22. System.out.println("Parent的getName()方法被调用了");
  23. return this.name;
  24. }
  25. }
  26. //子类
  27. class Child extends Parent
  28. {
  29. public static String kind="javastudy.extendsstudy.child";
  30. public int age=25;
  31. public String name="child";
  32. //隐藏父类静态方法
  33. public static String getKind()
  34. {
  35. System.out.println("child的getkind()方法被调用了");
  36. return kind;
  37. }
  38. //获取父类包名
  39. public static String getParentKind()
  40. {
  41. return Parent.kind;
  42. }
  43. //覆盖父类实例方法
  44. public String getName()
  45. {
  46. System.out.println("child的getName()被调用了");
  47. return this.name;
  48. }
  49. //获取父类名称
  50. public String getParentName()
  51. {
  52. return super.name;
  53. }
  54. /*
  55. *错误,实例方法不能覆盖父类的静态方法
  56. public int getAge()
  57. {
  58. return this.age;
  59. }
  60. */
  61. }

然后测试下

  1. class Test
  2. {
  3. public static void main(String[] args)
  4. {
  5. Child child=new Child();
  6. System.out.printf("子类名称:%s,年龄:%d,包名:%s%n",child.name,child.age,child.kind);
  7. //输出:子类名称:child,年龄:25,包:javastudy.extendsstudy.child
  8. //把child转换成parent对象
  9. Parent parent=child;
  10. System.out.printf("转换后的名称:%s,年龄:%d,包名:%s%n",parent.name,parent.age,parent.kind);
  11. //输出:转换后的名称:Parent,年龄:50,包:javastudy.extendsstudy.parent
  12. System.out.printf("子类访问父类被隐藏的实例变量name:%s%n",child.getParentName());
  13. //输出:子类访问父类被隐藏的实例变量name:Parent
  14. System.out.printf("子类访问父类被隐藏的静态变量kind:%s",child.getParentKind());
  15. //输出:子类访问父类被隐藏的静态变量kind:javastudy.extendsstudy.parent
  16. child.getName();
  17. //输出:child的getName()被调用了
  18. //**************注意看这个方法,返回的还是子类的getName
  19. parent.getName();
  20. //输出:child的getName()被调用了
  21. child.getKind();
  22. //输出:child的getkind()方法被调用了
  23. parent.getKind();
  24. //输出:parent的getKind()方法被调用了
  25. }
  26. }

好了,看了结果后总结下吧

1.同名的实例方法被覆盖 ,同名的静态方法被隐藏 ,child类的getName实例方法覆盖 了parent的getName实例方法,chind的getKind方法隐藏 了parent类的getKind方法

2.隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法

3.如果需要访问父类被隐藏 的实例变量,加上super就好了,比如访问父类的name,写上super.name就好了

本文不是教会大家重写父类变量的,而是重点说明方法和变量的隐藏和覆盖,这些个小知识点虽然在做项目的时候不怎么会用到,但是一定要记住,不然的话很多错误会感到莫名其妙,还有就是SCJP的题库里这类题大大存在,所以本人觉得这些细小的知识还是记住为好

Java 隐藏和覆盖的更多相关文章

  1. Java:类与继承(隐藏和覆盖的问题)

    盒子先生金金   Java:类与继承(隐藏和覆盖的问题) Java:类与继承   Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不 ...

  2. Java 泛型 协变式覆盖和泛型重载

    Java 泛型 协变式覆盖和泛型重载 @author ixenos 1.协变式覆盖(Override) 在JDK 1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值 ...

  3. Android Studio编译OsmAnd出现警告:GeoPointParserUtil.java使用或覆盖了已过时的 API。有关详细信息请使用-Xlint:deprecation重新编译

    [背景] 之前折腾: [记录]Android Studio中导入OsmAnd并编译 期间,遇到了编译警告: 1 2 3 4 5 :OsmAnd-java:compileJava 注: E:\crifa ...

  4. Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖

    ylbtech-Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖 1.返回顶部 1. Java 实例 - 方法覆盖  Java 实例 前面章节中我们已经学习了 Jav ...

  5. Java隐藏手机号中间四位,隐藏身份证中间数字

    原文:https://blog.csdn.net/yuanquanl/article/details/53519577 public static void main(String[] args) { ...

  6. C++父子类继承时的隐藏、覆盖、重载

    存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏.覆盖和重载这几种情况.对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考.希望对大家理解有帮助,也欢迎指正. 1.父子类继承 ...

  7. JAVA隐藏鼠标的方法

    JAVA隐藏鼠标的方法 2012年06月03日 19:13:21 阅读数:2436 JAVA隐藏鼠标光标,可以有2种方法. 都是通过如下语句重新设置光标 Toolkit.getDefaultToolk ...

  8. UnityPlayerActivity.java使用或覆盖了已过时的 API。

    Root\Temp\gradleOut\unityLibrary\src\main\java\com\unity3d\player\UnityPlayerActivity.java使用或覆盖了已过时的 ...

  9. Java中的覆盖和隐藏以及final关键字

    Java覆盖和隐藏 (1) 变量只能被隐藏(包括静态和非静态),不能被覆盖: (2) 可以用子类的静态变量隐藏父类的静态变量,也可以用子类的非静态变量隐藏父类的静态变量,也可以用非最终变量(final ...

随机推荐

  1. Spring MVC Test -Controller

    http://www.petrikainulainen.net/programming/spring-framework/unit-testing-of-spring-mvc-controllers- ...

  2. OpenCV播放视频带滚动条(3)

      演示 :一个带有滚动条的播放视频的代码.   #include "stdafx.h" #include <opencv2/core/core.hpp> #inclu ...

  3. three.js加入监控

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. ReSharper 配置及用法(二)

    下载工具 一:Reshaper是什么 即便是那些整天攻击 .NET 和 C# 的人,也常常不得不承认 Visual Studio 确实是个够强大的 IDE,除非他认为更少的 IDE 功能和命令行调试才 ...

  5. SPFA 的两个优化

    From NOCOW SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将 ...

  6. POJ 3320 (尺取法+Hash)

    题目链接: http://poj.org/problem?id=3320 题目大意:一本书有P页,每页有个知识点,知识点可以重复.问至少连续读几页,使得覆盖全部知识点. 解题思路: 知识点是有重复的, ...

  7. Python for Informatics 第11章 正则表达式二(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.1 正则表达式的字符匹配 ...

  8. leetcode Linked List Cycle

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  9. ACM 变态最大值

    变态最大值 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这么烂,幸好在他的帮助下大家算是解 ...

  10. 移动端开发——javascript

    javascript(简称js)语言在移动前端应用很广.可以说必不可少,许多效果都是和js相关的.包括现在移动端的一些框架.jqmobi.jqtouch.sencha touch.jquerymobi ...