繁体   English   中英

理解抽象类的超级关键字

[英]Understanding super keyword for abstract classes

考虑以下课程:

public abstract class AbstractClass {

    public abstract String m();

    public AbstractClass get(){
        return new AbstractClass() {

            @Override
            public String m() {
                return "Anonymous " + super.m(); //1, Compile-time erro
            }
        };
    }

}

目前尚不清楚为何禁止使用super //1 ,发生以下错误

Cannot directly invoke the abstract method m() for the type AbstractClass

所以,我咨询了JLS 15.11.2并没有找到阻止这些代码编译的限制。 他们来了:

  1. 明显

如果使用关键字super的表单出现在Object类的声明中,那么这是一个编译时错误,因为Object没有超类。

  1. 由于不可能有AbstractClass的实例,但只有一个具体的子类,以下似乎也是有效的:

使用关键字super的表单仅在实例方法,实例初始值设定项或构造函数中有效,或在类的实例变量的初始值设定项中有效。 如果它们出现在其他任何地方,则会发生编译时错误。

  1. 不是这样的。

如果当前类不是类T或T本身的内部类,则它是编译时错误。

当然,我可以使用AbstractClass.this.m() ,但这不是我要问的。

super关键字在这里不起作用,因为AbstractClass.m()已经被声明为abstract,因此在内部类的父级上没有合适的实现。 请记住,内部类不扩展外部类(即使它是相同的类型),它们包含对它的引用。

但是当从内部类调用到外部类(这是我认为你打算在这里做的)时,请使用以下语法AbstractClass.this.m()

以下内容将按预期编译和工作。

public abstract class AbstractClass {

    public abstract String m();

    public AbstractClass get(){
        return new AbstractClass() {

            @Override
            public String m() {
                return "Anonymous " + AbstractClass.this.m(); 
            }
        };
    }

}

据我所知,编译器在使用super.m();时尝试使用静态绑定super.m(); 因为没有方法super.m(); 由于它是抽象的,编译器已经在编译时抱怨。

Java中的静态绑定意味着在编译期间解析方法,而在运行时使用可被多个子类覆盖的方法时发生动态绑定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM