Если переменная объявлена как public static varName;
, то я могу получить к ней доступ откуда угодно ClassName.varName
. Мне также известно, что статические члены совместно используются всеми экземплярами класса и не перераспределяются в каждом экземпляре.
Объявление переменной private static varName;
отличается от объявления переменной private varName;
?
В обоих случаях к нему нельзя получить доступ ClassName.varName
или как ClassInstance.varName
от любого другого класса.
Объявляет ли переменная как статическую другие специальные свойства?
Ответы:
Конечно, к нему можно получить доступ как
ClassName.var_name
, но только из класса, в котором он определен, - потому что он определен какprivate
.public static
илиprivate static
переменные часто используются для констант. Например, многие люди не любят «жестко кодировать» константы в своем коде; им нравится создавать переменнуюpublic static
илиprivate static
со значимым именем и использовать это в своем коде, что должно сделать код более читабельным. (Вы также должны сделать такие константыfinal
).Например:
Делаете ли вы это
public
илиprivate
зависит от того, хотите ли вы, чтобы переменные были видны вне класса или нет.источник
ClassName.var_nam
? Где я могу получить к нему доступ напрямую:var_nam
в классеСтатические переменные имеют одно значение для всех экземпляров класса.
Если бы вы должны были сделать что-то вроде:
а потом вы хотели изменить свое имя, это нормально, мое имя остается прежним. Однако, если вы захотите изменить это так, чтобы у вас было 17 глаз, то у всех в мире также было бы 17 глаз.
источник
Закрытые статические переменные полезны так же, как и закрытые переменные экземпляра: они хранят состояние, к которому обращается только код в том же классе. Доступность (private / public / etc) и экземпляр / статический характер переменной являются полностью ортогональными понятиями.
Я бы не думал, что статические переменные являются общими для всех экземпляров класса, что предполагает наличие хотя бы одного экземпляра для состояния. Нет - статическая переменная связана с самим типом , а не каких - либо экземпляров типа.
Поэтому в любое время, когда вам нужно какое-то состояние, которое связано с типом, а не с каким-либо конкретным экземпляром, и вы хотите сохранить это состояние закрытым (например, разрешить контролируемый доступ через свойства), имеет смысл иметь закрытую статическую переменную.
Кроме того, я настоятельно рекомендую, чтобы единственным типом переменных, которые вы делаете общедоступными (или даже не частными), были константы - статические конечные переменные неизменяемых типов. Все остальное должно быть приватным, чтобы разделить API и реализацию (среди прочего).
источник
Ну, вы правы, публичные статические переменные используются без создания экземпляра класса, а закрытые статические переменные - нет. Основное различие между ними и тем, где я использую частные статические переменные, заключается в том, когда вам нужно использовать переменную в статической функции. Для статических функций вы можете использовать только статические переменные, поэтому вы делаете их закрытыми, чтобы не получать к ним доступ из других классов. Это единственный случай, когда я использую приватную статику.
Вот пример:
источник
Person
, то это, вероятно, было бы ошибкой, потому что у вас не могло быть нескольких людей разного возраста (если это был предполагаемый вариант использования).Ну,
private static
переменные могут быть использованы для обмена данными между экземплярами этого класса. Хотя вы правы, мы не можем получить доступ кprivate static
переменным, используя конструкции типаClassName.member
или,ClassInstance.member
но член всегда будет виден из методов этого класса или экземпляров этого класса. Таким образом, экземпляры этого класса всегда могут ссылаться на член.источник
Какая польза от закрытой статической переменной класса?
Допустим, у вас есть книга из библиотеки Class. Каждый раз, когда вы создаете новую книгу, вы хотите присвоить ей уникальный идентификатор. Один из способов - просто начать с 0 и увеличить номер идентификатора. Но как все другие книги узнают последний созданный номер? Просто сохраните его как статическую переменную. Должны ли посетители знать, что действительный внутренний идентификационный номер предназначен для каждой книги? Нет. Эта информация является частной.
Это надуманный пример, но я уверен, что вы легко можете вспомнить случаи, когда вы хотите, чтобы все экземпляры классов имели доступ к общей информации, которая должна быть конфиденциальной для всех остальных. Или даже если вы не можете, это хорошая практика программирования, чтобы сделать вещи как можно более частными. Что если вы случайно обнародовали это поле numBooks, хотя пользователи Book не должны были ничего с этим делать. Тогда кто-то может изменить количество Книг, не создавая новую Книгу.
Очень подлый!
источник
Да, оба разные. И первый вызывается,
class variable
потому что он содержит одно значение для этого,class
тогда как другой вызывается,instance variable
потому что он может содержать разные значения для разныхinstances(Objects)
. Первый создается только один раз в jvm, а другой создается один раз для каждого экземпляра, т. Е. Если у вас есть 10 экземпляров, то у вас будет 10 разныхprivate varName;
в jvm.Да, статические переменные получают некоторые свойства, отличные от обычных переменных экземпляра. Я уже упомянул немного, и давайте посмотрим некоторые здесь:
class variables
(переменные экземпляра, которые объявлены как статические) могут быть доступны напрямую с помощью имени класса, какClassName.varName
. И любой объект этого класса может получить доступ и изменить его значение в отличие от переменных экземпляра, доступных только его соответствующим объектам. Переменные класса могут использоваться в статических методах.Логически,
private static variable
ничем не отличается отpublic static variable
первого, который дает вам больше контроля. ИМО, вы можете буквально заменитьpublic static variable
наprivate static variable
с помощьюpublic static
методов получения и установки.Одной из широко используемых областей
private static variable
является реализация простогоSingleton
шаблона, в котором у вас будет только один экземпляр этого класса во всем мире. Здесьstatic
идентификатор играет решающую роль, чтобы сделать этот единственный экземпляр доступным для внешнего мира (конечно, публичный статический метод получения также играет основную роль).источник
Ключевое слово Private будет использоваться для доступа к переменной внутри класса и сохранения статичности в том смысле, что мы можем обращаться к переменной также в статическом методе, но ссылочная переменная не может получить доступ в статическом методе.
источник
Другая перспектива:
источник
Когда в статическом методе вы используете переменную, переменная также должна быть статической в качестве примера:
источник
Статические переменные - это те переменные, которые являются общими для всех экземпляров класса. Если один экземпляр изменяет это., Тогда значение статической переменной будет обновлено для всех остальных экземпляров.
источник
Для некоторых людей это имеет больше смысла, если они видят это на нескольких разных языках, поэтому я написал пример на Java и PHP на своей странице, где я объясняю некоторые из этих модификаторов. Возможно, вы думаете об этом неправильно.
Вы должны посмотреть на мои примеры, если это не имеет смысла ниже. Зайдите сюда http://www.siteconsortium.com/h/D0000D.php
Суть в том, что это в значительной степени именно то, что говорится. Это статическая переменная-член, которая является приватной. Например, если вы хотите создать объект Singleton, почему вы хотите сделать переменную SingletonExample.instance общедоступной. Если вы сделали это, человек, который использовал класс, мог бы легко перезаписать значение.
Вот и все.
источник
Если вы используете частные статические переменные в вашем классе, статические внутренние классы в вашем классе могут достигать ваших переменных. Это очень хорошо для безопасности контекста.
источник
Если переменная определена как общедоступная статическая, к ней можно получить доступ через имя ее класса из любого класса.
Обычно функции определяются как открытая статическая, доступ к которой можно получить, просто вызвав имя реализующего класса.
Очень хорошим примером этого является
sleep()
метод в классе ThreadЕсли переменная определена как частная статическая, к ней можно получить доступ только внутри этого класса, поэтому имя класса не требуется, или вы все равно можете использовать имя класса (до вас). Разница между приватным var_name и приватным статическим var_name заключается в том, что приватные статические переменные могут быть доступны только статическими методами класса, тогда как приватные переменные могут быть доступны любым методом этого класса (кроме статических методов).
Очень хороший пример этого - при определении соединений с базой данных или констант, которые требуют объявления переменной как частной статической.
Другой распространенный пример
источник
Я новичок в Java, но один из способов использования статических переменных, как полагают многие, - это подсчет числа экземпляров класса. например:
Тогда вы можете sysout:
Вы также можете получить доступ к numCompanies из каждого экземпляра класса (что я не совсем понимаю), но это не будет «статическим способом». Я понятия не имею, если это лучшая практика или нет, но это имеет смысл для меня.
источник
*) Если переменная объявлена как приватная, то она не видна за пределами класса. Это называется скрытием данных.
*) Если переменная объявлена как статическая, то значение переменной одинаково для всех экземпляров, и нам не нужно создавать объект для вызова этой переменной. Мы можем вызвать эту переменную просто
classname.variablename;
источник
Закрытая статическая переменная также будет доступна в подклассе. Если вы изменили в одном подклассе, а другой подкласс получит измененное значение, в этом случае оно может не соответствовать ожидаемому.
источник
ThreadLocal
переменные обычно реализуются какprivate static
. Таким образом, они не привязаны к классу, и каждый поток имеет свою собственную ссылку на свой собственный объект ThreadLocal.источник
В следующем примере
eye
изменяется PersonB, ноleg
остается неизменным. Это связано с тем, что закрытая переменная делает копию себя для метода, поэтому ее первоначальное значение остается прежним; в то время как приватное статическое значение имеет только одну копию для всех методов, которыми нужно делиться, поэтому редактирование его значения изменит его первоначальное значение.}
источник