java中的类初始化函数定义

时间:2011-11-20 14:26:33

标签: java android anonymous-class

我收到错误“抽象方法没有指定正文”,但代码如下....

    DCWebView.setWebViewClient(new MyWebViewClient() {
        @Override
        public abstract void launchExternalBrowser(String url) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
        }
    });

MyWebViewClient是一个抽象类。我想知道上面的代码是做什么的。它显然打算定义类的函数...我可以在new MyWebViewClient() { }中放置任何代码来定义变量和其他函数吗?

在这里可以做些什么其他很棒的事情?

2 个答案:

答案 0 :(得分:6)

只需删除abstract即可。如果launchExternalBrowser中未定义方法MyWebViewCLient,您还应删除@Override注释。 @Override表示您覆盖在扩展类层次结构中定义的方法。

DCWebView.setWebViewClient方法需要类型为MyWebViewClient的对象作为参数。通过编写new MyWebClient() { .. },您可以创建一个扩展MyWebViewClient的匿名类的实例。

匿名类(几乎)与“普通”类相同。您可以在那里定义新的变量和方法。主要区别在于匿名类是在使用它的地方定义的(没有外部类定义,因为它没有名称,它是“匿名的”)并且它仅在这一个地方使用(如没有外部定义,不能在其他地方使用。)

匿名类在Java中非常常用,但这有点先进。作为esaj said,在他的回答中,阅读有关此事的一些信息是个好主意。网络上有大量信息,例如herehere

答案 1 :(得分:2)

抽象方法用于定义没有实现的方法。从抽象类扩展的具体(非抽象)类必须实现扩展抽象类的抽象方法。定义方法的实现是在方法签名中没有abstract - 关键字的情况下编写的。

您可能应该阅读有关抽象类和方法的Java SE教程:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

  

我可以将任何代码放在新的MyWebViewClient(){}中进行定义   变量和其他函数?

是的,但还有另一个问题:因为看起来你将MyWebViewClient的“匿名”实现提供给另一个类(静态?)方法DCWebView.setWebViewClient(),DCWebView可能只知道在(抽象?)MyWebViewClient,并且不能访问任何其他方法,即使它们是公共的。但是,如果要分解MyWebViewClient的匿名实现以分离私有方法并在其中使用成员变量,则可以自由地执行此操作。