2014-10-29 25 views
1

我在这样的不同包中有两个类。 基类:具有默认(包)可视性的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中的某种错误吗?

回答

0

正是在Dalvik的一个已知的错误(和它won't be fixed in Dalvik):

https://code.google.com/p/android/issues/detail?id=60406

由于Base.boo()是包专用:它不能在另一个包被覆盖。所以ART的结果是正确的;结果与Dalvik是错误的。

的 “包树” 做概念不存在于Java的:

com.company.a 
com.company.a.b 
com.company.b 

仅有3个不同的套餐:有com.company.acom.company.a.b

+0

OK之间没有特殊关系,但Java是好的,在父母和孩子中使用相同的签名私人方法。 (而不是覆盖)然后,当你在父对象的实例上调用这个方法时,会调用父对象的方法,并在子对象的实例上调用子对象的方法。这里的child的实例对象是parent的方法。这很奇怪。首先,当你调用'mChild.boo()'而不是'Base.redirect(mChild)'时,你会得到正确的结果。 – bio007 2014-10-29 10:55:14

相关问题