java隐藏与覆盖_java中方法的隐藏和覆盖问题?
ok()方法在继承时候发生覆盖(重写)了吗?
发生了。在子类B中的ok()方法拥有父类方法相同的方法名和参数列表(signature),所以在这里发生了重写。调用B类对象的ok()方法会print "b",父类方法被覆盖。
如果是重写了,那定义一个b类的对象还能再调用a类继承的ok()函数吗?
可以。方法就是利用super关键字。@陆萌萌 的答案已经解释了。
a类的ok()函数是在子类中隐藏了吗?能告诉我覆盖和隐藏分别应该怎么用怎么写吗?
错误。我回答这个问题主要就是为了说明这个易混点。
在Java中并没有隐藏的概念,只有重载overload和重写override,隐藏(redifine)是C++中的概念,网络上很多人将之带到了Java,以为在Java中也有这样的区分。
1.) 在C++中,同一类内相同函数名不同参数列表的函数为重载;
2.) 父类与子类间相同名字相同参数列表,且父类函数有virtual标识符的为重写;
3.) 父类与子类间相同名字不同参数列表,此时无论有无virtual标识符,或者父类与子类间相同名字相同参数列表,但是父类函数中没有virtual标识符,则为隐藏,或者说重定义redifine。
Java中,情况简化了许多。Java里没有virtual标识符,按照上面三种情况划分:
1.) 同一类内相同方法名不同参数列表的方法为重载;
2.) 父类与子类间相同名字相同参数列表,为重写(覆盖),这里与C++的区别是,Java中不需要有virtual标识符;
3.) 父类与子类间相同名字不同参数列表,此时按C++中的逻辑应该算是重定义(隐藏), 但是Java中没有隐藏的概念。在具体实现中,父类中的函数,会被继承下来,和子类中的同名函数,一起成为子类中的重载函数 。这个实现其实是与重载的定义相悖的,因为重载要求必须是在同一类内的相同名字不同参数列表的方法,而在这里,重载跨越了父类与子类。
以下为实际测试代码:
class a{
public void ok()
{system.out.println("a");}
}
class b extends a{
public void ok(int c)
{system.out.println("b");}
}
class hello{
public static void main()
{
a A =new b();
A.ok();
A.ok(1);
}
}
在Java中,这里程序会输出"a b"。子类对象中隐式地包含了ok(),ok(int c)两个重载方法。
在C++中,同样结构的代码,这里会出现编译错误,因为父类中的ok()被子类的ok(int c)隐藏,在子类对象中根本找不到ok()这个函数。
相比较而言,C++规范更明确,每种情况条分缕析;Java在实现上虽然更简单方便,但其实与重载的定义是相悖的。
java隐藏与覆盖_java中方法的隐藏和覆盖问题?相关推荐
- java 静态方法覆盖_Java中方法的覆盖和静态方法的隐藏
下面的程序对巴辛吉小鬣狗和其它狗之间的行为差异进行了建模.如果你不知道 什么是巴辛吉小鬣狗,那么我告诉你,这是一种产自非洲的小型卷尾狗,它们从 来都不叫唤.那么,这个程序将打印出什么呢? class ...
- java gc回收机制_Java中的GC回收机制
为什么要进行GC回收? 当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下. 什么时候进行GC回收? 1.当CPU空闲 ...
- java finalize使用场景_java finalize方法总结、GC执行finalize的过程
注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用.问题以及GC执行finalize的过程. 1. finalize的作用 finalize()是Object的protected方法 ...
- java 不同包子类 覆盖_Java中不同方法的覆盖方法
经过测试 覆盖的好处是能够定义特定于子类类型的行为,这意味着子类可以根据其要求实现父类方法. 用面向对象的术语来说,覆盖是指覆盖现有方法的功能. 示例class Animal { public voi ...
- 怎么让java技术变强_java中的方法
方法是什么? 方法是可以完成某个特定的功能的并且可以被重复利用的代码片段,方法的出现,让代码有了很强大复用性 方法定义: [修饰符列表] 返回值类型 方法名(形式参数列表){ 方法体; } 形式参数列 ...
- java 传入参数_Java 中方法参数的传递
java中方法参数传递看似有两种,值传递和引用传递.而实际上都是值传递. 所谓值传递,传递的是变量的副本就是说,在将变量a作为参数传进方法中时,方法中接收到的是a的副本,在方法中对参数的修改实际上修改 ...
- java怎么传入参数到方法当中_java中方法传入参数时:值传递还是址传递?
JAVA中的数据类型有两大类型: ① 基本数据类型:逻辑型(boolean).文本型(char).整数型(byte.short.int.long).浮点型(float.double) ② 引用数据类型 ...
- 类与方法java讲解_Java中方法使用的深入讲解
方法的使用 1.方法的基本用法 什么是方法,方法就是一个代码片段,类似于c/c++ 语言中的"函数". 1.1方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候). ...
- java关于创建对象描述_java中创建对象的方法
有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...
最新文章
- Numpy入门教程:04. 数学函数
- “他们”最想要的圣诞礼物是你的...
- 软件测试师具备的素质_软件测试工程师有哪些需要具备的能力呢
- linux如何判断同名进程个数,Linux下判断是否存在多个同名进程
- html中怎么定义搜索框?html中search类型?
- 20190703 日子
- 文件下载的java代码_文件下载java代码实现
- php如何去重,php二维数组如何去重?(代码示例)
- Python 代码练习
- 通道注意力机制keras_注意力机制及Keras实现
- 去social一下什么意思_bbs论坛是什么意思(论坛的含义)
- 重磅丨深度解读UN报告:AI新技术革命将如何重塑就业和全球化格局?
- WinSCP显示隐藏文件
- MySQL 查询优化如何坐到极致?
- 传播正能量——《海南英才》阅读的读后感2200字
- vb.net电子时钟实例
- 熊猫分发_熊猫实用指南
- 【系统集成项目管理】之项目质量管理
- SwiftUI Mapkit 导航基础教程大全之 MKMapView地图显示并实现导航线路(教程含源码)
- 网络通信之如何广播发送
热门文章
- 在Java 8之前,您编写了几行代码来对对象集合进行排序?
- 创新设计模式:单例模式
- 在CDI应用程序中使用@Alternative
- Java命令行界面(第20部分):JSAP
- exo文件_您在eXo平台上的第一个Juzu Portlet
- 只需几分钟即可安装Red Hat Container Development Kit(视频)
- apache camel_REST端点,可使用Apache Camel进行集成
- Hibernate中的一对多XML映射
- 都灵JVM编程语言:使用ANTLR构建高级词法分析器
- JAX-RS 2.0:服务器端处理管道