У меня есть следующий код:
package testapp;
class Calculation {
public Calculation(){}
public void addition(int x, int y) { }
public void Subtraction(int x, int y) { }
}
class My_Calculation extends Calculation {
public My_Calculation(){}
public void multiplication(int x, int y) { }
}
public class TestApp {
public static void main(String[] args) {
int a = 20, b = 10;
My_Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
demo.multiplication(a, b);
System.out.println(demo.getClass().getName());
Calculation d = new Calculation();
d.Subtraction(b, b);
d.addition(b, b);
// no multiplication
System.out.println(d.getClass().getName());
Calculation d2 = new My_Calculation();
d2.Subtraction(b, b);
d2.addition(b, b);
// no multiplication
System.out.println(d2.getClass().getName());
}
}
Вывод такой:
demo = testapp.My_Calculation
d = testapp. Расчет
d2 = testapp.My_Calculation
Следующий оператор является объявлением, в котором имя переменной d2 ссылается на тип объекта Расчет :
Calculation d2;
Следующий оператор является инициализацией, которая вызывает конструктор My_Calculation.
Calculation d2 = new My_Calculation();
Когда я запускаю следующий код, вывод сообщает, что d2 имеет тип класса My_Calculation , но дает доступ к методам в Класс вычисления .
System.out.println(d2.getClass().getName());
Вывод: testapp.My_Calculation
Доступ: дополнение; Вычитание
Теперь мое понимание подсказывает мне, что если вызывается конструктор My_Calculation, у меня должно быть либо:
1. ТОЛЬКО доступ к умножению, или
2. доступ к сложению, вычитанию и умножению.
Но на самом деле я получаю обратное: ТОЛЬКО доступ к сложению и вычитанию . Таким образом, я считаю это нелогичным.
Может ли кто-нибудь объяснить мне, что здесь происходит, чтобы дать мне четкое понимание того, почему объект типа : My_Calculation не имеет доступа к своим собственным методам , но имеет доступ к только методы суперкласса .