Разница между статическими и финальными?

Я всегда смущен между static и final ключевыми словами в java.

Как они отличаются?

Ответ 1

Ключевое слово static можно использовать в 4 сценариях

  • статические переменные
  • статические методы
  • статические блоки кода
  • статический вложенный класс

Рассмотрим сначала статические переменные и статические методы.

Статическая переменная

  • Это переменная, которая принадлежит классу, а не объекту (экземпляру).
  • Статические переменные инициализируются только один раз, в начале выполнения. Эти переменные будут инициализированы сначала, прежде чем инициализировать любые переменные экземпляра.
  • Единая копия для совместного использования всеми экземплярами класса.
  • Статическая переменная может быть доступна непосредственно по имени класса и не нуждается в каком-либо объекте.
  • Синтаксис: 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 в объеме этого метода, доступны из внутреннего класса. После того, как он был назначен, значение конечной переменной не может измениться.

Ответ 2

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
    }
}

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

Ответ 3

Оба действительно не похожи. 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!
}

Ответ 4

final -

1) Когда мы применяем ключевое слово final к переменной , значение этой переменной остается постоянным.           (или) Как только мы объявим переменную как final. Значение этой переменной не может быть изменено.

2) Это полезно, когда значение variable не изменяется в течение срока службы программы

static -

1), когда мы применяем ключевое слово static к переменной , это означает, что оно принадлежит классу.
 2) Когда мы применяем ключевое слово статическое к методу, это означает, что к методу можно получить доступ без создания какого-либо экземпляра класса p >

Ответ 5

static означает, что в памяти есть только одна копия переменной, используемая всеми экземплярами класса.

final ключевое слово просто означает, что значение не может быть изменено. Без final любой объект может изменить значение переменной.

Ответ 6

Статические и конечные имеют некоторые большие отличия:

Статические переменные или классы всегда будут доступны (в значительной степени) в любом месте. Финал - это просто ключевое слово, которое означает, что переменная не может быть изменена. Так что если бы:

public class Test{    
   public final int first = 10;
   public static int second = 20;

   public Test(){
     second = second + 1
     first = first + 1;
   }
}

Программа будет работать до тех пор, пока не попытается изменить "первое" целое число, что приведет к ошибке. Вне этого класса у вас будет доступ к "первой" переменной, если вы создали экземпляр класса. Это контрастирует с "вторым", которое доступно все время.

Ответ 7

Подумайте об объекте, таком как спикер. Если динамик - это класс, он будет иметь разные переменные, такие как громкость, высокие частоты, бас, цвет и т.д. Вы определяете все эти поля при определении класса 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.
}}

Вы можете скопировать/вставить этот код непосредственно в свой эмулятор и попробовать.

Ответ 8

Статика - это то, что может вызывать любой объект в классе, который по своей природе принадлежит типу объекта.

Переменная может быть конечной для всего класса, и это просто означает, что она больше не может быть изменена. Он может быть установлен только один раз, и попытка установить его снова приведет к возникновению ошибки. Это полезно по ряду причин, возможно, вы хотите объявить константу, которую нельзя изменить.

Пример кода:

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.

Ответ 9

Я не буду пытаться дать полный ответ здесь. Моя рекомендация состояла бы в том, чтобы сосредоточиться на понимании того, что делает каждый из них, и тогда должно быть ясно, что их эффекты совершенно разные и почему иногда они используются вместе.

static предназначен для членов класса (атрибуты и методы), и его нужно понимать в отличие от членов (нестатических). Я бы рекомендовал прочитать "Понимание экземпляра и членов класса" в Учебниках по Java. Я также могу использовать в блоках static, но я бы не стал беспокоиться об этом для начала.

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

Ответ 10

Легкая разница,

Окончательный: означает, что значение переменной является конечным, и оно нигде не изменится. Если вы говорите, что 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; "

Ответ 11

Значения статических переменных могут быть изменены, хотя одна копия переменной проходит через приложение, тогда как значения Final Variable могут быть инициализированы один раз и не могут быть изменены во всем приложении.