|
|
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Создаем класс Base, c полями и методами. Затем создаем экземпляры этого класса. Каждый экземпляр - объект в памяти со своей копией полей. Копий методов не создается же, они всегда в одном экземпляре, как и static поля. В чем тогда смысл static методов? Только в том, что их можно вызывать не создавая экземпляр класса, в котором они определены? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 09:13 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
летатель космоса, Методы объекта оперируют состоянием объекта. Статические методы состоянием объекта не оперируют. В большинстве случаев статические методы не нужны. В Java они часто используются там где класс уже нельзя расширить, а хочется. Например StringUtils, DBUtils, IOUtils. В прикладном программировании нужно сильно подумать прежде чем создать статические метод. Статический методы не обладают полиморфизмом в рантайме. Поэтому если ими злоупотреблять то всё ООП пойдет лесом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 09:41 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
летатель космоса, 1) Собрать несколько процедур типа Умножить_на_число_ПИ вместе. Тогда они будут вызываться с префиксом Класс_математики.УмножитьНаПИ() 2) То же самое необходимо попросить у объекта. Например перевести курс валюты. Состояние не требуется. Вводят статический метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 10:04 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczлетатель космоса, Методы объекта оперируют состоянием объекта. Статические методы состоянием объекта не оперируют. В с++ в каждый метод объекта неявно первым параметром передается ссылка на объект своего типа - у python, если я правильно понял, этот параметр self, который нужно передавать явно. В java это как раз "методы объекта оперируют состоянием объекта - статические методы состоянием объекта не оперируют"? Т.е. если метод static, то у него нет неявного параметра, а если не-static, то есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 10:13 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
летатель космосаВ с++ в каждый метод объекта неявно первым параметром передается ссылка на объект своего типа - у python, если я правильно понял, этот параметр self, который нужно передавать явно. Историческая справка? летатель космосаВ java это как раз "методы объекта оперируют состоянием объекта - статические методы состоянием объекта не оперируют"? Т.е. если метод static, то у него нет неявного параметра, а если не-static, то есть? Нет никаких не явных параметров в Java. Есть ссылка this на экземпляр. Она параметром не является. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 10:29 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
летатель космосаВ java это как раз "методы объекта оперируют состоянием объекта - статические методы состоянием объекта не оперируют"? Т.е. если метод static, то у него нет неявного параметра, а если не-static, то есть? Нет никаких не явных параметров в Java. Есть ссылка this на экземпляр. Она параметром не является.[/quot] Является. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 10:51 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
непонятно почему ТС вообще слез со своего вопроса в неявные параметры. За жизнь поговорить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 10:52 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
no56892Является. С гуя ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 10:55 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz... Нет никаких не явных параметров в Java. Есть ссылка this на экземпляр. Она параметром не является. ээммм.... как это - параметром не является? а чем является aload_0 ? http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 10:56 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, несмотря на то, что в сигнатуре метода этого нет (неважно, что это за ОО язык, java, c++, c#, Delphi наконец), на уровне исполняемого кода указатель на объект помещается компилятором в стек при вызове и извлекается из стека в начале метода. Это и называют неявным параметром. В языках, где доступны указатели, можно получить доступ и к этому параметру. То есть, фактически работаем с self, this, etc... как с параметром, но в сигнатуре не объявляем. Впрочем, не нравится название - не буду настаивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 10:58 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczno56892Является. С гуя ли? авторThe Java Virtual Machine uses local variables to pass parameters on method invocation. On class method invocation, any parameters are passed in consecutive local variables starting from local variable 0. On instance method invocation, local variable 0 is always used to pass a reference to the object on which the instance method is being invoked (this in the Java programming language). Any parameters are subsequently passed in consecutive local variables starting from local variable 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 11:01 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Статические методы в яве нужны для того, чтобы создать первый объект при старте программы. Все остальное уже просто дополнительные плюшки статических методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 11:05 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
летатель космосаСоздаем класс Base, c полями и методами. Затем создаем экземпляры этого класса. Каждый экземпляр - объект в памяти со своей копией полей. Копий методов не создается же, они всегда в одном экземпляре, как и static поля. В чем тогда смысл static методов? Только в том, что их можно вызывать не создавая экземпляр класса, в котором они определены? В до-ООП-шную эпоху кодеры писали код без объектов. Вызывая процедуры и функции в контексте. Например Код: pascal 1. где контекст мог определять некое глобальное состояние приложения или просто некое состояние вычислений. Косвенно, такой способ и сейчас используется ассемблером для иммитации ООП и JVM примерно работает так-же. Во времена развития Java 1.1-1.4 вызвать функцию синуса можно было только указав имя объекта Math: Код: java 1. У математиков подобная форма юзкейса вызывает приступы смеха. Представьте себе как будет выглядеть формула где очень много таких обращений. Здесь удобство было принесено в жертву ООП идеалам. Чуть позже был добавлен статический импорт. Код: java 1. Однако JVM все равно ссылается на полное название статик-функции как java.lang.Math.sin. Впрочем нас это не волнует. Бинарный код обещает быть производительным. А длинное имя остается способом решения конфликта имен. По поводу смыслов. Я думаю смысл static методов понятен. Это функции без состояний. Кстати некоторые IDE детектируют класс утилит (Utils) и предлагают вам добавить приватный конструктор Код: java 1. 2. 3. Это явный запрет на инстанциирование утилит. Если вы уже кодили мультипоточные приложения то попадали на "гонки" и "голодания" ресурсов. Это когда есть некая горячая точка в коде которая является разделяемым объектом и она постоянно всем нужна. И избавление от гонок - это задача для более высокого уровня seniority. Просто надо больше всего знать по Java и программно-аппаратной архитетуре. Здесь многие йуные кодеры пассуют и ищут способов писать надежно и безопасно. Один из самых простых и надежных вариантов избавления от голодания - это внедрять как можно больше чистых функций (pure functions) которые с гарантией можно реализовать как static-методы. При этом еще желательно проанализировать их тело чтоб внутри не было зависимостей от других разделяемых статических переменных. Есть еще альтернативные варианты где все таки можно создавать экземпляр утилит и использовать их с ThreadLocal переменной но он более сложен и требует больше манипуляций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 11:05 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
no56892, Ладно. Убедили. Тяжелое наследие C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 11:08 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
mayton... В до-ООП-шную эпоху кодеры писали код без объектов. Вызывая процедуры и функции в контексте. ... Ну, тут надо разбираться - что такое "ООП-шная" эпоха. Алан Кэй (Alan Curtis Kay - изобретатель ООП, получивший за это премию Тьюринга в 2003 году) - вообще считает, что сия "эпоха" не состоялась, время потраченное на нее - целиком потеряно зря и программирование придется переоткрывать/пересоздавать/перевнедрять заново. То, что он считает правильным ооп-программированием достаточно близко к тому, что сейчас называют микросервисами. Но начинается ооп-програмирование, по Кэю, не раньше того момента, как в системе появляется позднее связывание. Погугли. Это и познавательное и занимательное как чтение, так и зрелище - видео с ним есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 12:15 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Спасибо. Есть разные взгляды на ООП. И скажем те технологии которые использует java - это злостный хак ООП. Например рефлексией и установкой атрибута можно открыть private поля. Инструментированием можно переопределить поведение методов. И это не пререгрузка виртуального мать его метода. Это именнно хак. И поэтому когда говорят о Java-OOP - надо говорить именно о реализации ООП в Java. А общую философию можно кинуть в мусорное ведро. Она не состоялась. Туда же лесом идет Бьярне со своими шаблонами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 12:25 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
О нет, #trueoop срач дошел и до сюда ... (( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 12:29 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
mayton, Бъярне не трожь. Шаблоны ему от Степанова, вместе с переносом generic-кода STL в наследство от ADA достались. Они, правда, неплохо ладят меж собой, оба считая, что достаточно удачно скрестили философию математики с программированием в этом месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 12:37 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 12:55 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
boobyШаблоны ему от Степанова, вместе с переносом generic-кода STL в наследство от ADA достались. Ого... вот это поток сознания... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 15:55 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
mayton... Ого... вот это поток сознания... этот краковяк так танцуется: 1) фак от Страуструпа http://www.stroustrup.com/bs_faq.html#generic 2) объяснение слов https://en.wikipedia.org/wiki/Generic_programming из которого следует вынести, что Александр на пару с Массером - изобретатели самого термина "обобщенное программирование". 3) интервью с Александром, http://www.stlport.org/resources/StepanovUSA.html из которого можно почерпнуть информацию, что книжка "The Ada Generic Library: Linear List Processing Packages", by David R. Musser and Alexander A. вышла в 1989 году. т.е. первоначально Александр этой темой занимался в Ада, а потом перетек в C++, как в "лучший из языков", вместе с темой и Массером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 17:23 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
mayton... Ого... вот это поток сознания... эх, ... вообще, конечно, досадно бывает... В Англии ружья кирпичем не чистят. В америках всякая книжка про алгоритмы с упоминания Анатолия Алексеевича Карацубы начинается. тамошний студент не может не знать - кто это такой. А у нас, не всякий, даже твердо уверенный в том, что он - программист, догадывается о том - кто это, и зачем его надо помнить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 17:45 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
летатель космосаСоздаем класс Base, c полями и методами. Затем создаем экземпляры этого класса. Каждый экземпляр - объект в памяти со своей копией полей. Копий методов не создается же, они всегда в одном экземпляре, как и static поля. В чем тогда смысл static методов? Только в том, что их можно вызывать не создавая экземпляр класса, в котором они определены? Да, только в этом, и этого уже достаточно. Надо также напомнить, что существуют более другие языки программирования, менее упоротые в объектно-ориентированном плане, так там вообще есть "свободные функции" -- функции, не принадлежащие никакому классу. Статические методы Java -- как раз аналог таких функций, поэтому их существование очень важно, иначе Java была бы ООП упоротой более чем абсолютно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2016, 18:43 |
|
||
|
Какой смысл делать методы static?
|
|||
|---|---|---|---|
|
#18+
Статический метод это скорее исключение. У нас в программе все может меняться, а стат метод не переопределить. Зато к нему доступ фактически глобальный (плюс это или минус решать вам) Зато мы не создавая экземпляр класса можем юзать методы данного класса (хороший пример класс math и его ф-ии). Практическое применение? Ну вот от фонаря - подсчет количества созданных экземпляров класса. Создаем стат переменную count и стат ф-ю которая его инкрементирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2016, 07:58 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39284474&tid=2123851]: |
0ms |
get settings: |
12ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
88ms |
get tp. blocked users: |
1ms |
| others: | 260ms |
| total: | 475ms |

| 0 / 0 |
