powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / overriding Vs overloading
25 сообщений из 42, страница 1 из 2
overriding Vs overloading
    #38637580
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
такой вот код.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A{
    public static void m(Number n){
         System.out.println("Number A");
    };
}
class B extends A{
     public static int m(Number n){
        System.out.println("Number B");
        return 1;
      };
}



очевидно, что он не компилится.


Но смущает то, что выдает компилятор:

авторjava: m(java.lang.Number) in inheritanceTest.B cannot override m(java.lang.Number) in inheritanceTest.A
return type int is not compatible with void

Для меня override это полиморфизм... нет же никакого полиморфизма для статических методов.

Ведь это же overloading.


или jls как то по другому определяет override или ещё что-то я не понимаю - разъясните.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637582
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LS §8.4.8.3 (Java 8) says:

автор If a method declaration d1 with return type R1 overrides or hides the declaration of another method d2 with return type R2, then d1 must be return-type-substitutable (§8.4.5) for d2, or a compile-time error occurs.

Круто) компилятор по ходу работает абсолютно как jls)

а вот то, что в сообщение они забыли дописать слово hide - печально
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637633
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сокрытие - это переопределение метода с точно такой же сигнатурой.
Ваш случай, вообще говоря, именно перекрытие.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637646
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Basil A. Sidorovперекрытие

hides?
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637684
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerhides?override (overload).

P.S. Почему плохо сочетать статику и полиморфизм - рассмотрено в "(Most) Effective C++".
Выводы - вполне универсальны.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637687
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovquestionerhides?override (overload).



Хотите сказать, что jls не различаети override и overload?
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637739
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,
и всё таки это hiding
jlsIf a subclass defines a static method with the same signature as a static method in the superclass, then the method in the subclass hides the one in the superclass.
http://docs.oracle.com/javase/tutorial/java/IandI/override.html
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637743
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerи всё таки это hidingДля компилятора сигнатура включает всё. И тип возвращаемого значения в том числе.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637758
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,
читаем, что пишут в jls:
jlsTwo methods have the same signature if they have the same name and argument types.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637778
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner ,
Вы привели выдержку из спецификации языка . А Basil A. Sidorov говорит о том, как на такие конструкции реагирует компилятор . Это разные вещи.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637781
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoach questioner ,
Вы привели выдержку из спецификации языка . А Basil A. Sidorov говорит о том, как на такие конструкции реагирует компилятор . Это разные вещи.

jlsIf a subclass defines a static method with the same signature as a static method in the superclass, then the method in the subclass hides the one in the superclass.

jlsTwo methods have the same signature if they have the same name and argument types.

вы считаете, что jls в одном месте определяет что такое равенство сигнатур метода, а в другом месте использует другое значение для этого термина?
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637783
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovquestionerи всё таки это hidingДля компилятора сигнатура включает всё. И тип возвращаемого значения в том числе.

я ж не говорю,что это неправда - я реально не знаю, но ведь это абсолютно никак не относится к делу. Выражайте пожалуйста мысли целиком.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637874
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerя ж не говорю,что это неправда - я реально не знаю, но ведь это абсолютно никак не относится к делу. Выражайте пожалуйста мысли целиком.Я считаю, что приведённый пример - перегрузка, а не сокрытие.
К делу это действительно не относится и скрывать/перегружать методы класса (статические методы) - не надо.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637927
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

давайте разберемся
overloading:
jlsIf two methods of a class (whether both declared in the same class, or both inherited by a class, or one declared and one inherited) have the same name but signatures that are not override-equivalent, then the method name is said to be overloaded.

hiding:
jlsIf a class C declares or inherits a static method m, then m is said to hide any method m', where the signature of m is a subsignature (§8.4.2) of the signature of m', in the superclasses and superinterfaces of C that would otherwise be accessible to code in C.

Помогайте)))

Я не совсем уверен, но для меня это выглядит, что hiding это часть overloading-а для статических методов...
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637939
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Так, попробуем собрать всё воедино:


jlsTwo methods have the same signature if they have the same name and argument types

jls The signature of a method m1 is a subsignature of the signature of a method m2 if either:

m2 has the same signature as m1, or
the signature of m1 is the same as the erasure (§4.6) of the signature of m2.

Two method signatures m1 and m2 are override-equivalent iff either m1 is a subsignature of m2 or m2 is a subsignature of m1.

jlsIf two methods of a class (whether both declared in the same class, or both inherited by a class, or one declared and one inherited) have the same name but signatures that are not override-equivalent, then the method name is said to be overloaded.


вернемся к первому примеру:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A{
    public static void m(Number n){
         System.out.println("Number A");
    };
}
class B extends A{
     public static int m(Number n){
        System.out.println("Number B");
        return 1;
      };
}



у нас тут two methods of a class (whether both declared in the same class, or both inherited by a class, or one declared and one inherited) have the same name but signatures that are not override-equivalent , then the method name is said to be overloaded.[/quote]

