【问题标题】:class initialization function definition in javajava中的类初始化函数定义
【发布时间】:2011-11-20 14:26:32
【问题描述】:

我收到错误“抽象方法没有指定主体”,下面的代码......

    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() { } 中放入任何代码来定义变量和其他函数吗?

这里还能做哪些很棒的事情?

【问题讨论】:

    标签: java android anonymous-class


    【解决方案1】:

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

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

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

    匿名类在 Java 中非常常用,但这是更高级的东西。正如esaj said 在他的回答中一样,阅读有关此内容的内容是个好主意。网络上有很多信息,例如herehere

    【讨论】:

    • 它不起作用,然后我收到错误The method launchExternalBrowser(String) of type new MyWebViewClient(){} must override or implement a supertype method
    • 你需要拿起一本关于Java的书读一会儿。您的方法不会覆盖 MyWebViewClient 中的任何内容,因此您需要删除 @Override 注释。
    • launchExternalBrowser 是否覆盖其父类中的方法?如果没有,请删除 @Override 注释。
    • 好的,然后尝试删除@Override@Override 表示您覆盖了在MyWebViewClient 中定义的方法。我假设launchExternalBrowser 在那里定义,如果不是,那么你不能覆盖它,因此应该删除@Override 注释。
    【解决方案2】:

    抽象方法用于定义没有实现的方法。从抽象类扩展的具体(非抽象)类必须实现扩展抽象类的抽象方法。定义方法的实现在其方法签名中没有abstract-keyword。

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

    我可以在 new MyWebViewClient() { } 中放入任何代码来定义 变量和其他函数?

    是的,但还有另一个问题:您似乎将 MyWebViewClient 的“匿名”实现提供给另一个类的(静态?)方法 DCWebView.setWebViewClient(),DCWebView 可能只知道在 (抽象?)MyWebViewClient,并且不能访问任何其他方法,即使它们是公共的。但是,如果您想将 MyWebViewClient 的匿名实现分解为单独的私有方法并在其中使用成员变量,您可以随意这样做。

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 2014-03-21
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多