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中方法的隐藏和覆盖问题?相关推荐

  1. java 静态方法覆盖_Java中方法的覆盖和静态方法的隐藏

    下面的程序对巴辛吉小鬣狗和其它狗之间的行为差异进行了建模.如果你不知道 什么是巴辛吉小鬣狗,那么我告诉你,这是一种产自非洲的小型卷尾狗,它们从 来都不叫唤.那么,这个程序将打印出什么呢? class ...

  2. java gc回收机制_Java中的GC回收机制

    为什么要进行GC回收? 当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下. 什么时候进行GC回收? 1.当CPU空闲 ...

  3. java finalize使用场景_java finalize方法总结、GC执行finalize的过程

    注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用.问题以及GC执行finalize的过程. 1. finalize的作用 finalize()是Object的protected方法 ...

  4. java 不同包子类 覆盖_Java中不同方法的覆盖方法

    经过测试 覆盖的好处是能够定义特定于子类类型的行为,这意味着子类可以根据其要求实现父类方法. 用面向对象的术语来说,覆盖是指覆盖现有方法的功能. 示例class Animal { public voi ...

  5. 怎么让java技术变强_java中的方法

    方法是什么? 方法是可以完成某个特定的功能的并且可以被重复利用的代码片段,方法的出现,让代码有了很强大复用性 方法定义: [修饰符列表] 返回值类型 方法名(形式参数列表){ 方法体; } 形式参数列 ...

  6. java 传入参数_Java 中方法参数的传递

    java中方法参数传递看似有两种,值传递和引用传递.而实际上都是值传递. 所谓值传递,传递的是变量的副本就是说,在将变量a作为参数传进方法中时,方法中接收到的是a的副本,在方法中对参数的修改实际上修改 ...

  7. java怎么传入参数到方法当中_java中方法传入参数时:值传递还是址传递?

    JAVA中的数据类型有两大类型: ① 基本数据类型:逻辑型(boolean).文本型(char).整数型(byte.short.int.long).浮点型(float.double) ② 引用数据类型 ...

  8. 类与方法java讲解_Java中方法使用的深入讲解

    方法的使用 1.方法的基本用法 什么是方法,方法就是一个代码片段,类似于c/c++ 语言中的"函数". 1.1方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候). ...

  9. java关于创建对象描述_java中创建对象的方法

    有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...

最新文章

  1. Numpy入门教程:04. 数学函数
  2. “他们”最想要的圣诞礼物是你的...
  3. 软件测试师具备的素质_软件测试工程师有哪些需要具备的能力呢
  4. linux如何判断同名进程个数,Linux下判断是否存在多个同名进程
  5. html中怎么定义搜索框?html中search类型?
  6. 20190703 日子
  7. 文件下载的java代码_文件下载java代码实现
  8. php如何去重,php二维数组如何去重?(代码示例)
  9. Python 代码练习
  10. 通道注意力机制keras_注意力机制及Keras实现
  11. 去social一下什么意思_bbs论坛是什么意思(论坛的含义)
  12. 重磅丨深度解读UN报告:AI新技术革命将如何重塑就业和全球化格局?
  13. WinSCP显示隐藏文件
  14. MySQL 查询优化如何坐到极致?
  15. 传播正能量——《海南英才》阅读的读后感2200字
  16. vb.net电子时钟实例
  17. 熊猫分发_熊猫实用指南
  18. 【系统集成项目管理】之项目质量管理
  19. SwiftUI Mapkit 导航基础教程大全之 MKMapView地图显示并实现导航线路(教程含源码)
  20. 网络通信之如何广播发送

热门文章

  1. 在Java 8之前,您编写了几行代码来对对象集合进行排序?
  2. 创新设计模式:单例模式
  3. 在CDI应用程序中使用@Alternative
  4. Java命令行界面(第20部分):JSAP
  5. exo文件_您在eXo平台上的第一个Juzu Portlet
  6. 只需几分钟即可安装Red Hat Container Development Kit(视频)
  7. apache camel_REST端点,可使用Apache Camel进行集成
  8. Hibernate中的一对多XML映射
  9. 都灵JVM编程语言:使用ANTLR构建高级词法分析器
  10. JAX-RS 2.0:服务器端处理管道