隐藏变量

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

覆盖和隐藏方法

对象实例方法

在一个对象实例方法中,如果子类有一个方法,它的签名(方法名字,方法的参数个数和类型)和返回值都和父类一样,那么就是覆盖父类的方法。
子类覆盖的能力,允许一个类,继承父类的行为,根据需要修改某些行为。覆盖的方法,和父类对应的方法有一样的名字,一样的参数类型和个数,一样的返回类型。另一种覆盖方法可以返回父类的方法的返回类型的子类。这个称之为covariant返回类型。
当覆盖一个方法,你要使用注解@Override,告诉编译器你要覆盖父类的方法。但是,如果该方法不存在父类中,那么编译器会报错。

类方法

如果子类声明了一个与父类相同签名的类方法,子类隐藏了父类的方法。
隐藏和覆盖的区别具有很大的意义。覆盖方法的调用版本就是子类的方法。隐藏方法的调用版本,依赖于它是被父类调用,还是被子类调用。

下面有个例子,演示对象实例方法和类方法的区别,第一个类是Animal

public class Animal {public static void testClassMethod() {System.out.println("The class" + " method in Animal.");}public void testInstanceMethod() {System.out.println("The instance " + " method in Animal.");}
}

第二个类是Cat,它是Animal的子类:

public class Cat extends Animal {public static void testClassMethod() {System.out.println("The class method" + " in Cat.");}public void testInstanceMethod() {System.out.println("The instance method" + " in Cat.");}public static void main(String[] args) {Cat myCat = new Cat();Animal myAnimal = myCat;Animal.testClassMethod();myAnimal.testInstanceMethod();}
}

Cat类覆盖了Animal的实例方法,并隐藏了它的类方法。结果输出如下:

The class method in Animal.
The instance method in Cat.

和之前所说的一样,由于是通过父类调用隐藏方法,所以隐藏方法的调用版本是父类。而覆盖方法的调用版本是子类的方法。

修饰符

覆盖的访问修饰符可以允许扩大,但不允许缩小。例如,一个protected对象方法,可以在子类中修改为public,但不能是private。否则代码会在编译时出错。

方法覆盖和隐藏小结

下面的表格总结了在子类声明了一个与父类签名一样的方法的各种情况

  Superclass Instance Method Superclass Static Method
Subclass Instance Method Overrides Generates a compile-time error
Subclass Static Method Generates a compile-time error Hides

转载于:https://www.cnblogs.com/ziq711/p/5604173.html

java变量和方法的覆盖和隐藏(翻译自Java Tutorials)相关推荐

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

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

  2. NDK开发 - C/C++ 访问 Java 变量和方法

    上一篇有提到 JNI 访问引用数组,涉及了 C/C++ 访问 Java 实例的方法和变量.虽然在之前的开发中,并没有用到 C/C++ 范围 Java 层数据,但是这部分内容还是很有用的. 传送门:ND ...

  3. C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载

    C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载 using System; using System.Collections.Generic; using Sys ...

  4. java 反射覆盖方法,java – 确定一个方法是否覆盖使用反射的另一个?

    有没有一个 existing answer来确定一个方法是否被覆盖,如果没有泛型涉及. Java将由于type erasure而完全删除泛型类型.因此字节码将是: class FooImpl impl ...

  5. Java变量与方法的调用:同类操作中与跨类操作中的对比

    变量与方法的调用 很多同志对Java中同一类和跨类的变量与方法调用不甚理解.今天让我们通过代码实例学习一下. 先上结论 在一个类中操作时 静态方法可以直接调用静态变量.静态方法. 初始化对象Objec ...

  6. java反射获取方法内部_公共技术点之 Java 反射 Reflection

    本文为 Android 开源项目源码解析 公共技术点中的 Java 反射 部分 分析者:Mr.Simple,校对者:Trinea,校对状态:未完成 1. 了解 Java 中的反射 1.1 什么是 Ja ...

  7. java静态接口方法使用_使用静态方法对接口进行Java编程

    java静态接口方法使用 In this quick tutorial, we would understand how static methods on interfaces helps us d ...

  8. java变量3步曲_Java学习三部曲,学好Java就是这么简单

    学Java必须做到三步走: 1.课前认真预习. 2.课上认真听讲. 3.课下认真复习. 我想只有做好这三步,自己才能跟上老师的步子. Java学起来很有趣,通过学习Java可以提高自己的逻辑思维能力. ...

  9. java 变量名 字符串_如何使字符串值在java中调用特定的现有JButton变量名?

    所以,我知道有这样的: int number = Integer.parseInt("5"); String numtxt = Integer.toString(12); doub ...

最新文章

  1. 实录:最低价中标11月车牌之全过程
  2. J.U.C atomic 数组,字段原子操作
  3. Python学习-集合的常见用法
  4. [蓝桥杯2017初赛]跳蚱蜢-map标记+bfs+环形数组
  5. 链表合并面试100题系列之18链表合并
  6. RedHat Linux 9.0 操作系统测试题2
  7. 发布阿里云OSS for phpcmsV9整合教程
  8. 树链剖分之点剖分(点分治)讲解
  9. c++ websocket客户端_ESP32 Arduino教程:Websocket客户端
  10. python datetime需要安装_【python从入门到入土】之第一行代码
  11. 私有云的Eucalyptus简介
  12. 【Python通过分贝监测Windows系统是否有声音播放】
  13. 网站添加cdn加速服务器,网站使用腾讯云cdn加速操作实战
  14. python 马赛克拼图_用几十万张图片来拼图!Open CV牛逼不是没有道理的!马赛克拼图...
  15. ubuntu22.04LTS 外接hdmi没有声音
  16. 盘点百度、阿里、腾讯、华为自动驾驶战略
  17. Zookeeper学习笔记2-------group创建、查询、删除
  18. 从病毒开始聊聊那些windows下大杂烩
  19. Python 网站开发(一)环境搭建
  20. pve rust 能拆家吗_文明重启有哪些游戏模式应该怎么玩

热门文章

  1. Helm 3 完整教程(三):chart 的文件结构和字段详解
  2. java多线程按行读取文件_“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?...
  3. 德鲁伊druid数据库明文密码加密
  4. 没有web.xml如何使用 Maven打war包?
  5. ln命令:软链接建立与删除
  6. Educational Codeforces Round 117 (Rated for Div. 2) ABCDE
  7. API和Web API(1)
  8. 多媒体分析与理解_多媒体在课堂教学中应用的研究研究报告(二)
  9. dns提供商主机名_DNS域名解析的过程
  10. Java---集合类框架图