Перегрузка и переопределение Java

Также немного поздно, но сегодня у меня была такая же потребность, поэтому я искал в Google и, наконец, простой общий подход, найденный здесь в статье Pinal Dave http://blog.sqlauthority.com/2014/03/09 / mysql-reset-row-number-for-each-group-partition-by-row-number /

Я хотел сосредоточиться на первоначальном вопросе Павла (это тоже моя проблема) поэтому я обобщаю свое решение как рабочий пример.

Beacuse мы хотим разделить на два столбца, я бы создал переменную SET во время итерации, чтобы определить, была ли запущена новая группа.

SELECT col1, col2, col3 FROM (
  SELECT col1, col2, col3,
         @n := CASE WHEN @v = MAKE_SET(3, col1, col2)
                    THEN @n + 1 -- if we are in the same group
                    ELSE 1 -- next group starts so we reset the counter
                END AS row_number,
         @v := MAKE_SET(3, col1, col2) -- we store the current value for next iteration
    FROM Table1, (SELECT @n := 0, @v := NULL) r -- helper table for iteration with startup values
   ORDER BY col1, col2, col3 DESC -- because we want the row with maximum value
) x WHERE row_number = 1 -- and here we select exactly the wanted row from each group

Средство 3 при первом параметре MAKE_SET, которое я хочу, имеет значение в SET (3 = 1 | 2). Конечно, если у нас нет двух или более столбцов, строящих группы, мы можем исключить операцию MAKE_SET. Конструкция точно такая же. Это работает для меня, как требуется. Большое спасибо Пиналу Дейву за его четкую демонстрацию.

21
задан Padmanabh 18 March 2010 в 12:30
поделиться

3 ответа

Вы правы - вызовы перегруженных методов осуществляются во время компиляции. Поэтому он статический .

Вызов переопределенных методов реализуется во время выполнения в зависимости от типа, для которого этот метод вызывается.

Википедия о виртуальных методах говорит:

В Java все нестатические методы по умолчанию являются «виртуальными функциями». Только методы, отмеченные ключевым словом final, не являются виртуальными. Методы

final не могут быть переопределены, поэтому они реализованы статически.

Представьте себе метод:

public String analyze(Interface i) {
     i.analyze();
     return i.getAnalysisDetails();
}

Компилятор не может перегрузить этот метод для всех реализаций интерфейса , которые могут быть ему переданы.

11
ответ дан 29 November 2019 в 20:35
поделиться

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

Полиморфизм относится к динамической привязке метода к его вызову, когда вы используете ссылку на базовый класс для объекта производного класса. Переопределение методов - это то, как вы реализуете это полиморфное поведение.

5
ответ дан 29 November 2019 в 20:35
поделиться

Перегрузка методов означает создание нескольких версий функции на основе входных данных. Например:

public Double doSomething(Double x) { ... }
public Object doSomething(Object y) { ... }

Выбор метода для вызова осуществляется во время компиляции. Например:

Double obj1 = new Double();
doSomething(obj1); // calls the Double version

Object obj2 = new Object();
doSomething(obj2); // calls the Object version

Object obj3 = new Double();
doSomething(obj3); // calls the Object version because the compilers see the 
                   // type as Object
                   // This makes more sense when you consider something like

public void myMethod(Object o) {
  doSomething(o);
}
myMethod(new Double(5));
// inside the call to myMethod, it sees only that it has an Object
// it can't tell that it's a Double at compile time

Переопределение метода означает определение новой версии метода подклассом исходного

class Parent {
  public void myMethod() { ... }
}
class Child extends Parent {
  @Override
  public void myMethod() { ... }
}

Parent p = new Parent();
p.myMethod(); // calls Parent's myMethod

Child c = new Child();
c.myMethod(); // calls Child's myMethod

Parent pc = new Child();
pc.myMethod(); // call's Child's myMethod because the type is checked at runtime
               // rather than compile time

Надеюсь, это поможет

23
ответ дан 29 November 2019 в 20:35
поделиться
Другие вопросы по тегам:

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