创建类的新实例时的 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 覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章