515

Волна взаимопомощи (java)1

Долго читаю, но на волне взаимопомощи решил зарегистрироваться. Работаю java разработчиком, могу помочь разъяснить какую-нибудь тему или помочь понять куда двигаться по обучению, поревьюить код или просто как-то пообщаться вживую если потребуется

Помощники

236 постов785 подписчиков

Правила сообщества

Нельзя обсуждать Политику.
Ругаться и оскорблять.

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий

Ребят помогите понять static)) я знаю тупой вопрос) но сколько видел ответов все никак понять не могу) особенно когда на собеседовании спрашивают.

раскрыть ветку (3)
2
Автор поста оценил этот комментарий

Смотрите. Java запускается тоже на java. Давайте представим что вы написали класс Person у которого есть поле name.

Программа выглядит как-то так(псевдокод):


class Person {

    public String name;

    Person(String name){this.name = name}

}


class MainClass {

    psvm(String[] args) {

    Person pikabuUser = new Person("Solliter");

    System.out.println(pikabuUser.name);

    }

}


Наша программа по сути выводит имя пользователя. Когда джава запускается она должна понять как ей создать pikabuUser, т.е. она должна отсканировать класс Person и записать о нем общие данные (Как называется, какие есть поля, методы, конструкторы). В итоге эта метаинформация записывается в класс Class<Person> и информация о всех классах записывается куда-то общее пространство (чтобы не сканировать информацию каждый раз).


В итоге во время System.out.println() есть как минимум 2 объекта. Один из них это Person pikabuUser, у которого есть поле name, другой это Class<Person> у которого есть массив "поляКласса" в котором лежит одно поле, в котором записано что поле называется name, что оно типа String и что оно public. Надо понимать что объект класса Class<Person> вообще ничего не знает о созданных по его подобию экзаплярах.


В итоге есть 2 раздельные сущности - одна описывает конкретный объект другая описывает то как создаются эти объекты и из чего она состоит.


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

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Кажется я наконец понял) большое спасибо))

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Отлично! Теперь можно обсудить какие последствия это несет:


Представим что объект это самолет, а класс - это чертеж самолета :)


Если вы пишете static - это значит что вы обращаетесь к чертежу. Чертеж вообще ничего не знает про то какие самолеты были сделаны по его подобию.


Но допустим вы сделали поле int count и вызвали в конструкторе

class Plane {

   int count;

   public Plane(){

       count++;

   }

}


Поле count будет инициализироваться на каждом отдельно взятом самолете и всегда будет = 1 по умолчанию (инициализировалось как 0, а затем произошел инкремент. По сути это физический счетчик на самолете который никому не нужен.


Теперь вы добавили поле static к переменной count. Теперь на самолете больше нет никакого счетчика, но теперь на чертеже есть пометка "count" и когда будет создаваться каждый новый самолет - пометочка на чертеже будет всегда увеличиваться на один при каждом создании нового самолета (уберите от экрана зануд с многопоточкой). Каждый самолет знает как и где лежит чертеж, но самому чертежу пофиг на самолеты.


Нахрена делать переменные статическими? Чаще всего чтобы объявить константы. Например будем считать что разделителем строк в нашей системе будет являться символ \n, и будем использовать эту константу везде и, в итоге, при необходимости заменить ее на \n\t мы сможем сделать это только в одном месте.


Но возникает вопрос - что будет если мы поставим static над методом?


Это будет значить что этот метод будет выполняться у чертежа, а не у самого самолета. В итоге вы не сможете ни достучаться до полей (т.к. самолета-то нет) ни до методов (у кого вызывать метод, если самолета нет?).


В итоге получается что из объекта статику вызвать можно, а наоборот нет, т.к. статика ничего не знает о конкретном объекте.


Нахрена делать методы статическими? Не всегда хочется создавать класс.


Допустим вы пишете приложение для аудита и вам нужен метод который из строчки "Перевод 4000 руб" вычленит 4000 и переведет их в int формат.


Этот метод будет использоваться много где (и для смсок, и для имейл нотификаций и для того что ввел пользователь в формочке). В итоге вы делаете какой-нибудь класс PaymentAmountUtils (ужасное название, предлагайте в вариантах свое) - но вам не интересно его создавать каждый раз.


В итоге благодаря статике вы можете агрегировать определенную логику, не зависящую от состояния объекта в определенном месте и вместо


int money = new PaymentAmountUtils().parseAmount(invoice);

писать сразу

int money = PaymentAmountUtils.parseAmount(invoice);


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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества