我在这样的不同包中有两个类。 基类:具有默认(包)可视性的Android方法在ART中调用不正确
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.boo()我期望能获得“儿童”字样。这实际上是我通常得到的。随着Dalvik它实际上始终工作。但是当我切换到ART时,我得到2个不同的输出。
当Child.boo()从Child类的“包树”中调用时,我得到“Child”。问题是当我从包com.example.artpackageprivate.base中的类中调用它时。结果是“Base”,尽管该对象是Child类的一个实例。
这里是正在调用(活动仅包含2个按钮)Activity类代码:
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奇巧)的代码我得到2个不同的结果。按BaseButton结果总是“Base”。 ChildButton的结果是Dalvik上的“Child”和ART上的“Base”。这怎么可能?这是ART中的某种错误吗?
OK之间没有特殊关系,但Java是好的,在父母和孩子中使用相同的签名私人方法。 (而不是覆盖)然后,当你在父对象的实例上调用这个方法时,会调用父对象的方法,并在子对象的实例上调用子对象的方法。这里的child的实例对象是parent的方法。这很奇怪。首先,当你调用'mChild.boo()'而不是'Base.redirect(mChild)'时,你会得到正确的结果。 – bio007 2014-10-29 10:55:14