【问题标题】:Java overriding methods when creating new instance of a class创建类的新实例时的 Java 覆盖方法
【发布时间】:2011-11-12 22:33:49
【问题描述】:

这对于经验丰富的 Java 开发人员来说可能很简单,但我似乎无法弄清楚。我从这里读了一篇文章。代码是

View v = new View(this) {
    @Override
    protected void onDraw(Canvas canvas) {
        System.out.println("large view on draw called");
        super.onDraw(canvas);
    }
};

这是一个 Android 问题。在这里,用户创建了一个视图实例并在一行中覆盖了一个方法。这种编码有名称吗?

我的第二个疑问是,他覆盖了另一个包中的受保护方法。不是受保护的意味着包私有。我知道这会奏效,因为我试过了,但我就是不知道为什么会奏效。那么为什么这段代码有效呢?

在询问之前我确实尝试过用谷歌搜索并在 SO 中搜索,但无法找到答案。

【问题讨论】:

    标签: java android oop


    【解决方案1】:

    protected 表示(大致)“可用于子类”。 (参见this table。)由于new View(this) { ... } 创建了一个子类,因此可以覆盖其中的方法。

    在这种情况下,您在不同的包中并不重要。 (参见protected 行和this table 中的第二列。)该方法位于子类中这一事实足以“访问”受保护的方法。


    潜在的后续问题:如果 无论如何都无法调用该方法,这有什么意义?

    Java 中的所有方法都是虚拟的。这意味着每当View 类对onDraw 方法执行看似内部的调用时,该调用将被分派给被覆盖的方法。

    【讨论】:

    • 我有点忘了默认访问和受保护的访问。但我不知道匿名类。谢谢。
    【解决方案2】:

    有很多关于“受保护”的答案,所以我要去另一个 :)
    @override 是通知编译器重写基类方法,如果没有这个签名的基类方法则抛出编译错误。

    这些被称为注释。您可以在 java 中搜索注解主题。您也可以创建自定义注释。

    问候,
    SSuman185

    【讨论】:

      【解决方案3】:

      这不完全是一种编码。那是一个Java匿名类。它在 Android 中很常见,通常用于事件侦听器和类似的东西。

      更多细节你可以阅读this link(可能不是最好的):

      匿名内部类在某些情况下非常有用。为了 示例考虑需要创建实例的情况 没有创建类的子类并且还执行的对象 其他任务,例如方法重载。

      关于你的第二个问题,关键字protected表示该方法只对子类可用,所以可以覆盖该方法。

      【讨论】:

      • 我不知道 java 中的匿名类。感谢您的链接和解释。 +1 票。
      【解决方案4】:

      就像这里的其他人已经回答一样,这称为匿名类,并且覆盖受保护的方法是合法的,因为受保护的方法对子类和同一包中的类可见。

      【讨论】:

        【解决方案5】:

        这是一个匿名类。您是正确的,您正在覆盖受保护的方法,这是完全正常的。受保护的方法是可见的,因此可以被您在此处创建的子类覆盖。

        当您没有为变量或方法提供范围时,受保护的包是默认范围。这与受保护的不同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-24
          • 2020-05-11
          • 2013-09-04
          相关资源
          最近更新 更多