当前位置: 首页 > 面试题库 >

Java 隐藏类的实例变量

魏兴邦
2023-03-14
问题内容

我想知道为什么Java对于具有相同名称的实例变量的超类和子类具有这种奇怪的行为。

假设我们有以下类定义:

class Parent {
    int var = 1;
}

class Child extends Parent {
    int var = 2;
}

通过这样做,我们应该隐藏了超类的变量var。如果我们没有明确指定的方式来访问Parentvar通过super电话,那么我们就应该永远无法获得var一个孩子的一个实例。

但是,当我们进行强制转换时,此隐藏机制将中断:

Child child = new Child();
Parent parent = (Parent)child;
System.out.println(parent.var); // prints out 1, instead of 2

这不是完全避开整个野外躲藏点吗?如果是这种情况,那么这是否会使该想法完全没有用?

在子类中,不能用其简单名称引用超类中的字段。相反,必须通过超级访问该字段。

从我在这里看到的内容来看,这似乎暗示Java开发人员在执行此操作时会想到某种技术。虽然我同意这是一个相当晦涩的概念,但总体上可能是不好的做法。


问题答案:

在Java中,数据成员不是多态的。这意味着Parent.varChild.var 是碰巧具有相同名称的两个不同变量。var在派生类中,你无论如何都不会“压倒” 。如你所知,这两个变量可以相互独立地访问。

最好的前进方式实际上取决于你要实现的目标:

  1. 如果Parent.var不可见Child,则将其制成private
  2. 如果Parent.varChild.var是两个逻辑上不同的变量,请给它们提供不同的名称,以避免混淆。
  3. 如果Parent.varChild.var在逻辑上是相同的变量,则对它们使用一个数据成员。


 类似资料:
  • 使用自定义效果来隐藏匹配的元素。 如需了解更多有关 .hide() 方法的细节,请查看 API 文档 .hide()。 .hide() 演示 点击按钮预览特效。 <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>jQuery UI 特效 - .hide() 演示</title> <link re

  • 问题内容: 我正在研究JAVA中的重写成员函数,并考虑过尝试使用重写成员变量。 所以,我定义了类 输出为: 我不明白为什么当aRef设置为b时intVal仍然是A类? 问题答案: 当在子类中创建相同名称的变量时,这称为隐藏。现在,生成的子类实际上将同时具有这两个属性。你可以使用或从超类访问一个。变量甚至不必具有相同的类型。它们只是两个共享名称的变量,就像两个重载方法一样。

  • 我正在Java学习重写成员函数,并考虑过尝试重写成员变量。 所以,我给类下了定义 输出为: 我不明白为什么当aRef设置为b时,intVal仍然是A类?

  • 本文向大家介绍bootstrap——bootstrapTable实现隐藏列的示例,包括了bootstrap——bootstrapTable实现隐藏列的示例的使用技巧和注意事项,需要的朋友参考一下 最近在学习bootstrap,正好今天看到了bootstrapTable隐藏列,留着以后参考。 主要代码: 全部代码:  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍jQuery元素的隐藏与显示实例,包括了jQuery元素的隐藏与显示实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery元素的隐藏与显示的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的jQuery程序设计有所帮助。

  • 问题内容: 看完C#的隐藏功能后,我想知道Java的一些隐藏功能是什么? 问题答案: 几个月前,Double Brace Initialization让我惊讶,以前从未听说过它。 ThreadLocals通常并不广为人知,它是一种存储每个线程状态的方法。 由于JDK 1.5 Java除了锁以外,还具有非常好的实现和健壮的并发工具,因此它们位于java.util.concurrent中,并且一个特别