Java, перегружающийся по сравнению с переопределением

Чтение строк и сохранение их в 2-мерном массиве:

   String[][] data=new String [10][10];
   Scanner sc=new Scanner(System.in);
   for(int i=0;i<data.length;i++){
      for(int j=0;j<data[i].length;j++){
          data[i][j]=sc.nextLine();
      }
    }

Это будет динамически вводить строки и сохранять в 2D-массив.

16
задан blue_note 27 May 2018 в 21:25
поделиться

3 ответа

Вы в основном правы. Перегрузка имеет несколько методов в одном классе, где метод имеет одно и то же имя. Однако возвращаемое значение не рассматривается как часть подписи метода. Таким образом, вы не можете перегружать метод, изменяя только возвращаемое значение. У вас не может быть следующего кода из вашего примера:

public void setValue() {
   this.value = 0;
}

public int setValue() {
   return this.value;
}

Это не удастся скомпилировать.

Как определил Роб, я полагаю, вы имеете в виду переопределение , и у вас это правильно. Обратите внимание, что при переопределении вы не можете изменить тип возвращаемого значения. Начиная с Java 5, вы можете возвращать производный тип того, что возвращал метод базового класса. До Java 5 это должен быть идентичный тип. То есть, вы не можете делать ниже до Java 5 и позже:

public class AnimalNoise {}
public class Miaw extends AnimalNoise {}

public class Animal {
    public AnimalNoise makeNoise() {
        return new AnimalNoise();
    }
}

public class Cat extends Animal {
    public Miaw makeNoise() {
        return new Miaw ();
    }
}

Однако, даже в Java 5 и позже, вы не можете сделать следующее:

public class Animal {
    public String makeNoise() {
        return "silence";
    }
}

public class Cat extends Animal {
    public Miaw makeNoise() {
        return new Miaw ();
    }
}
public class Miaw {}

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

32
ответ дан 30 November 2019 в 16:36
поделиться

То, что вы описали, правильно.

Для большей ясности взгляните на концепцию полиморфизма. В Википедии есть хорошая статья

http://en.wikipedia.org/wiki/Polymorphism#Computing

http: //en.wikipedia. орг / вики / Polymorphism_in_object-oriented_programming

0
ответ дан 30 November 2019 в 16:36
поделиться

Правильно; перегрузка - это предоставление нескольких подписей для одного и того же метода.

Переопределение, которое, как я думаю, вы подразумеваете под «перезаписью», является актом обеспечения другой реализации метода, унаследованного от базового типа, и в основном является точкой полиморфизма. по наследству, то есть

public class Bicycle implements Vehicle {
    public void drive() { ... }
}

public class Motorcycle extends Bicycle {
    public void drive() {
        // Do motorcycle-specific driving here, overriding Bicycle.drive()
        // (we can still call the base method if it's useful to us here)
    }
}
6
ответ дан 30 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

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