Не могу понять из-за чего возникает runtime error

136
19 октября 2018, 19:00

Есть два класса:

public class A
{
    private int _a;
    public A()
    {
      _a=1;
    }
    public void f1(A a)
    {
      if(a instanceof B)
      {
        f1((B) a);
      }
      else
        System.out.println("Nothing");
    }
    //...
}

public class B extends A
{
    private int _a;
    private int _b;
    public B()
    {
      _b=100;
    }
    public void f1(B b)
    {
      System.out.println("B::f1(B)");
    }
    public void f1(Object o)
    {
      System.out.println("B::f1(Object)");
    }
    //...
}

И блок кода в main ():

B b = new B();
A a = b;
b.f1(a);

Когда я пытаюсь запустить программу, выходит:

runtime error

Я не могу понять по какой причине это происходит, а именно почему в блоке кода

if(a instanceof B)
{
    f1((B) a);
}

Продолжает вызываться метод f1 () в классе А, а не в классе B?

Буду благодарен если мне кто-нибудь объяснит логику происходящего.

Answer 1

В классе A происходит рекурсивный вызов функции f1():

public void f1(A a) {
      if (a instanceof B) {
        f1((B) a);
      }
      else {
        System.out.println("Nothing");
      }
    }

Для того, чтобы дать компилятору понять, что ему нужно искать не метод текущего класса, а метод объекта, нужно сделать что-то вроде ((B) a).f1(a);

В случае если не планируется переопределять метод в классе-потомке, подойдет:

B bFromA = (B) a;
bFromA.f1(bFromA);

В данном случае наверное лучше выбрать что-то одно - переопределение (override) или перегрузку (overload), а то выглядит слишком громоздко.

Строго говоря в текущей конфигурации решение не являет перегрузкой, т.к. у класса A только один метод f1(), хотя судя по тегам именно она задумывалась при описании.

READ ALSO
Создание RESTful Web-сервиса Spring

Создание RESTful Web-сервиса Spring

друзья! Изучаю Spring, создал restful web-service на Spring и разбираю в данный момент приложение, но не пойму где находится: {"id":1,"content":"Hello, World!"} - JSON строка,...

157
Ошибка при загрузке web-приложения java на tomcat

Ошибка при загрузке web-приложения java на tomcat

Изучаю spring, перевожу web приложение java на springПри загрузке выскакивает ошибка: One or more listeners failed to start

165
AWS размер каталога (папки)

AWS размер каталога (папки)

мне интересно, как взять размер конкретной папки в amazonClient ? Я знаю, что все внутри Амазона - это обьектыНо ведь как-то же можно взять размер...

137