Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике / 12 сообщений из 12, страница 1 из 1
10.09.2013, 10:17:18
    #38391796
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
Всем здрсте.

Спотыкаюсь об одну и ту же граблю. Опять на полиморфизме, чтоб его...
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class Gas {
  void spray() { System.out.println("Gas : run instance method spray()"); }
  static void flame() { System.out.println("Gas : run static method flame()");  }
}
class NobleGas extends Gas {
  void spray() { System.out.println("NobleGas : run instance method spray()");  }
  static void flame() { System.out.println("NobleGas : run static method flame()");  }
}
public class WhatTheFoo {
  public static void main(String[] args) {
    Gas gn = new NobleGas();
    gn.spray();
    gn.flame();
  }
}
/*
Output:
NobleGas : run instance method spray()
Gas : run static method flame()
*/


В ководстве по сдаче SCJP сказано: "polymorphism doesn’t apply to static methods." (стр. 177 "по бумаге", 215 по pdf).
Из этой фразы делаю вывод, что решение о том, метод какого класса вызвать в выделенной строке, принимает компилятор.
Но переменная хотя и объявлена относящейся к классу Gas, фактически же содержит объект класса NobleGas, и компилятор не может этого не видеть (справа от знака "=").
Тогда почему он вызывает метод класса-предка ?
...
Рейтинг: 0 / 0
10.09.2013, 10:47:51
    #38391836
Andrew1411
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
ozzmosis,

потому что.
вызывается статический метод. какого класса? - тип которого указан!
не тулите полиморфизм к статическим методам классов, они для другого придуманы. В некоторых языках не дают возможность выполнить статический метод через экземпляр (только через класс), наверно специально, что бы не смущать :)
...
Рейтинг: 0 / 0
10.09.2013, 10:51:33
    #38391845
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
ozzmosis,
хотите фокус?
Код: java
1.
2.
3.
4.
	public static void main(String[] args) {
		String s = null;
		System.out.println(s.valueOf(1));
	}


и что тут компилятор увидит?
...
Рейтинг: 0 / 0
10.09.2013, 10:57:54
    #38391853
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
Andrew1411В некоторых языках не дают возможность выполнить статический метод через экземпляр (только через класс), наверно специально, что бы не смущать :)
+1 ))
...
Рейтинг: 0 / 0
10.09.2013, 19:30:50
    #38392798
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
Andrew1411не тулите полиморфизм к статическим методам классов, они для другого придуманы.Вот я и хочу понять: почему так сделано, что статический метод класса-потомка "B", совпадающий по сигнатуре таким же методом в классе-предке "A", не может быть вызван так, как показано выше. По какой причине принятие решения о том, чей метод вызвать, распространяется только на instance-методы ?
ivanraхотите фокус?Этот "фокус" слегка не в кассу, т.к. он касается возможности вызвать статический метод, обращаясь не к имени класса, а к имени объекта этого же класса. Это просто синтаксическая плюшка, не более того.
Я же спросил про наследование и правило, по которому вызывается (или не вызывается) статический метод в классе-наследнике.
...
Рейтинг: 0 / 0
10.09.2013, 19:57:23
    #38392816
Andrew1411
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
ozzmosis,
Сделано так, потому что это ООП. Придумайте свою парадигму и реализуйте ее как хотите.
На мой взгляд, криво только то, что статический метод можно "дернуть" используя объект. Иногда это затрудняет чтение кода (именно поэтому рекомендуется использовать нормальный вызов через класс)

Фокус, кстати, в кассу. Так как по вашей хотелке вызывался бы метод у неизвестного класса, экземпляр которого в данный момент не существует (null). А так, как и положено, вызывается статический метод указанного в типе переменной класса.

Изучайте ООП и вам откроются "тайны полиморфизма". Наверно, если было "Классово-ориентированное программирование" ваш бред по поводу полиморфизма статических методов имел бы смысл, а так... мимо кассы.

