2011-09-08 122 views
31

对于经验丰富的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问题。这里用户创建一个视图的实例,并在一行中覆盖一个方法。这种编码有没有名字?

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

我确实尝试谷歌这个和搜索之前问,但不能找出答案。

回答

18

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

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


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

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

+0

我有点忘了默认的访问和访问保护。但我并不知道匿名课程。谢谢。 – blessenm

9

这不完全是一种编码。这是一个Java匿名类。这在Android中非常常见,并且通常与事件监听器以及那种东西有关。

欲了解更多详情,您可以阅读this link(可能不是最好的一个):

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

关于你的第二个问题,关键字protected意味着该方法只适用于子类,所以它是可以覆盖的方法。

+0

我不知道java中的匿名类。感谢您的链接和解释。 +1票。 – blessenm

3

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

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

1

就像这里的其他人已经回答这称为匿名类,重写保护的方法是合法的,因为受保护的方法对子类和类相同包是可见的。

1

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

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

问候,
SSuman185