0

我创建了如下所示的类。但是不调用 Override 方法。我错过了什么吗?否则我需要添加任何关键字(like Virtual)以用作覆盖?

MyWebView.java

package com.example.stackoverflow;    

import android.content.Context;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;

public class MyWebView extends WebView 
{
    WebView localView;
    static Context localcontext;
    A aclass;

    public MyWebView(Context context)
    {
        super(context);     
        localcontext=context;
    }

    public LinearLayout init()
    {
        LinearLayout layout=new LinearLayout(localcontext);
        localView=new WebView(localcontext);
        localView.setWebViewClient(new MyClient());
        aclass=new A();
        layout.addView(localView);
        return layout;
    }

    class MyClient extends WebViewClient
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            aclass.startMyMethod();
            return super.shouldOverrideUrlLoading(view, url);
        }
    }

}

爪哇

package com.example.stackoverflow;

import android.os.Bundle;
import android.widget.LinearLayout;
import android.app.Activity;

public class A extends Activity 
{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyWebView view=new MyWebView(this);
        LinearLayout layout = view.init();
        view.loadUrl("https://www.google.co.in/");
        setContentView(layout);
     }

    public void startMyMethod() 
    {       
        System.out.println("ParentMethod");
    }
}

B.java(MainActivity)

package com.example.stackoverflow;

import android.os.Bundle;

public class B extends A {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     }

    @Override
    public void startMyMethod() {
        System.out.println("ChildMethod");
        super.startMyMethod();
    }

}

注意:B 类是客户端类。其他两个在 jar 文件中。我如何在 jar 文件(库源)中使用 new B()。名称 B 可能会更改。如果父方法被覆盖,则不应执行父内容

4

3 回答 3

2

Java 没有任何关键字 like virtual,默认情况下所有 Java 非静态方法都是虚拟的。请参阅http://en.wikipedia.org/wiki/Virtual_function#Java

@Override 注释用于指示编译器您正在覆盖超类方法。看这里

A a =new A();
a.startMyMethod(); // calls A.startMyMethod()

A b = new B(); // Object reference of type A and Object of B
a.startMyMethod(); // calls B.startMyMethod()
于 2012-09-27T07:45:34.043 回答
1

如果您创建 ClassB 的实例并调用如下覆盖的方法,它应该可以工作:

ClassB b = new ClassB();
b.strartMyMehtod();

在调用父级之前在 ClassB 方法中放置一些打印内容以查看差异。

class A
{
     public void startMyMethod()
     {
         System.out.println("A.startMyMethod() called");
     }
 }    

class B extends A
 {
    @Override
     public void startMyMethod() {
         System.out.println("B.startMyMethod() called");
        // TODO Auto-generated method stub
        super.startMyMethod();
     }
 }
于 2012-09-27T07:44:40.560 回答
1

在您的 init() 方法中,MyWebView.java您将变量变量初始化 aclassaclass=new A();

shouldOverrideUrlLoading()方法中,您调用

aclass.startMyMethod();

由于 A 是父类,它只会调用 A 类的 startMyMethod()。

为了获得继承和覆盖的优势,您可以初始化 aclass变量as aclass=new B();这将调用B类的startMyMethod(),然后调用A类的startMyMethod(),因为使用super.startMyMethod();

http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html

@Override — @Override 注释通知编译器该元素旨在覆盖在超类中声明的元素(覆盖方法将在标题为“接口和继承”的课程中讨论)。

不适用于程序执行顺序。我希望这可能是你想要的。

于 2012-09-27T07:51:38.470 回答