【问题标题】:Java: What member value returned on unimplemented abstract method?Java:未实现的抽象方法返回什么成员值?
【发布时间】:2014-08-25 09:35:31
【问题描述】:

在 Java 中,如果我有这样的类

abstract class TestClass
{
    int mMember = 0;

    int getMember()
    {
        return mMember;
    }
}

还有一个扩展这个类的类:

class TestExtended extends TestClass
{
     int mMember = 1;
}

如果我创建一个 TestExtended 实例并调用 testExtended.getMember(); 它会返回 0 还是 1?

换句话说,当我扩展一个类并且不覆盖该类的方法时,它是调用该方法并作用于该类中的成员还是扩展类中的成员?

是否需要在扩展类中重新实现(复制粘贴)函数以使函数返回 1?

【问题讨论】:

  • 为什么不测试一下呢? (顺便说一句,它会返回0。)
  • 我在 StackOverflow 上找不到答案。我自己不知道答案,并认为通过询问它会使其他人受益。我无法访问编译器,所以我现在无法测试它。感谢所有这些人在一个有效的问题上投票反对我。

标签: java inheritance abstract-class member extends


【解决方案1】:

可以通过运行确认。它将返回0。这是因为这些字段不能被覆盖。您实际上在做的是hiding 根据 jls 的实例变量。

方法的覆盖不同于字段的隐藏(第 8.3 节),因为它是 允许一个字段隐藏另一个类型的字段。

检查示例 8.4.8.3-4。在language specification了解更多信息

要获得子类版本,您必须:

 class TestExtended extends TestClass
     {
     int mMember = 1;

     @Override
     int getMember(){
          return mMember;
       }
    }

【讨论】:

    【解决方案2】:

    基类方法不能访问子类字段(至少,不使用反射)。句号。

    此外,与方法不同,字段不参与覆盖。

    【讨论】:

      【解决方案3】:

      它将返回0,而不是1

      这是因为您不能“覆盖”超类中的字段。你可以设置它们,只要它们不是private,但是如果你声明一个同名的新变量,它只会隐藏超类变量。

      另一方面,您可以覆盖方法。

      现在,以这种方式隐藏成员变量通常是一个非常糟糕的主意™,并且是避免公共字段的另一个原因。这就是为什么:

      TestExtended sub = new TestExtended();
      sub.mMember = 5;
      System.out.println(sub.mMember); // prints '5', as expected
      
      TestClass sup = sub; // this is fine, TestExtended extends TestClass
      System.out.println(sup.mMember); // prints '0'!
      

      编译器将根据编译时类型选择使用哪个版本的变量,打破多态性。不要隐藏成员变量,并避免使用公共字段,这无关紧要。请改用 getter 和 setter。

      【讨论】:

        【解决方案4】:

        使用testExtended.getMember(); 显然意味着您正在调用抽象类方法,因为您没有覆盖子类中的方法。如果您已经覆盖了它,那么如果您的对象是子类类型,那么首先会优先考虑子类方法。所以在这种情况下,它会给你 0 除非你覆盖该方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-11
          • 1970-01-01
          • 2020-06-13
          • 2016-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-29
          相关资源
          最近更新 更多