Мене завжди плутають між собою staticі finalключовими словами в Java .
Чим вони відрізняються?
Мене завжди плутають між собою staticі finalключовими словами в Java .
Чим вони відрізняються?
Відповіді:
Давайте спочатку розглянемо статичні змінні та статичні методи.
Class.variableClass.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()
статичний означає, що він належить до класу, а не до екземпляра, це означає, що існує лише одна копія цієї змінної / методу, що ділиться між усіма примірниками певного Класу .
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
остаточний не пов'язаний між собою, це спосіб визначення лише одноразової ініціалізації. Ви можете або ініціалізувати, визначаючи змінну або всередині конструктора, ніде більше.
Примітка Примітка про підсумкові методи та підсумкові класи, це спосіб явно заявити, що метод чи клас не можна замінити / розширити відповідно.
Додаткове читання Отже, що стосується статики, ми говорили про інші види її використання, які іноді використовуються в статичних блоках. Під час використання статичних змінних іноді необхідно встановити ці змінні перед використанням класу, але, на жаль, ви не отримаєте конструктор. Тут надходить статичне ключове слово.
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
}
}
Ви не повинні плутати це з блоками ініціалізаторів екземплярів, які викликаються перед конструктором за екземпляром.
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поля - це поля, які не належать до жодного конкретного примірника класу .
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!
}
publicклас, який визначає файл) або staticвнутрішні класи можуть визначати staticзмінні. Інші внутрішні класи є екземплярами зовнішнього класу і не можуть мати статичні змінні.
заключний -
1) Коли ми застосуємо " остаточне " ключове слово до змінної , значення цієї змінної залишається постійним. (або) Щойно ми оголосимо змінну як остаточну. Значення цієї змінної неможливо змінити.
2) Це корисно, коли значення змінної не змінюється протягом життя програми
статичний -
1) коли ми застосовуємо " статичне " ключове слово до змінної , це означає, що воно належить до класу.
2) Коли ми застосовуємо « статичний » ключове слово в метод , це означає , що метод може бути отриманий без створення будь - яких екземпляра класу
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 - клас, він буде мати різні змінні, такі як гучність, високі, баси, колір тощо. Ви визначаєте всі ці поля, визначаючи клас 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"
}}
Примітка. Тепер, коли ви зміните колір динаміка як остаточний, цей код не буде виконуватися, оскільки кінцеве ключове слово гарантує, що значення поля ніколи не змінюється.
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.
}}
Ви можете скопіювати / вставити цей код безпосередньо в емулятор і спробувати.
Легка різниця,
Остаточний : означає, що значення змінної є Остаточним і воно ніде не зміниться. Якщо ви говорите, що final x = 5, це означає, що x не може бути змінено, його значення є остаточним для всіх.
Статичний: означає, що він має лише один об’єкт. припустимо, у вас x = 5, в пам'яті є x = 5 і його присутність у класі. якщо ви створюєте об'єкт або екземпляр класу, це означає, що існує специфічне поле, яке представляє цей клас та його змінні та методи. і якщо ви створюєте інший об'єкт або екземпляр цього класу, це означає, що у пам'яті є два поля того ж класу, які мають різні х усередині них. і якщо ви викликаєте обидва х у різних положеннях і змінюєте їх значення, то їх значення буде різним. поле 1 має х, у якого х = 5, а в полі 2 - х = 6. але якщо ви зробите х статичним, це означає, що його не можна створити заново. ви можете створити об’єкт класу, але цей об’єкт не матиме різних x у них. якщо x є статичним, то і поле 1, і поле 2 будуть мати однаковий x, який має значення 5. Так, я можу змінити значення статичного будь-якого, де його не остаточне. тож, якщо я скажу, що у полі 1 є х, і я змінюю його значення на x = 5, а після цього я роблю інше поле, яке є box2, і я змінюю значення box2 x на x = 6. то як X є статичним, обидва поля мають однаковий x. і обидва поля дадуть значення поля як 6, тому що box2 перезаписує значення від 5 до 6.
І кінцевий, і статичний абсолютно різні. Фінал, який є остаточним, неможливо змінити. статичний, який залишиться як один, але може бути змінений.
"Це приклад. Пам'ятайте, що статична змінна завжди викликається назвою їх класу. Тому що вони є лише однією для всіх об'єктів цього класу. Тому клас A має х = 5, я можу викликати та змінити його на Ax = 6; "
Статичне - це те, що може викликати будь-який об’єкт у класі, що по суті належить до типу об’єкта.
Змінна може бути остаточною для всього класу, і це просто означає, що її більше не можна змінювати. Його можна встановити лише один раз, а спроба встановити його знову призведе до помилки. Це корисно з кількох причин, можливо, ви хочете оголосити константу, яку неможливо змінити.
Деякі приклади коду:
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має різні значення, якщо його застосовують до змінних, методів, класів чи деяких інших випадків. Тут мені подобаються пояснення Вікіпедії .
Статичні значення змінних можуть бути змінені, хоча одна копія змінної проходить через додаток, тоді як значення Кінцевої змінної можна ініціалізувати один раз і не можуть бути змінені протягом усієї програми.