Здравствуйте. Когда-то я постил аналогичный топик, но там допустил грубую ошибку и вопрос потерял смысл — в Java все методы по умолчанию виртуальные. Но есть уже другая ситуация.
class A
{
public int meth() { return 10; }
public void coolMeth()
{
System.out.println(meth()); // !!! НЕ хочется, чтобы вот здесь сработал полиморфный вызов
}
}
class B extends A
{
public int meth() { return 20; }
}
class Test
{
public static void main(String[] args)
{
A a = new A();
B b = new B();
a.coolMeth(); // выводит 10
b.coolMeth(); // выводит 20, а я хочу 10!
}
}
Строка помеченная тремя восклицательными флагами содержит полиморфный вызов meth().
Мои попытки избавиться от этого:
System.out.println(this.meth()); // естественно не работает, поскольку динамический тип this'a = B
System.out.println((A)this.meth()); // тоже не работает, поскольку динамический тип this'a = B, а преобразование ничего не даёт.
System.out.println((new A()).meth()); // работает, но это уже от Лукавого... :) - объект другой
Как?