Я всегда путаю между static
и final
ключевые слова в Java .
Насколько они разные ?
Давайте сначала посмотрим на статические переменные и статические методы.
Class.variable
Class.methodName()
this
или super
ключевые слова в любом случае.Java также имеет «статические вложенные классы». Статический вложенный класс - это просто класс, который неявно не имеет ссылки на экземпляр внешнего класса.
Статические вложенные классы могут иметь методы экземпляра и статические методы.
В Java нет такого понятия, как статический класс верхнего уровня.
Основной метод заключается в том, что
static
оно должно быть доступно для запуска приложения до того, как произойдет его создание.
final
Ключевое слово используется в нескольких различных контекстах, чтобы определить сущность, которая не может быть изменена позже.final
Класс не может иметь подклассов. Это сделано из соображений безопасности и эффективности. Соответственно, многие из стандартных библиотечных классов Java final
, например, java.lang.System
и java.lang.String
. Все методы в final
классе неявно final
.
final
Метод не может быть переопределен подклассами. Это используется для предотвращения непредвиденного поведения подкласса, изменяющего метод, который может иметь решающее значение для функции или согласованности класса.
final
Переменная может быть инициализирован только один раз, либо с помощью инициализатора или оператора присваивания. Его не нужно инициализировать в точке объявления: это называется blank final
переменной. Пустая конечная переменная экземпляра класса должна быть обязательно назначена в конце каждого конструктора класса, в котором она объявлена; аналогично, пустая конечная статическая переменная должна быть обязательно назначена в статическом инициализаторе класса, в котором она объявлена; в противном случае ошибка времени компиляции возникает в обоих случаях.
Когда в теле метода определен анонимный внутренний класс, все переменные, объявленные final
в области действия этого метода, доступны из внутреннего класса. Как только оно было назначено, значение последней переменной не может измениться.
Class.methodName()
static означает, что он принадлежит классу, а не экземпляру, это означает, что существует только одна копия этой переменной / метода, совместно используемая всеми экземплярами определенного класса .
final совершенно не связан, это способ определения единожды только инициализации. Вы можете инициализировать при определении переменной или внутри конструктора, нигде больше.
note Примечание к заключительным методам и конечным классам. Это способ явно заявить, что метод или класс нельзя переопределить / расширить соответственно.
Дополнительное чтение Итак, что касается статики, мы говорили о других возможностях использования, которые иногда используются в статических блоках. При использовании статических переменных иногда необходимо установить эти переменные перед использованием класса, но, к сожалению, вы не получите конструктор. Это где статическое ключевое слово входит.
Вы не должны путать это с блоками инициализатора экземпляра, которые вызываются перед конструктором для каждого экземпляра.
источник
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
Два действительно не похожи.
static
Поля - это поля, которые не принадлежат какому-либо конкретному экземпляру класса .Здесь
static
полеn
связано не с каким-либо конкретным экземпляром,C
а со всем классом в целом (поэтомуC.n
его можно использовать для доступа к нему). Вы все еще можете использовать экземплярC
для доступаn
? Да, но это не считается особенно хорошей практикой.final
с другой стороны, указывает, что конкретная переменная не может измениться после ее инициализации.Здесь
n
нельзя переназначить, потому что это такfinal
. Еще одно отличие состоит в том, что любая переменная может быть объявленаfinal
, в то время как не каждая переменная может быть объявлена статической.Кроме того, классы могут быть объявлены,
final
что указывает на то, что они не могут быть расширены:Точно так же методы могут быть объявлены как final, чтобы указать, что они не могут быть переопределены расширяющим классом:
источник
public
класс, который определяет файл) илиstatic
внутренние классы могут определятьstatic
переменные. Другие внутренние классы являются экземплярами внешнего класса и не могут иметь статических переменных.финал -
1) Когда мы применяем ключевое слово « final » к переменной , значение этой переменной остается постоянным. (или) Как только мы объявим переменную как final, значение этой переменной не может быть изменено.
2) Это полезно, когда значение переменной не изменяется в течение срока службы программы.
статический -
1) когда мы применяем ключевое слово « static » к переменной , это означает, что оно принадлежит классу.
2) Когда мы применяем ключевое слово « static » к методу , это означает, что метод может быть доступен без создания какого-либо экземпляра класса
источник
static
означает, что в памяти есть только одна копия переменной, используемая всеми экземплярами класса.final
Ключевое слово просто означает , что значение не может быть изменено. Безfinal
, любой объект может изменить значение переменной.источник
Статические и финальные имеют некоторые большие различия:
Статические переменные или классы всегда будут доступны из любого места. Final - это просто ключевое слово, означающее, что переменная не может быть изменена. Так что если бы:
Программа будет работать до тех пор, пока не попытается изменить «первое» целое число, что приведет к ошибке. За пределами этого класса у вас будет доступ к «первой» переменной только в том случае, если вы создали экземпляр этого класса. Это в отличие от «второго», который доступен постоянно.
источник
Думайте об объекте как о спикере Если Speaker - это класс, он будет иметь разные переменные, такие как громкость, высокие частоты, низкие частоты, цвет и т. Д. Вы определяете все эти поля при определении класса Speaker. Например, вы объявили поле цвета со статическим модификатором, это означает, что вы сообщаете компилятору, что существует ровно одна копия этой переменной, независимо от того, сколько раз был создан экземпляр класса.
декларирование
удостоверится, что всякий раз, когда создается экземпляр этого класса, значение цветового поля будет «черным», если оно не изменено.
Примечание. Теперь, когда вы измените цвет динамика как окончательный, этот код не будет выполняться, поскольку ключевое слово final гарантирует, что значение поля никогда не изменится.
Вы можете скопировать / вставить этот код прямо в ваш эмулятор и попробовать.
источник
Легкая разница,
Окончательный : означает, что значение переменной является конечным, и оно никуда не изменится Если вы говорите, что final x = 5, это означает, что x нельзя изменить, его значение является окончательным для всех.
статический: означает, что у него есть только один объект. предположим, у вас есть x = 5, в памяти есть x = 5 и его присутствие внутри класса. если вы создаете объект или экземпляр класса, что означает наличие определенного поля, представляющего этот класс и его переменные и методы. и если вы создаете другой объект или экземпляр этого класса, это означает, что в памяти есть два блока того же класса, которые имеют разные x внутри них. и если вы вызовете оба x в разных позициях и измените их значение, то их значение будет другим. В блоке 1 есть x, у которого есть x = 5, а в блоке 2 есть x = 6. Но если вы сделаете x статическим, это означает, что его нельзя создать снова. Вы можете создать объект класса, но этот объект не будет иметь различного х в них. если x является статическим, то и блок 1, и блок 2 будут иметь одинаковый x, значение которого равно 5. Да, я могу изменить значение статического в любом месте, так как это не является окончательным. поэтому, если я скажу, что у box 1 есть x, и я изменяю его значение на x = 5, и после этого я делаю еще один box, который является box2, и я меняю значение box2 x на x = 6. тогда, поскольку X является статическим, оба поля имеют одинаковый x. и оба блока будут давать значение box как 6, потому что box2 перезаписывает значение от 5 до 6.
И финал, и статика совершенно разные. Финал, который является финалом, не может быть изменен. статический, который останется как единое целое, но может быть изменен.
«Это пример. Помните, что статические переменные всегда вызываются по имени класса. Потому что они являются едиными для всех объектов этого класса. Поэтому класс A имеет x = 5, я могу вызвать и изменить его с помощью Ax = 6; "
источник
Статика - это то, что может вызывать любой объект в классе, который по своей природе принадлежит типу объекта.
Переменная может быть конечной для всего класса, и это просто означает, что она больше не может быть изменена. Он может быть установлен только один раз, и попытка установить его снова приведет к ошибке. Это полезно по ряду причин, возможно, вы хотите объявить константу, которую нельзя изменить.
Пример кода:
Википедия содержит полный список ключевых слов Java .
источник
Я не буду пытаться дать полный ответ здесь. Я рекомендую сосредоточиться на понимании того, что делает каждый из них, и тогда должно быть ясно, что их эффекты совершенно разные и почему иногда они используются вместе.
static
предназначен для членов класса (атрибутов и методов), и его следует понимать в отличие от экземпляров (не статических) членов. Я бы рекомендовал прочитать «Понимание экземпляров и членов класса» в Учебниках по Java. Я также могу быть использован вstatic
блоках, но я бы не стал беспокоиться об этом для начала.final
имеет различные значения в зависимости от того, применяется ли он к переменным, методам, классам или некоторым другим случаям. Здесь мне больше нравятся объяснения из Википедии .источник
Значения статических переменных могут быть изменены, хотя одна копия переменной проходит через приложение, тогда как значения Final Variable могут быть инициализированы один раз и не могут быть изменены во всем приложении.
источник