我们知道,在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哈哈~ 是不是有点儿绕口,没关系 我们看一个实例

创建两个父子类关系的类

Java代码  

//父类

class Parent

{

public static String kind="javastudy.extendsstudy.parent";

public static int age=50;

public String name="Parent";

//静态方法,返回包名

public static String getKind()

{

System.out.println("parent的getKind()方法被调用了");

return kind;

}

//静态方法,返回年龄

public static int getAge()

{

System.out.println("Parent的getAge()方法被调用了");

return age;

}

//实例方法,返回姓名

public String getName()

{

System.out.println("Parent的getName()方法被调用了");

return this.name;

}

}

//子类

class Child extends Parent

{

public static String kind="javastudy.extendsstudy.child";

public int age=25;

public String name="child";

//隐藏父类静态方法

public static String getKind()

{

System.out.println("child的getkind()方法被调用了");

return kind;

}

//获取父类包名

public static String getParentKind()

{

return Parent.kind;

}

//覆盖父类实例方法

public String getName()

{

System.out.println("child的getName()被调用了");

return this.name;

}

//获取父类名称

public String getParentName()

{

return super.name;

}

/*

*错误,实例方法不能覆盖父类的静态方法

public int getAge()

{

return this.age;

}

*/

}

然后测试下

Java代码  

class Test

{

public static void main(String[] args)

{

Child child=new Child();

System.out.printf("子类名称:%s,年龄:%d,包名:%s%n",child.name,child.age,child.kind);

//输出:子类名称:child,年龄:25,包:javastudy.extendsstudy.child

//把child转换成parent对象

Parent parent=child;

System.out.printf("转换后的名称:%s,年龄:%d,包名:%s%n",parent.name,parent.age,parent.kind);

//输出:转换后的名称:Parent,年龄:50,包:javastudy.extendsstudy.parent

System.out.printf("子类访问父类被隐藏的实例变量name:%s%n",child.getParentName());

//输出:子类访问父类被隐藏的实例变量name:Parent

System.out.printf("子类访问父类被隐藏的静态变量kind:%s",child.getParentKind());

//输出:子类访问父类被隐藏的静态变量kind:javastudy.extendsstudy.parent

child.getName();

//输出:child的getName()被调用了

//**************注意看这个方法,返回的还是子类的getName

parent.getName();

//输出:child的getName()被调用了

child.getKind();

//输出:child的getkind()方法被调用了

parent.getKind();

//输出:parent的getKind()方法被调用了

}

}

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

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

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

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

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

java隐藏与覆盖_Java 隐藏和覆盖相关推荐

  1. java 重载与覆盖_Java重载与覆盖

    小编典典 您基本上是正确的.重载在单个类中具有多个方法,其中方法具有相同的名称.但是,返回值不被视为方法 签名 的一部分.因此,不能通过仅更改返回值来重载方法.您的示例中不能包含以下代码: publi ...

  2. java 覆盖和隐藏_Java覆盖和隐藏2

    先上题,题目如下,请分析输出结果: public class MainClass { public static void main(String[] args) { Fu f = new Zi(); ...

  3. java隐藏与覆盖_java中方法的隐藏和覆盖问题?

    ok()方法在继承时候发生覆盖(重写)了吗? 发生了.在子类B中的ok()方法拥有父类方法相同的方法名和参数列表(signature),所以在这里发生了重写.调用B类对象的ok()方法会print & ...

  4. java 覆盖和隐藏_Java方法的覆盖与隐藏的区别分析

    本篇文章介绍了,关于Java方法的覆盖与隐藏的区别分析.需要的朋友参考下 关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行 ...

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

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

  6. java变量和方法的覆盖和隐藏(翻译自Java Tutorials)

    隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问. 但是,父类的同名变量可以通过super访问.一般来说,不推荐 ...

  7. java重载覆盖隐藏_重载,覆盖以及隐藏 - osc_4dki3x9l的个人空间 - OSCHINA - 中文开源技术交流社区...

    重载是指同名函数具有不同的参数表.在同一访问区域内声明的几个具有不同参数列表(参数的类型.个数.顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数.对于重载函数的调用,编译期间确定,是 ...

  8. 【原创】Performanced C++ 经验规则 第五条:再谈重载、覆盖和隐藏

    第五条:再谈重载.覆盖和隐藏 在C++中,无论在类作用域内还是外,两个(或多个)同名的函数,可能且仅可能是以下三种关系:重载(Overload).覆盖(Override)和隐藏(Hide),因为同名, ...

  9. 成员函数的重载、覆盖与隐藏(详细)【转】

    (转自:https://blog.csdn.net/weixin_42205987/article/details/81569744) 成员函数的重载.覆盖与隐藏 成员函数的重载(overload). ...

最新文章

  1. Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap
  2. 从Delphi 7升级到Delphi XE
  3. VMware虚拟机磁盘操作占用过高问题(转:http://blog.csdn.net/New_When/article/details/73731149)
  4. 游戏服务器的架构演进
  5. mysql内连接的自连接_mysql 内连接、外连接、自连接
  6. 【Quartz】插件的使用
  7. Python面向对象之结构与成员
  8. Tensorflow模型变量保存
  9. 苹果手机远程服务器桌面,如何进行远程管理?如何实现苹果手机远程管理电脑?...
  10. unity3d kinect体感互动解决方案——2D体感换装
  11. Java Web 上应用良田高拍仪二次开发
  12. Android 启程
  13. 耶書制造 CHMmaker 2.85版 增加转换HPJ工程到HHP工程的功能。 (转)
  14. 如何VS Code打造成Java开发IDE?
  15. 【ASP.NET Core】处理异常--转
  16. MTK 轨迹球(JOG_BALL)
  17. 计算机功能及部件ppt,《计算机逻辑部件》PPT课件.ppt
  18. Casbin get-users 账号密码泄漏漏洞
  19. 图像识别与检测技术的创新
  20. linux如何卸载金山安全终端,安全客户端

热门文章

  1. java 1.8环境变量_java1.8安装及环境变量配置教程
  2. 面向对象之信息传递为何是调用方法
  3. this关键字的使用案例
  4. php设置文件权限问题,php如何设置文件权限
  5. mysql round 四舍五入_MySQL之ROUND函数四舍五入的陷阱
  6. android mysql 乱码_android POST数据遇到的UTF-8编码(乱码)问题解决办法
  7. 华为慧通值不值得去_华为 Mate 40太难抢,上半年的P40Pro还香吗?
  8. HDFS源码解析:教你用HDFS客户端写数据
  9. 在Vue中使用JSX,很easy的
  10. 数仓出现“wait in ccn queue”的时候,怎么迅速定位处理?