我在这样的不同包中有两个类。基类:
package com.example.artpackageprivate.base;
public class Base {
protected final Context mContext;
public Base(final Context context) {
mContext = context;
}
public void foo() {
boo();
}
/*package*/ void boo()
{
Toast.makeText(mContext, "Base", Toast.LENGTH_LONG).show();
}
public static void redirect(Base object) {
object.boo();
}
和子类:
com.example.artpackageprivate.child;
public class Child extends Base {
public Child(Context context) {
super(context);
}
@Override
public void foo() {
boo();
}
public /*or whatever*/ void boo()
{
Toast.makeText(mContext, "Child", Toast.LENGTH_LONG).show();
}
我有一个 Child 类的对象,我调用 child.boo() 我希望打印“Child”。这真的是我通常得到的。使用 Dalvik,它实际上总是有效的。但是当我切换到 ART 时,我得到了 2 个不同的输出。
当从 Child 类的“包树”调用 child.boo() 时,我得到“Child”。问题是当我从包 com.example.artpackageprivate.base 中的类调用它时。结果是“Base”,尽管对象是 Child 类的一个实例。
这是进行调用的 Activity 类代码(Activity 仅包含 2 个按钮):
package com.example.artpackageprivate;
public class MainActivity extends Activity {
private Base mBase;
private Child mChild;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBase = new Base(this);
mChild = new Child(this);
}
public void onChildButtonClick(View view) {
Base.redirect(mChild);
}
public void onBaseButtonClick(View view) {
mBase.foo();
}
}
在 Dalvik 和 ART(都是 android Kitkat)上运行这段代码,我得到了 2 个不同的结果。按下 BaseButton 结果始终是“Base”。ChildButton 的结果是 Dalvik 上的“Child”和 ART 上的“Base”。这怎么可能?这是ART中的某种错误吗?