У меня есть два класса в разных пакетах, подобных этому. Базовый класс:Метод 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 он работает всегда. Но когда я переключаюсь на АРТ, у меня получается 2 разных выхода.
Когда child.boo() вызывается из «дерева пакетов» класса Child, я получаю «Child». Проблема в том, что я вызываю его из класса в пакете com.example.artpackageprivate.base. Результатом является «Base», хотя объект является экземпляром класса Child.
Вот класс активности код, который делает вызовы (активность содержит только две кнопки):
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();
}
}
Running этот код на Dalvik и на АРТ (как андроида KitKat) Я получаю 2 разные результаты , При нажатии BaseButton результат всегда «Base». Результат ChildButton - «Ребенок» на Dalvik и «Base» на ART. Как это возможно? Это какая-то ошибка в АРТ?
КАМИ, но Java является OK с теми же сигнатурными методами в родительском и дочернем. (не переопределяя). Затем, когда вы вызываете этот метод в экземпляре родителя, метод родителя вызывается, а на дочернем экземпляре вызывается метод child. Здесь на объекте экземпляра ребенка вызывается метод родителя. Это странно. Прежде всего, когда вы вызываете 'mChild.boo()' вместо 'Base.redirect (mChild)', вы получите правильный результат. – bio007