кто знает - работает, кто не знает - стремится получить сертификат
...
Рейтинг: 0 / 0
10.09.2013, 20:05:06
    #38392823
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
ozzmosis,
тебе ответили:
Andrew1411не тулите полиморфизм к статическим методам классов, они для другого придуманы.
комментарии будут? Или не читал ответы?
...
Рейтинг: 0 / 0
10.09.2013, 20:35:11
    #38392847
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
Andrew1411Сделано так, потому что это ООП.И что с того, что "это ООП" ? Инстансы нельзя создать без соотв-щих классов. Написание instance-метода с совпадающей сигнатурой с методом класса-предка является переопределением (overriding'ом), а написание static-метода с совпадающей сигнатурой - уже нет.
Вы можете объяснить, почему ООП ("Объектно-Ориентированное Программирование") диктует именно такой расклад ? Это "просто так сделали" в языке java или тут более фундаментальная причина ?
Andrew1411 Придумайте свою парадигму и реализуйте ее как хотите.Не посылайте меня за ядом в аптеку, плз. Вопрос мой никакой агрессии не несёт :-)

Andrew1411На мой взгляд, криво только то, что статический метод можно "дернуть" используя объект. Иногда это затрудняет чтение кода (именно поэтому рекомендуется использовать нормальный вызов через класс)Бесспорно. Лучше бы заткнули эту "фичу".

Andrew1411Фокус, кстати, в кассу. Так как по вашей хотелке вызывался бы метод у неизвестного класса, экземпляр которого в данный момент не существует (null). А так, как и положено, вызывается статический метод указанного в типе переменной класса.Как это "неизвестного" класса ?? Как раз если бы была только одна возможность, о которой вы выше сказали, т.е. вызвать метод класса с непременным указанием названия этого Класса - почему он тогда "неизвестный"-то ?
Andrew1411Изучайте ООП и вам откроются "тайны полиморфизма".Дык штудирую, оттого и вопросы лезут :-)
Andrew1411кто знает - работает, кто не знает - стремится получить сертификатА тот, кто "знает" - он с самого рождения это всё "знает", да ? ;-)
Сертификат для меня не самоцель. Просто книга эта радикально отличается от всех прочих, что довелось осиливать. Капитальная она. Читаю с удовольствием, не спеша, по второму кругу попёр - сразу всего там не осилить.

Petro123не читал ответы? я читаю ответы. Если ясности нет, то вправе спросить еще, КМК. Здесь вроде бы форум... :-)
...
Рейтинг: 0 / 0
10.09.2013, 21:03:52
    #38392874
Andrew1411
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
ozzmosis, сожалею о своих излишне жестких высказываниях.

на самом деле, все просто:

Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта

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

Статические объекты никаким боком не касаются интерфейсов объектов (и, именно поэтому в интерфейсах не возможно написать статический метод. В нарушении этого, правда в джаве существуют финальные статические переменные у интерфейсов, но они выполняю лишь роль "эмуляторов констант")

Проведите черту между ОБЪЕТАМИ и НЕ ОБЪЕКТАМИ. тогда у вас станет все на место.

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

За сим откланиваюсь и покидаю эту тему.
...
Рейтинг: 0 / 0
10.09.2013, 21:06:35
    #38392875
Andrew1411
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
Andrew1411Статические объекты никаким боком ... читать как: Статические члены класса, никаким боком ...
...
Рейтинг: 0 / 0
10.09.2013, 21:25:02
    #38392886
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
Andrew1411,

спасибо за разъяснения, наконец-то понятнее стало.
...
Рейтинг: 0 / 0
11.09.2013, 00:47:09
    #38393012
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике
PS. а всё-таки подозрение, что "можно было по-всякому, но в java сделали вот ТАК, да и всё тут" - было у мну неспроста ...
Ну да ладно.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по вызову статич. метода, объявленного как в классе-предке, так и в его наследнике / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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