Эта статья живет в https://blog.bhanunadar.com/difference-between-final-static-in-java/
В Java мы постоянно используем эти ключевые слова в нашей разработке и почему-то никогда не осознаем, в какой ситуации мы получаем ошибку компиляции, пока intellisense не предложит нам или когда нам зададут вопрос в интервью об этом. Итак, давайте подробно рассмотрим оба ключевых слова.
Ключевое слово Final может быть применено к 1.Классу 2.методу 3.Переменной Давайте посмотрим в каждом сценарии, как ведет себя ключевое слово.
Давайте посмотрим в каждом сценарии, как ведет себя ключевое слово.
Когда ключевое слово final применяется к классу, оно не может быть унаследовано.
final class A{
public void methodA(){
System.out.println("A");
}
}
class B extends A{ //COMPILE ERROR
}
This will give a compile error.
Когда ключевое слово final применяется к классу, оно не может быть унаследовано.
Когда в методе используется final, этот метод нельзя переопределить или повторно объявить. Так что же я подразумеваю под повторным объявлением? Давайте посмотрим на примере.
class A{
public final void doSomethingA(){
System.out.println("A");
}
class B extends A{
public void doSomethingA(){ //COMPILE ERROR
}
выполнение чего-либо в классе B приведет к ошибке компиляции, поскольку метод, помеченный как окончательный в классе A, не может быть переопределен.
class A{
public final void doSomethingA(){
System.out.println("A");
}
class C{
public void metdoSomethingA(){ //COMPILE ERROR
}
выполнение чего-либо в классе C также приведет к ошибке компиляции, даже если класс C НЕ расширяет класс A, поскольку метод, помеченный как окончательный в классе A, не может быть объявлен повторно. Это означает, что метод с именем dosomething() в классе не может использоваться ни в одном другом классе, даже если он его не расширяет. Необходимо использовать какое-то другое имя метода.
Необходимо использовать какое-то другое имя метода.
Как только переменная инициализируется с помощью final, ее значение должно быть инициализировано программистом. JVM не инициализирует ее для нас, после инициализации этой переменной нельзя переназначить значение.
class A{
final int x; //COMPILE ERROR x should be initialized.
final int x1=10;
}
class B extends A{
void m1(){
x=12; //COMPILE ERROR x cannot be changed.
}
}
Также, когда переменная объявлена как окончательная, скрытие локальной переменной не работает.
Теперь давайте перейдем к статическому ключевое слово и применяется к каждому случаю класса , метода и переменной, как и раньше.
|| ключевое слово и применяется к каждому случаю класса , метода и переменной, как и раньше.
Класс не может быть помечен как статический, за исключением случаев, когда внутренний класс.
Класс не может быть помечен как статический, за исключением случаев, когда внутренний класс.
Метод, помеченный как статический, не может быть переопределен.Однако подкласс может воссоздать этот метод, пометив его как статический.
class A{
static void m1(){
System.out.println("A");
}}
class B extends A{
static void m1(){
System.out.println("B");
}}
class App{
public static void main(String[]args){
A a=new B();
a.m1(); //OUTPUT:A
B b=new B();
b.m1(); //OUTPUT:B
}}
OUTPUT:
A
B
Метод, помеченный как статический, не может быть переопределен.Однако подкласс может воссоздать этот метод, пометив его как статический.
Если переменная помечена как статическая, она сохраняется в статической памяти класса. доступ к статической переменной можно получить 3 способами: 1.С помощью объекта 2.С помощью имени класса 3.Напрямую В случае прямого доступа существует 2 способа доступа к статической переменной или сущностям (методам и переменным) в том же классе или за пределами этого конкретного класса
class A{
static int x=10;
public static void main(String[]args){
A a=new A();
System.out.println(a.x); //USING OBJECT
System.out.println(A.x); //USING CLASSNAME
System.out.println(x); //DIRECTLY SAME CLASS
}}
Для доступа к статическим сущностям ВНЕ КЛАССА.Мы импортировали их статически для ПРЯМОГО ДОСТУПА.
package com.Entities;
import static com.asserts.A.x; //IMP
import static com.asserts.A.m1;
import static com.asserts.A.*;
class A{
static int x;
static void m1(){
System.out.println("A");
}}
class B extends A{
static int x=10;
}
class App{
public static void main(String[]args){
System.out.println(new A(x));
System.out.println(A.x);
System.out.println(x); //import needed for direct access
m1(3);
}
}
Ограничения на статические и нестатические переменные экземпляра.
Иногда при использовании статических переменных мы иногда сталкиваемся с ошибкой, указывающей на нестатическую переменную нельзя ссылаться из статического контекста. Это связано с тем, что существуют некоторые ограничения при использовании статических и нестатических переменных в определенных методах. Давайте рассмотрим некоторые ограничения на статические и нестатические переменные экземпляра.
class A{
int x;
static int y;
static void m1(){
y=10; //WORKS FINE
x=10; //COMPILE ERROR SAYING non static variable cannot be referenced from static context.
}
void m2(){
x=10;
y=10;
x=y;
}
//ALL WORK FINE
public static void main(String[]args){
x=10; //COMPILE ERROR
//non-static variable x cannot be referenced from a static context
}}
Так что это все для окончательного и статического в java. Если какая-либо ошибка, пожалуйста, не стесняйтесь исправлять меня в комментариях (грамматически или иным образом).
Счастливого Обучения:)
Оригинал: “https://dev.to/shwetarkadam/final-static-keyword-in-java-13d4”