Я всегда смущен между static
и final
ключевыми словами в java.
Как они отличаются?
Я всегда смущен между 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
не может быть переопределен подклассами. Это используется для предотвращения неожиданного поведения из подкласса, изменяющего метод, который может иметь решающее значение для функции или согласованности класса.
Переменная A final
может быть инициализирована только один раз, либо через инициализатор, либо оператор присваивания. Его не нужно инициализировать в точке объявления: это называется переменной blank final
. Чистая конечная переменная экземпляра класса должна быть обязательно назначена в конце каждого конструктора класса, в котором она объявлена; аналогично, пустая конечная статическая переменная должна быть определенно назначена в статическом инициализаторе класса, в котором она объявлена; в противном случае в обоих случаях возникает ошибка времени компиляции.
Когда анонимный внутренний класс определяется внутри тела метода, все переменные, объявленные final
в объеме этого метода, доступны из внутреннего класса. После того, как он был назначен, значение конечной переменной не может измениться.
static означает, что он принадлежит классу, а не экземпляру, это означает, что существует только одна копия этой переменной/метода, разделяемая между всеми экземплярами определенного класса.
public class MyClass {
public static int myVariable = 0;
}
//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
MyClass.myVariable = 5; //This change is reflected in both instances
final полностью не связан, это способ определения однократной инициализации. Вы можете инициализировать при определении переменной или внутри конструктора, нигде больше.
note Заметка о конечных методах и конечных классах, это способ явно заявить, что метод или класс нельзя переопределить/расширить соответственно.
Дополнительное чтение Итак, на тему статичности мы говорили о других возможностях, которые могут иметь, иногда они используются в статических блоках. При использовании статических переменных иногда необходимо установить эти переменные перед использованием класса, но, к сожалению, вы не получите конструктор. Это ключевое слово static.
public class MyClass {
public static List<String> cars = new ArrayList<String>();
static {
cars.add("Ferrari");
cars.add("Scoda");
}
}
public class TestClass {
public static void main(String args[]) {
System.out.println(MyClass.cars.get(0)); //This will print Ferrari
}
}
Вы не должны путать это с блоками инициализатора экземпляра, которые вызываются перед конструктором на один экземпляр.
Оба действительно не похожи. static
поля - это поля, которые не относятся к какому-либо конкретному экземпляру класса.
class C {
public static int n = 42;
}
Здесь поле static
n
не связано с каким-либо конкретным экземпляром C
, а со всем классом вообще (поэтому C.n
можно использовать для доступа к нему). Вы можете использовать экземпляр C
для доступа к n
? Да, но это не считается особенно хорошей практикой.
final
, с другой стороны, указывает, что конкретная переменная не может измениться после ее инициализации.
class C {
public final int n = 42;
}
Здесь n
нельзя переназначить, так как это final
. Еще одно отличие состоит в том, что любая переменная может быть объявлена final
, хотя не каждая переменная может быть объявлена статической.
Кроме того, классы могут быть объявлены final
, что указывает на то, что они не могут быть расширены:
final class C {}
class B extends C {} // error!
Аналогично, методы могут быть объявлены окончательными, чтобы указать, что они не могут быть переопределены расширяющимся классом:
class C {
public final void foo() {}
}
class B extends C {
public void foo() {} // error!
}
final -
1) Когда мы применяем ключевое слово final к переменной , значение этой переменной остается постоянным. (или) Как только мы объявим переменную как final. Значение этой переменной не может быть изменено.
2) Это полезно, когда значение variable не изменяется в течение срока службы программы
static -
1), когда мы применяем ключевое слово static к переменной , это означает, что оно принадлежит классу.
2) Когда мы применяем ключевое слово статическое к методу, это означает, что к методу можно получить доступ без создания какого-либо экземпляра класса p >
static
означает, что в памяти есть только одна копия переменной, используемая всеми экземплярами класса.
final
ключевое слово просто означает, что значение не может быть изменено. Без final
любой объект может изменить значение переменной.
Статические и конечные имеют некоторые большие отличия:
Статические переменные или классы всегда будут доступны (в значительной степени) в любом месте. Финал - это просто ключевое слово, которое означает, что переменная не может быть изменена. Так что если бы:
public class Test{
public final int first = 10;
public static int second = 20;
public Test(){
second = second + 1
first = first + 1;
}
}
Программа будет работать до тех пор, пока не попытается изменить "первое" целое число, что приведет к ошибке. Вне этого класса у вас будет доступ к "первой" переменной, если вы создали экземпляр класса. Это контрастирует с "вторым", которое доступно все время.
Подумайте об объекте, таком как спикер. Если динамик - это класс, он будет иметь разные переменные, такие как громкость, высокие частоты, бас, цвет и т.д. Вы определяете все эти поля при определении класса Speaker. Например, вы объявили поле цвета со статическим модификатором, это означает, что вы сообщаете компилятору, что существует только одна копия этой переменной, независимо от того, сколько раз экземпляр класса был создан.
Объявление
static final String color = "Black";
будет гарантировать, что всякий раз, когда этот класс создается, значение поля цвета будет "черным", если оно не будет изменено.
public class Speaker {
static String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //will provide output as "Black"
Speaker.color = "white";
System.out.println(Speaker.color); //will provide output as "White"
}}
Примечание. Теперь, когда вы измените цвет динамика как окончательный, этот код не будет выполнен, потому что ключевое слово final гарантирует, что значение поля никогда не изменится.
public class Speaker {
static final String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //should provide output as "Black"
Speaker.color = "white"; //Error because the value of color is fixed.
System.out.println(Speaker.color); //Code won't execute.
}}
Вы можете скопировать/вставить этот код непосредственно в свой эмулятор и попробовать.
Статика - это то, что может вызывать любой объект в классе, который по своей природе принадлежит типу объекта.
Переменная может быть конечной для всего класса, и это просто означает, что она больше не может быть изменена. Он может быть установлен только один раз, и попытка установить его снова приведет к возникновению ошибки. Это полезно по ряду причин, возможно, вы хотите объявить константу, которую нельзя изменить.
Пример кода:
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
Википедия содержит полный список ключевых слов Java.
Я не буду пытаться дать полный ответ здесь. Моя рекомендация состояла бы в том, чтобы сосредоточиться на понимании того, что делает каждый из них, и тогда должно быть ясно, что их эффекты совершенно разные и почему иногда они используются вместе.
static
предназначен для членов класса (атрибуты и методы), и его нужно понимать в отличие от членов (нестатических). Я бы рекомендовал прочитать "Понимание экземпляра и членов класса" в Учебниках по Java. Я также могу использовать в блоках static
, но я бы не стал беспокоиться об этом для начала.
final
имеет разные значения, если оно применяется к переменным, методам, классам или некоторым другим случаям. Здесь я лучше объяснения Википедии.
Легкая разница,
Окончательный: означает, что значение переменной является конечным, и оно нигде не изменится. Если вы говорите, что final x = 5, это означает, что x нельзя изменить, его значение является окончательным для всех.
Статический: означает, что у него есть только один объект. Предположим, у вас есть х = 5, в памяти есть х = 5 и его присутствие внутри класса. если вы создаете объект или экземпляр класса, что означает наличие определенного поля, представляющего этот класс и его переменные и методы. и если вы создаете другой объект или экземпляр этого класса, это означает, что в памяти есть два блока того же класса, которые имеют разные x внутри них. и если вы вызовете оба x в разных позициях и измените их значение, то их значение будет другим. в блоке 1 есть x с x = 5, а в блоке 2 - x = 6. Но если вы сделаете x статическим, это означает, что он не может быть создан снова. Вы можете создать объект класса, но этот объект не будет иметь различного х в них. если x является статическим, то и блок 1, и блок 2 будут иметь одинаковый x, значение которого равно 5. Да, я могу изменить значение static в любом месте, поскольку оно не является окончательным. поэтому, если я скажу, что в блоке 1 есть x, и я изменяю его значение на x = 5, а после этого я делаю еще один блок, представляющий собой box2, и я изменяю значение box2 x на x = 6. тогда, поскольку X является статическим, оба поля имеют одинаковый x. и в обоих полях значение box будет равно 6, потому что box2 перезаписывает значение от 5 до 6.
И финал, и статика совершенно разные. Финал, который является финалом, не может быть изменен. статический, который останется как единое целое, но может быть изменен.
"Это пример. Помните, что статические переменные всегда вызываются по имени класса. Потому что они являются едиными для всех объектов этого класса. Поэтому класс A имеет x = 5, я могу вызвать и изменить его с помощью Ax = 6; "
Значения статических переменных могут быть изменены, хотя одна копия переменной проходит через приложение, тогда как значения Final Variable могут быть инициализированы один раз и не могут быть изменены во всем приложении.