are not override-equivalent - у нас явно override-equivalent !

Мне кажется придётся Вам всё-таки согласиться, что это не overloading)
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637942
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо.
Переопределение статического метода в классе-потомке скрывает метод с аналогично сигнатурой в классе предке. Согласен.
Нежелательность такого сокрытия - остаётся в силе.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637946
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Basil A. SidorovНежелательность такого сокрытия - остаётся в силе.

Да, конечно, в жизни нежелательно так делать)

Тут был вопрос на синтаксис
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637952
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Тут был вопрос на синтаксисА мне показалось, что придирка с сообщению компилятора
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637955
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё таки, зря согласился:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class A {
  static void m(int i){
    System.out.println("class A");
  };
}
class B extends A {
  static void m(int i){
    System.out.println("class B");
  };
}

public class test {
  public static void main( String[] args ) {
    A a = new B();
    a.m(0);
    ((B) a).m(0);
  }
}

Результат:
Код: plaintext
1.
class A
class B
Вывод: компилятор запрещает перегрузку, но допускает сокрытие для статических.
Компилятор учитывает полную сигнатуру метода, включая возвращаемое значение.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38637958
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аксиома: разработчики компиляторов и прочих инструментальных средств разбираются в спецификации языка лучше, чем прикладные программисты.
Следствие: прикладной программист должен знать синтаксис и стандартную библиотеку. JLS - только в качестве развлечения :))
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38638006
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Basil A. SidorovА мне показалось, что придирка с сообщению компилятора

компилятор должен соответствовать jls) это тоже аксиома.

Basil A. Sidorov,Вывод: компилятор запрещает перегрузку
не вижу как этот демонстрируется в ващем примере.
автор но допускает сокрытие для статических.
Компилятор учитывает полную сигнатуру метода, включая возвращаемое значение.
да, допускает.


Если всё упростить и по русски, то у меня в голове сейчас следующее понимание.

перегрузка это когда у нас одинаковое имя у метода, но разный список параметров. Всё иное - не есть перегрузка.

hiding это по синтаксису то же самое, что и overriding только для статических методов.

Как мы знаем, что при overriding сигнатура(в терминах jls) должна сохраниться(как я понял из описания с учётом erasure, но это не наш случай, так что не будем об этом) возвращаемое значение должно быть ковариантно, throws <= чем у родителя и видимость >= чем у родителя.

Всё сходится.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38638019
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, да не совсем:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
class A {
  Object m(int i){
    System.out.println("class A");
    return null;
  };
  Class m(int i){
    return null;
  };
}

Код: plaintext
1.
src\test.java:6: error: method m(int) is already defined in class A
  Class m(int i){
Причина понятна - java допускает вызов функции как процедуры, что игнорирует возвращаемое значение и приводит к неопределённости. Это не позволяет скрывать один метод другим в рамках одного класса.
Разница между перегрузкой и сокрытием видна только при наследовании:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class A {
  Object m(int i){
    System.out.println("class A");
    return null;
  };
}
class B extends A {
  Class m(int i){
    System.out.println("class B");
    return null;
  };
}

public class test {
  public static void main( String[] args ) {
    System.out.println(args[0]);
    A a = new B();
    a.m(0);
    ((B) a).m(0);
  }
}

Допускается сокрытие реализации, если методы совпадают по списку аргументов, а типы возвращаемых значений совместимы по иерархии наследования.
"Статичность" метода влияет только на способ выбора реализации:
Код: plaintext
1.
class B
class B
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38638021
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
public class test {
  public static void main( String[] args ) {
//    System.out.println(args[0]); // простой способ вызвать исключение времени выполнения
    A a = new B();
    a.m(0);
    ((B) a).m(0);
  }
}
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38638039
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,
вроде всё так написали. я согласен.

почему?
Basil A. SidorovТак, да не совсем:


на hiding вроде как действуют те же самые правила, что на overriding.
...
Рейтинг: 0 / 0
overriding Vs overloading
    #38638046
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёршвашумедь ...
Таблица методов класса не может содержать два метода с идентичным списком аргументов и разными типами возвращаемого значения. Потому что неопределённость.
Поэтому таблица методов может вообще не хранить возвращаемые типы. Что приводит нас к формулировке "(только) список аргументов".
Но! Если класс-потомок скрывает метод родительского класса, то в таблице его методов скрывающий метод будет прописан в той же точке таблицы, что и скрываемый метод родительского класса. Именно поэтому используется термин "сокрытие".
В результата, если скрывающий метод будет возвращать тип, который не совместим по присваиванию с типом скрываемого метода - получаем нарушение интерфейса класса. У предка метод, возвращающий определённый тип был, а у потомка такой метод, внезапно, исчез.
Так вот, в этой ситуации компилятор выдаёт сообщение о некорректном перекрытии метода и термин перекрытие - истинная правда.
Статичность в этой ситуации - совершенно побоку.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / overriding Vs overloading
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]