Java中方法的重写与成员变量的隐藏

 更新时间:2017年11月30日 14:26:04   投稿:mrr  
这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量),文中给大家介绍了java中的重写知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧

这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量)

在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么?

/** 
 * @author Hollis 17/9/27. 
 */ public class FieldOverriding { 
 public static void main(String[] args) { 
 Sub c1 = new Sub(); 
 System.out.println(" c1.s : " + c1.s); 
 System.out.println(" c1.say : " + c1.say()); 
 Super c2 = new Sub(); 
 System.out.println(" c2.s : " + c2.s); 
 System.out.println(" c2.say : " + c2.say()); 
 } 
} 
class Super { 
 String s = "Super"; 
 String say(){ 
 return "hello Super"; 
 } 
} 
class Sub extends Super { 
 String s = "Sub"; 
 String say(){ 
 return "hello Sub"; 
 } 
}

输出结果:

 c1.s : Sub 
 c1.say : hello Sub 
 c2.s : Super 
 c2.say : hello Sub

和你想的一样吗,如果一样的话,那就不用继续往下看了。因为这个本来就不难,知道了就行。

Java中的重写

在深入理解Java中的重写和重载中我们介绍过:

在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。

正式因为Java在继承中有方法的重写,所以,这也体现了Java的动态多态性。

成员变量在Java中能够被重写么?

上面的Java的重写介绍中明确的说了,重写,指的是方法。并没有提到成员变量。通过上面的例子,其实我们也可以发现,成员变量并没有被重写。

所以,Java中,成员变量并不会被重写。这里就有另外一个词:隐藏。

Java中成员变量的隐藏

Java文档中对隐藏域的定义:

Within a class, a field that has the same name as a field in the superclass hides the superclass's field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super. Generally speaking, we don't recommend hiding fields as it makes code difficult to read.

翻译成中文:

在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样。父类中的成员变量都会被隐藏。在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用获得父类被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。

其实,简单来说,就是子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能像方法一样使用多态去访问。

如何访问被隐藏的成员变量

其实,通过前面的例子,和刚刚关于成员变量的介绍,其实你已经知道了如何访问被隐藏的成员变量。 就是使用父类的引用来访问成员变量,如Super c2 = new Sub(); System.out.println(" c2.s : " + c2.s);。或者使用System.out.println(((Super)c1).s);

总结

以上所述是小编给大家介绍的Java中方法的重写与成员变量的隐藏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java实现多层文件夹压缩功能

    Java实现多层文件夹压缩功能

    这篇文章主要为大家详细介绍了如何利用Java语言进行多层文件夹压缩功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • java jpa如何自定义sql语句

    java jpa如何自定义sql语句

    这篇文章主要介绍了java jpa如何自定义sql语句方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • StackTraceElement获取方法调用栈信息实例详解

    StackTraceElement获取方法调用栈信息实例详解

    这篇文章主要介绍了StackTraceElement获取方法调用栈信息实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Spring Cloud Config与Bus整合实现微服务配置自动刷新功能

    Spring Cloud Config与Bus整合实现微服务配置自动刷新功能

    通过整合SpringCloud Config与Spring Cloud Bus,实现了微服务配置的自动刷新功能,这个机制允许一个微服务实例在配置更新时通过消息总线通知其他所有实例同步更新,从而保持配置的一致性并提升系统的运维效率
    2024-10-10
  • 使用Java找出两个List中的重复元素三种方法

    使用Java找出两个List中的重复元素三种方法

    在Java编程中,我们经常需要找出两个列表(List)中的重复元素,在本文中,我们将探讨三种方法来实现这一目标,需要的朋友可以参考下
    2023-10-10
  • eclipse配置tomcat10的详细步骤总结

    eclipse配置tomcat10的详细步骤总结

    今天给大家带来的是关于Java的相关知识,文章围绕着eclipse配置tomcat10的详细步骤展开,文中有非常详细的介绍及图文示例,需要的朋友可以参考下
    2021-06-06
  • JAVA多线程实现生产者消费者的实例详解

    JAVA多线程实现生产者消费者的实例详解

    这篇文章主要介绍了JAVA多线程实现生产者消费者的实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • 一文看懂RabbitMQ消息丢失如何防止

    一文看懂RabbitMQ消息丢失如何防止

    这篇文章主要介绍了RabbitMQ消息丢失的场景,以及如何保证信息不丢失,看完这篇文章一定可以帮助你RabbitMQ有更深的理解,需要的朋友可以参考下
    2023-03-03
  • JavaSwing实现小型学生管理系统

    JavaSwing实现小型学生管理系统

    这篇文章主要为大家详细介绍了JavaSwing实现小型学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Elasticsearch 映射参数详解 fields

    Elasticsearch 映射参数详解 fields

    这篇文章主要介绍了fields Elasticsearch 映射参数fields,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论