我在這樣的不同包中有兩個類。 基類:具有默認(包)可視性的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