Передача значений разных типов данных в метод перегрузки - PullRequest
0 голосов
/ 03 июля 2018

Я передаю двойное значение перегруженному методу, но оно принимает его как float и вызывает метод для нахождения площади квадрата. Значения с плавающей точкой должны иметь букву "f" до конца, чтобы считаться с плавающей точкой, верно? так почему моя программа вызывает float «площадь квадрата», когда она должна вызывать «площадь круга»?

public class App {
    public void calArea(float a) {
        System.out.println("Area of square is Side x Side : " + a * a);
    }

    public void calArea(float a, float b) {
        System.out.println("Area of rectangle is length x width" + a * b);
    }

    public void calArea(double r) {
        double area = (Math.PI * r * r);
        System.out.println("Area of circle is Radius x Radius x PI : " + area);
    }

    public static void main(String[] args) {

        App app = new App();

        app.calArea(5);
    }

}

Ответы [ 5 ]

0 голосов
/ 03 июля 2018

, чтобы ответить «почему моя программа вызывает float« площадь квадрата », когда она должна вызывать« площадь круга »?»

Это потому, что метод точного совпадения, который принимает аргумент int, не найден, следовательно, основан на расширении, вызывается ближайший сопоставленный метод (здесь его float) расширение происходит в порядке ниже byte -> short -> int -> long -> float -> double

в вашем случае его (int -> long -> float -> double) поскольку вы передаете аргумент int, следовательно, ближайшее совпадение является методом, который принимает аргумент с плавающей точкой, следовательно, calArea (float a) называется

[чтобы проверить эту попытку, включая метод, который принимает длинный аргумент, и вы увидите, что он получит шанс выполнить вместо более раннего метода, который принимает аргумент с плавающей запятой]

1011 * например *

  1. public void calArea (int a) { System.out.println ( "ИНТ"); }

  2. public void calArea (long a) { System.out.println ( "длинный"); }

  3. public void calArea (float a) { System.out.println ( "плавать"); }
  4. public void calArea (double a) { System.out.println ( "двойной"); }

вызов метода is - calArea (5); Случай 1: допустим, нет комментариев здесь будет вызван метод, принимающий аргумент int.

case 2: теперь комментируйте / удаляйте первый метод (принимает аргумент int) здесь будет вызван метод, принимающий длинный аргумент.

case 3: теперь снова прокомментируйте метод 1 и 2 метод здесь будет вызван метод, принимающий аргумент float. и так далее ...

0 голосов
/ 03 июля 2018

Самый простой способ вызвать метод 'area of ​​circle' - просто вызвать основной метод как " app.calArea (5d); ". При записи 5d или 5.0d область круга будет вызван метод, потому что значение 5d считается двойным. И если вы хотите вызвать метод 'area of ​​square', вы можете сделать это любым способом: (1) app.calArea (5f); или (2) app.calArea (5 ) .

Итак, если вы хотите продолжить перегрузку вашего метода и вызвать 'area of ​​circle', вы можете сделать это следующим образом

public class App {
    public void calArea(float a) {
        System.out.println("Area of square is Side x Side : " + a * a);
    }

    public void calArea(float a, float b) {
        System.out.println("Area of rectangle is length x width" + a * b);
    }

    public void calArea(double r) {
        double area = (Math.PI * r * r);
        System.out.println("Area of circle is Radius x Radius x PI : " + area);
    }

    public static void main(String[] args) {

        App app = new App();

        app.calArea(5d);
    }

}
0 голосов
/ 03 июля 2018

Я просто оставляю свой комментарий как ответ, потому что это единственный способ решить вашу проблему без приведения.

Вместо использования double и float, чтобы различать, какие области следует рассчитать. Просто назовите их по-разному . Это избавит вас от головной боли при просмотре кода.

Будет ли app.calArea(5) вычислять площадь круга или квадрата?

Так что просто измените свой код на это:

public class App {
    public void calAreaSquare(double a) {
        System.out.println("Area of square is Side x Side : " + a * a);
    }

    public void calAreaRectangle(double a, double b) {
        System.out.println("Area of rectangle is length x width" + a * b);
    }

    public void calAreaCircle(double r) {
        double area = (Math.PI * r * r);
        System.out.println("Area of circle is Radius x Radius x PI : " + area);
    }

    public static void main(String[] args) {

        App app = new App();

        app.calAreaCircle(5);
    }
}

Я бы также предложил использовать только double для повышения точности.

0 голосов
/ 03 июля 2018

Здесь - некоторые цитаты из спецификации языка, объясняющие это поведение.

Раздел 15.12.2.5 Выбор наиболее специфического метода

Если более одного метода-члена доступны и применимы к При вызове метода необходимо выбрать один для предоставления дескриптор для отправки метода во время выполнения. Java программирование В языке используется правило, согласно которому выбирается наиболее специфичный метод . Неформальная интуиция заключается в том, что один метод более специфичен, чем другой , если любой вызов, обработанный первым методом, может быть передан другой без ошибки времени компиляции.

В вашем случае, calArea(float) и calArea(double) применимы для одного аргумента int (int может быть преобразовано в float или double посредством преобразования примитивного расширения).

Теперь компилятор должен решить, что является более конкретным. В конце концов, компилятор выбрал calArea(float), потому что он более специфичен, чем calArea(double).

Каждый вызов, который применим к calArea(float), применим к calArea(double) (неявное преобразование примитивного расширения с float в double), но не наоборот (вам нужен приведение для преобразования из double в float).

Поэтому компилятор выбрал перегрузку calArea(float).

0 голосов
/ 03 июля 2018

Когда вы передаете значение типа int, а не double .... так вычисляется 'площадь квадрата' Для 'области круга' вы должны передать десятичное значение в качестве аргумента при вызове функции.

...