【问题标题】:Overriding the public variables in super and sub class [duplicate]覆盖超类和子类中的公共变量[重复]
【发布时间】:2015-09-22 13:57:05
【问题描述】:

您好,我为子类创建对象并尝试调用子类变量,但它调用了超类变量,超类和子类具有相同的类变量名称 .

在此输出中,名称为“Child”,期望为“o2.name;”但输出是“Base”。请解释清楚...

【问题讨论】:

  • 您不能覆盖变量。它只是访问第一个变量 name,它可以从类 ovrriddingBase 访问。
  • 我正在为子类“ovrriddingBase o2=new ovrriddingChild();”创建对象然后我尝试调用子类变量“name”。我期待答案“孩子”,但我得到了“基地”
  • 请贴代码sn-ps,不要截图。
  • 嗨,凯文,如果我正在创建像“ovrriddingBase o1=new ovrriddingBase();”这样的对象表示输出“Base”是正确的......但我正在为“ovrriddingBase o2=new ovrriddingChild();”创建对象。
  • @KarthickA.S 您的变量被声明为ovrriddingBase,因此您可以访问在ovrriddingBase 类范围内可见的方法和变量。

标签: java


【解决方案1】:

Java 中的变量不是多态的;它们不会相互覆盖。当您在子类中创建同名变量时,这称为隐藏。生成的子类现在实际上将具有这两个属性。您可以使用 super.var 或 ((SuperClass)this).var 从超类访问它

【讨论】:

    【解决方案2】:

    在 Java 中你不会覆盖字段,你只是隐藏它们。 在运行时,java 检查您正在使用的对象的引用类型并调用该变量。

    变量甚至不必是同一类型;它们只是共享名称的两个变量。

    查看此帖子:
    Overriding member variables in Java
    Overriding a super class's instance variables
    Is there a way to override class variables in Java?

    【讨论】:

      【解决方案3】:

      Java 不支持变量覆盖。所以当你写的时候:

      OverrridingBase o2= new Overridingchild();
      System.out.println(o2.name);
      

      JVM 将采用 o2 的引用类型(即 OverrridingBase),并将打印 OverrridingBase 名称的值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多