这对于经验丰富的Java开发人员来说可能很简单,但我似乎无法弄明白。我从这里读了一篇文章。代码是
View v = new View(this) {
@Override
protected void onDraw(Canvas canvas) {
System.out.println("large view on draw called");
super.onDraw(canvas);
}
};
这是一个Android问题。在这里,用户创建视图的实例并在一行中覆盖方法。这种编码有名字吗?
我的第二个疑问是,他从另一个包中覆盖了受保护的方法。不受保护意味着包私有。我知道这会在我尝试的时候起作用,但我无法弄清楚它为何起作用。那么为什么这段代码有效呢?
我确实尝试谷歌这个并在询问前搜索,但无法找到答案。
答案 0 :(得分:18)
protected
表示(大致)“可用于子类”。 (参见this table。)由于new View(this) { ... }
创建了一个子类,因此可以覆盖其中的方法。
在这种情况下,你在一个不同的包中并不重要。 (参见this table中的protected
行和第二列。)方法在子类中的事实足以“访问”受保护的方法。
潜在的后续问题:如果我无法调用该方法,它会有什么意义呢?
Java中的所有方法都是虚拟。这意味着每当View
类执行对onDraw
方法的看似内部调用时,此调用将被调度到重写方法。
答案 1 :(得分:9)
这不完全是一种编码。这是一个Java匿名类。它在Android中很常见,通常还有事件监听器和那种东西。
有关详情,请阅读this link(可能不是最好的):
匿名内部类在某些情况下非常有用。对于 示例考虑需要创建实例的情况 一个对象,不创建类的子类,也可以执行 其他任务,如方法重载。
关于第二个问题,关键字protected
表示该方法仅适用于子类,因此可以覆盖该方法。
答案 2 :(得分:3)
这是一个匿名类。你是否正确地覆盖了受保护的方法,这是完全正常的。受保护的方法是可见的,因此可以通过子类覆盖,这是您在此处创建的。
当您未为变量或方法提供范围时,Package protected是默认范围。这与受保护的不同。
答案 3 :(得分:1)
就像其他人已经回答这个被称为匿名类一样,覆盖受保护的方法是合法的,因为受保护的方法对于子类和同一个包中的类是可见的。
答案 4 :(得分:1)
有很多回答是为了“受保护”,所以我要去另一个:) @override通知编译器覆盖基类方法,如果没有此签名的基类方法,则抛出编译错误。
这些称为注释。您可以在java中搜索注释主题。您也可以创建自定义注释。
的问候,
SSuman185