我在这样的不同包中有两个类。 基类:
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时,我得到两个不同的输出。
当从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中的某种虫子吗?
答案 0 :(得分:0)
这是Dalvik中的一个已知错误(以及它won't be fixed in Dalvik):
https://code.google.com/p/android/issues/detail?id=60406
由于Base.boo()
是包私有:它不能在另一个包中重写。因此ART的结果是正确的;达尔维克的结果是错误的。
"包树"的概念不存在于java:
com.company.a
com.company.a.b
com.company.b
只是3个不同的包:com.company.a
和com.company.a.b
之间没有特殊关系