【问题标题】:Super vs. This for three classes [duplicate]超级与这三个类[重复]
【发布时间】:2013-11-22 18:54:47
【问题描述】:

假设您有一个扩展父类 A 的类 B。要访问 B 的方法,您可以使用它。要访问 A,您将使用 super。如果你有一个扩展类 B 的第三个类 C,你会使用它来访问 C 的方法和 super 来访问 B。你将如何从类 C 访问 A 的方法?

【问题讨论】:

  • 这可能会有所帮助stackoverflow.com/questions/586363/…
  • 如果你没有覆盖任何东西,你不需要调用 super。你需要给出一个更好的解释。
  • "你会用 this 来访问 C 和 super 的方法来访问 B" 这根本上是错误的。 super 可用于访问代码所在类的超类中的方法实现。因此,访问 B 类中使用 super 的方法,将访问 A 类(或其超类)中的方法,即使当前对象具有 C 类(或其子类)。 super 是一种完全不同的方法访问方式。

标签: java inheritance this super


【解决方案1】:

你实际上不能,因为它会违反封装原则。 但是,您可以在 B 类中创建与 A 相同的方法并获得所需的结果。

【讨论】:

    【解决方案2】:

    让我们用这个例子:

    class Bird {
        public final void eat() {
            //...
        }
        public boolean canFly() {
            return true;
        }
    }
    
    class FlightlessBird extends Bird {
        public boolean canFly() {
            return false;
        }
    }
    
    class Ostrich extends FlightlessBird {
        public void takeoff() {
            if (canFly()) {
                //....
            }
        }
    }
    

    Ostrich 扩展了 FlightlessBird,因此 canFly() 将始终返回 false。但是,如果可以,请致电super.super.canFly(),您最终会得到一只会飞的鸵鸟,这不是任何人都想看到的。基本上,方法被重写是有原因的,并且四处走动可能会导致灾难性的结果。如果您在所有子类中都需要一个方法,则将其标记为 final,这样它就不能被覆盖(如上例中的吃)。如果您正在使用其他人的库并且无法更改祖父母,那么您需要直接从祖父母继承。

    另外,如果您发现自己需要经常使用 super,那么您可能做错了什么。

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2013-09-01
      • 2015-06-23
      • 2016-09-03
      • 2011-08-17
      • 2011-07-10
      • 2020-11-06
      • 2017-07-06
      • 2013-12-06
      相关资源
      最近更新 更多