创建类的新实例时的 Java 覆盖方法

Posted

技术标签:

【中文标题】创建类的新实例时的 Java 覆盖方法【英文标题】:Java overriding methods when creating new instance of a class 【发布时间】: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 中搜索,但无法找到答案。

【问题讨论】:

【参考方案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】:

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

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

【讨论】:

以上是关于创建类的新实例时的 Java 覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章

java变量和方法的覆盖和隐藏(翻译自Java Tutorials)

java多态的实现机制

表单的新实例覆盖现有表单变量声明

从超类的指针调用时,基类函数不会覆盖超类函数

8.继承覆盖重载与多态

java中父类的方法已经被覆盖那子类还能用super关键字调用父类的方法吗