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

ble*_*enm 33 java oop android

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

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

这是一个Android问题.在这里,用户创建视图的实例并在一行中覆盖方法.这种编码有名字吗?

我的第二个疑问是,他从另一个包中覆盖了受保护的方法.不受保护意味着包私有.我知道这会在我尝试的时候起作用,但我无法弄清楚它为何起作用.那么为什么这段代码有效呢?

我确实尝试谷歌这个并在询问之前搜索,但无法找到答案.

aio*_*obe 19

protected意味着(大致)"可用于子类".(参见此表.)由于new View(this) { ... }创建了一个子类,因此可以覆盖其中的方法.

在这种情况下,你在一个不同的包中并不重要.(请参阅此表中的protected第一行和第二列.)该方法位于子类中的事实足以"访问"受保护的方法.


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

Java中的所有方法都是虚拟的.这意味着每当View类执行对该onDraw方法的看似内部调用时,此调用将被调度到重写方法.


Gui*_*ido 10

这不完全是一种编码.这是一个Java匿名类.它在Android中很常见,一般情况下都是事件监听器和那种东西.

有关详细信息,您可以阅读此链接(可能不是最好的链接):

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

关于第二个问题,关键字protected意味着该方法仅适用于子类,因此可以覆盖该方法.