创建自定义覆盖方法问题

时间:2012-09-27 07:38:21

标签: java inheritance method-overriding

我创建了如下所示的类。但是不调用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);
        }
    }

}

A.java

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文件(库源)中使用新的B()。名称B可能会被更改。 如果覆盖父方法,则不应执行父内容

3 个答案:

答案 0 :(得分:2)

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

@Override注释用于指示编译器重写超类方法。见here

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()

答案 1 :(得分: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();
     }
 }

答案 2 :(得分:1)

MyWebView.java的init()方法中初始化变量 aclass变量为aclass=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注释通知编译器   element用于覆盖超类中声明的元素   (重写方法将在标题为的课程中讨论   “接口和继承”)。

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