创build类的新实例时的Java重写方法

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

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

这是一个Android问题。 这里用户创build一个视图的实例,并在一行中重写一个方法。 这种编码有没有名字?

我的第二个疑问是,他从另一个包中覆盖了一个受保护的方法。 不受保护的意思包私人。 我知道这将工作,因为我试了一下,但我只是不明白为什么它的工作。 那么为什么这个代码工作?

我确实尝试谷歌这个和search之前问,但无法找出答案。

Solutions Collecting From Web of "创build类的新实例时的Java重写方法"

protected手段(粗略)“可用于子类”。 ( 见下表 )由于new View(this) { ... }创build了一个子类,所以可以重写它内部的方法。

在这种情况下,你在一个不同的包里并不重要。 (请参阅此表中的protected行和第二列。)该方法在子类中的事实足以“获取”受保护的方法。


潜在的后续问题:如果无法调用方法,它有什么意义?

Java中的所有方法都是虚拟的 。 这意味着只要View类对onDraw方法执行一个看似内部的调用,这个调用将被调度到重写的方法。

这不完全是一种编码。 这是一个Java匿名类。 这在Android中是非常常见的,一般来说还有事件监听器和类似的东西。

欲了解更多的细节,你可以阅读这个链接 (可能不是最好的):

匿名内部类在某些情况下非常有用。 例如,考虑一种情况,您需要创build对象的实例而不创build类的子类,并执行其他任务,如方法重载。

关于第二个问题,关键字protected意味着该方法只能用于子类,所以可以重写该方法。

这是一个匿名的类。 你是正确的,你重写一个受保护的方法,这是完全正常的。 一个受保护的方法是可见的,因此可以被子类重载,这就是你在这里创build的。

当你没有为你的variables或方法提供一个范围时,受保护的包是默认的范围。 这是不同的保护。

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

那么多的答复在那里“保护”,所以我要去其他一个:)
@ override通知编译器重写基类方法,如果没有这个签名的基类方法,则抛出编译错误。

这些被称为注释。 您可以在java中search注释主题。 您也可以创build自定义注释。

问候,
SSuman185