ошибка метод, перегруженный в java

Привет alquien он мог бы помогать мне? nose, потому что он дает мне эту ошибку.

abstract class Uno {
        protected int d1,d2;
        abstract public int devolver_suma (int x,int y);
}
class Dos extends Uno {
    public int devolver_suma(int x,int y) {
        d1=x+3;
        d2=y+3;
        return d1+d2;
    }

}
class Tres extends Dos {
    public int devolver_suma(int x,int y) {
        d1=x-3;
        d2=y-3;
        return d1+d2;
    }
    public int devolver_suma(int x,int y, int i, int j) {
        d1=x-i;
        d2=y-j;
        return d1+d2;
    }
}
class Principal {
    public static void main(String [] args) {
        int c=0,d=0;
        Uno []lista=new Uno[2];
        lista [0]= new Dos();
        lista [1]= new Tres();
        for (int i=0; i<2; i++){
            d=lista[i].devolver_suma(10,10);
            System.out.printf("d=%d \n",d);
            c=lista[i].devolver_suma(2,2,2,2); /*aqui me dice que que el metodo no es aplicable con esos argunmentos, osea que no se me sobrecarga.*/
            System.out.printf("c=%d \n",c);
        }
    }
}
2
задан 16.05.2016, 22:08
5 ответов

Проблема дает это тебе потому что lista[i] в первом повторении for это инстанция класса Dos. Это вызывает, что призыв к методу devuelve_suma с четырьмя параметрами ошибки, так как класс Dos у него нет этого очевидного метода, только это у него есть с двумя параметрами.

Ты был бы должен подтверждать класс, которому он принадлежит lista[i] чтобы это решать. Конечно, для этой программы примера. В реальном приложении ты не был бы должен группировать объекты различных классов в array, или по крайней мере не реализовывать эти операции (перегрузка методов и пробегать array).

Ты можешь решать это с этим кодом:

for (int i = 0; i<2; i++) {    
  d=lista[i].devolver_suma(10,10);
  System.out.printf("d=%d \n",d);
  if(lista[i] instanceof Tres) {
    c=lista[i].devolver_suma(2,2,2,2);
    System.out.printf("c=%d \n",c);
  }
}
1
ответ дан 24.11.2019, 14:21

_./

Решение очень простое.

Проблема дает это тебе потому что lista[i] в первом повторении for инстанции класса Два. Это вызывает, что призыв к методу devuelve_suma() с четырьмя параметрами ошибки, так как класс у Двух нет этого очевидного метода, только это у него есть с двумя параметрами.

Ошибка - повторение списка.

Удачи! :D

1
ответ дан 24.11.2019, 14:21

Ты должен упорядочивать это со следующей линией:

c=((Tres)lista[i]).devolver_suma(2,2,2,2);

Почему?

Потому что абстрактный класс, который ты получаешь в наследство, не обладает этим числом параметров, не обладает даже эта функция на этом уровне тем, что ты это пробуешь.

0
ответ дан 24.11.2019, 14:21

Проблема состоит в том, что твоя договоренность объявлена как будто переменные были типа Uno, здесь:

Uno[] lista = new Uno[2];

В Java, поработав с переменной, одинокий могут соглашаться на членов (признаки и методы), который находился бы в типе класса, определенном для переменной. Класс Uno он не обладает методом с подписью int devolver_suma(int, int, int, int), поэтому ошибка компиляции. Не важно, если ты инициализируешь элементы договоренности как будто они были класса Dos или Tres, одинокий составитель понимает, что элементы lista они типа Uno.

Чтобы это решать, лучшая альтернатива состоит в том, чтобы использовать casteo вниз (downcasting на английском). Это состоит, в том, чтобы определенная переменная типа класса вела себя как класс типа, который он получает в наследство или увеличивает вышеупомянутого класса. В этом случае, дело в том, что переменные в твоей договоренности Uno[] lista ведите себя как специфический тип Dos или Tres. Чтобы уверять, что он становится casteo вниз правильно, возможно использовать оператора instanceof:

if (lista[i] instanceof Tres) {
    c=lista[i].devolver_suma(2,2,2,2);
    System.out.printf("c=%d \n",c);
}

c=lista[i].devolver_suma(2,2,2,2); /*aqui me dice que que el metodo no es aplicable con esos argunmentos, osea que no se me sobrecarga.*/

Перегрузка функционирует правильно, но только - для метода devolver_suma определенный в классе Tres. Перегрузка методов (overloading) функционирует на единственном классе, в то время как наследство и полиморфизм методов функционируют между классом предок и Ваши потомки.

0
ответ дан 24.11.2019, 14:21

Ошибка дает себе, потому что она funciГіn он только идет, функционировать с этой подписью если и только, если i = 1 (lista [1]= new Tres()), первый раз, который вводит в компьютер в цикл i = 0 (lista [0]= new Dos()), в этот уровень не существует она definiciГіn тебя funciГіn с этой подписью, поэтому поднимает одну excepciГіn.

Главным образом единственная форма, в которой идет функционировать, - такая:

c=lista[1].devolver_suma(2,2,2,2);

Другой серьезный выбор делая ясный casteo:

c=(Tres)lista[0].devolver_suma(2,2,2,2);
-1
ответ дан 24.11.2019, 14:21

Теги

Похожие вопросы