我创建了如下所示的类。但是不调用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可能会被更改。 如果覆盖父方法,则不应执行父内容
答案 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用于覆盖超类中声明的元素 (重写方法将在标题为的课程中讨论 “接口和继承”)。
不适用于程序执行顺序。我希望这可能是你想要的。