java隐藏与覆盖_Java 隐藏和覆盖
我们知道,在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 隐藏和覆盖相关推荐
- java 重载与覆盖_Java重载与覆盖
小编典典 您基本上是正确的.重载在单个类中具有多个方法,其中方法具有相同的名称.但是,返回值不被视为方法 签名 的一部分.因此,不能通过仅更改返回值来重载方法.您的示例中不能包含以下代码: publi ...
- java 覆盖和隐藏_Java覆盖和隐藏2
先上题,题目如下,请分析输出结果: public class MainClass { public static void main(String[] args) { Fu f = new Zi(); ...
- java隐藏与覆盖_java中方法的隐藏和覆盖问题?
ok()方法在继承时候发生覆盖(重写)了吗? 发生了.在子类B中的ok()方法拥有父类方法相同的方法名和参数列表(signature),所以在这里发生了重写.调用B类对象的ok()方法会print & ...
- java 覆盖和隐藏_Java方法的覆盖与隐藏的区别分析
本篇文章介绍了,关于Java方法的覆盖与隐藏的区别分析.需要的朋友参考下 关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行 ...
- Java中的覆盖和隐藏以及final关键字
Java覆盖和隐藏 (1) 变量只能被隐藏(包括静态和非静态),不能被覆盖: (2) 可以用子类的静态变量隐藏父类的静态变量,也可以用子类的非静态变量隐藏父类的静态变量,也可以用非最终变量(final ...
- java变量和方法的覆盖和隐藏(翻译自Java Tutorials)
隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问. 但是,父类的同名变量可以通过super访问.一般来说,不推荐 ...
- java重载覆盖隐藏_重载,覆盖以及隐藏 - osc_4dki3x9l的个人空间 - OSCHINA - 中文开源技术交流社区...
重载是指同名函数具有不同的参数表.在同一访问区域内声明的几个具有不同参数列表(参数的类型.个数.顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数.对于重载函数的调用,编译期间确定,是 ...
- 【原创】Performanced C++ 经验规则 第五条:再谈重载、覆盖和隐藏
第五条:再谈重载.覆盖和隐藏 在C++中,无论在类作用域内还是外,两个(或多个)同名的函数,可能且仅可能是以下三种关系:重载(Overload).覆盖(Override)和隐藏(Hide),因为同名, ...
- 成员函数的重载、覆盖与隐藏(详细)【转】
(转自:https://blog.csdn.net/weixin_42205987/article/details/81569744) 成员函数的重载.覆盖与隐藏 成员函数的重载(overload). ...
最新文章
- Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap
- 从Delphi 7升级到Delphi XE
- VMware虚拟机磁盘操作占用过高问题(转:http://blog.csdn.net/New_When/article/details/73731149)
- 游戏服务器的架构演进
- mysql内连接的自连接_mysql 内连接、外连接、自连接
- 【Quartz】插件的使用
- Python面向对象之结构与成员
- Tensorflow模型变量保存
- 苹果手机远程服务器桌面,如何进行远程管理?如何实现苹果手机远程管理电脑?...
- unity3d kinect体感互动解决方案——2D体感换装
- Java Web 上应用良田高拍仪二次开发
- Android 启程
- 耶書制造 CHMmaker 2.85版 增加转换HPJ工程到HHP工程的功能。 (转)
- 如何VS Code打造成Java开发IDE?
- 【ASP.NET Core】处理异常--转
- MTK 轨迹球(JOG_BALL)
- 计算机功能及部件ppt,《计算机逻辑部件》PPT课件.ppt
- Casbin get-users 账号密码泄漏漏洞
- 图像识别与检测技术的创新
- linux如何卸载金山安全终端,安全客户端
热门文章
- java 1.8环境变量_java1.8安装及环境变量配置教程
- 面向对象之信息传递为何是调用方法
- this关键字的使用案例
- php设置文件权限问题,php如何设置文件权限
- mysql round 四舍五入_MySQL之ROUND函数四舍五入的陷阱
- android mysql 乱码_android POST数据遇到的UTF-8编码(乱码)问题解决办法
- 华为慧通值不值得去_华为 Mate 40太难抢,上半年的P40Pro还香吗?
- HDFS源码解析:教你用HDFS客户端写数据
- 在Vue中使用JSX,很easy的
- 数仓出现“wait in ccn queue”的时候,怎么迅速定位处理?