Я искал в Интернете, но мне было не очень ясно, что означают эти зарезервированные слова и какие функции они имеют в классе:
- статический
- окончательный
Я искал в Интернете, но мне было не очень ясно, что означают эти зарезервированные слова и какие функции они имеют в классе:
При использовании зарезервированного слова
static
объявление константы должно быть сделано в заголовке класса.Если мы попытаемся включить его в метод, мы получим ошибку.
Этот пример не компилируется:
а этот да:
Вот почему внутри метода
main
, поскольку это метод класса и он включенstatic
в его объявление, мы не можем объявлять константы класса.Но
final
да, его можно использовать как внутри методов, так и внутри методаmain
.Пример:
final double PI = 3.1416;
это действительно внутри метода.Его также
final double PI = 3.1416;
можно использовать для доступа к данным, которые, как вы знаете, теоретически не могут быть изменены после их объявления/инициализации со значением.Статические члены можно вызывать без необходимости создания их экземпляра, например, когда вы используете
new MiClase
...miClase.a
. Теперь вы можете создать MyClass.a без необходимости использовать или создавать его экземпляр.Создав класс
static
, его можно вызвать, то есть вы можете использовать, например, его методы без необходимости создавать его экземпляр, например, когда вы используетеnew MiClase
...miClase.miMetodo();
. Теперь вы можете обойтисьMiClaseEstatica.miMetodo();
без использования или создания его экземпляра.В Java нет возможности создать статический класс верхнего уровня, вы можете сделать что-то вроде следующего:
Здесь мы используем статический вызов без необходимости создания экземпляра для доступа, например, к методу класса.
Это спасло бы что-то вроде:
Возможно, вам будет интересно прочитать этот вопрос/ответ
Внутренние классы могут быть объявлены статическими.
.class будет создан для каждого из этих внутренних классов.
вы также можете создавать блоки кода как статические, чтобы они выполнялись при загрузке класса.
они обычно известны как (блок статического инициализатора), если это явно не объявлено, компилятор JIT (точно в срок) объединяет все статические поля в блоке и выполняет их во время загрузки класса.
Блоки инициализации можно заменить статическими методами, как показано в следующем примере:
Вы можете применить эту логику инициализации к переменным класса
static
без необходимости включать ее в конструктор класса.static позволяет получить доступ к методам, переменным класса без необходимости создания экземпляра объекта рассматриваемого класса, он часто используется, например, для создания служебных классов. В Java их несколько, например:
Таким образом, члены
static
принадлежат классу, а не конкретному экземпляру, это ключ к более быстрому пониманию следующего:Только одно поле будет существовать,
static
даже если были созданы тысячи экземпляров класса, и еще больше будет найдено, даже если ни один его экземпляр «не существует».Таким образом, это поле будет общим для всех экземпляров.
Это, если немного проанализировать, имеет большой смысл как для вышеизложенного, так и применительно к статическим методам. Когда говорится, что они не могут ссылаться на члены экземпляра, потому что если да, то к какому экземпляру он относится, когда все они используют одно и то же статическое поле или метод.
Это не то же самое, что доступ через конкретный экземпляр.
Пример:
Все это имеет смысл, потому что значения, поля, методы НЕ статичны, зависят от создания экземпляров класса.
Когда говорят, что будет только одно статическое поле, это полуправда, но в зависимости от уровня, на котором оно объясняется, оно может быть более или менее достоверным, например, оно может быть по одному на
Class Loader
каждый поток или поток . (thread) , среди прочих случаев, я упоминаю его только для того, чтобы его можно было найти определенным образом, на случай, если вы захотите углубиться в него.https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html
Модификаторы
static
иfinal
имеют совершенно разные контексты.статический
Модификатор
static
подразумевает, что что-то определено в общем контексте, а не в контексте объекта. Без этого модификатора переменные, классы или поля всегда существуют в контексте экземпляра определенного объекта.static
являются глобальными переменными.static
являются глобальными функциями.static
работают как обычные классы, их можно вызывать извне содержащего класса и (очевидно) у них нет такого же доступа к переменным и методам вызываемых объектов содержащего класса.окончательный
Final вообще означает неизменяемый. Есть два основных варианта использования:
Переменные, объявленные как final , не могут быть перезаписаны. Это не означает, что объект, присвоенный переменной final, не может быть изменен в его полях или с помощью его методов, это просто означает, что ссылка из этой переменной на этот же объект никогда не изменится.
Классы, объявленные как final , не могут использоваться в качестве суперклассов.
String
например, это класс, определенный как final, поэтому объявить его невозможноMegaString extends String
— Java не позволяет этого. Точно так же методы, объявленные как final, не могут быть переопределены с помощью @Override.Обычное использование
static
Константы (в сочетании с
final
):public static final int RESULT_CANCELED=0;
Одиночки (объекты, которые должны использоваться только в одном экземпляре):
public static final SecureRandom sr = SecureRandom();
Глобальные переменные:
private static int numLusers=0;
Глобальные методы:
public static Luser newInstance(){ numLusers++; return new Luser(); }
Общедоступные внутренние классы
Но если объявленный внутренний класс
static
не имеет прямого доступа к методам и полям внешнего класса, в чем преимущество объявления такого внутреннего класса?Это организационный вопрос, и, наверное, есть разные мнения по этому поводу. Я лично предпочитаю группировать классы по пакетам для их организации, однако есть очевидное преимущество: если я храню классы, которые сильно зависят от своего кода, их хранение в одном файле очень помогает избежать ошибок, комбинируя классы из разных версий, если я использую
.java
тот, который содержит внешний и внутренний класс, я всегда могу быть уверен, что у меня есть совместимые версии.Обычное использование
final
Константы (в сочетании с
static
)Поля «Объекты значений», используемые в контексте параллелизма.
Локальные переменные для использования в анонимных классах:
Заключительные классы, которые не следует расширять:
Методы, которые не следует переопределять:
Давайте сначала посмотрим на статические переменные и статические методы.
Статическая переменная
статический метод
Es un método que pertenece a la clase y no al objeto (instancia) Un método estático sólo puede acceder a los datos estáticos. No puede acceder a datos no estáticos (variables de instancia) a menos que tenga / cree una instancia de la clase. Un método estático puede llamar a otros métodos estáticos y no puede llamar a un método no estático de él a menos que tenga / crea una instancia de la clase. Un método estático puede ser accedido directamente por el nombre de la clase y no necesita ningún objeto Sintaxis: Class.methodName () Un método estático no puede referirse a este o super palabras clave en cualquier caso
Clase estática
Java también tiene "clases anidadas estáticas", Una clase anidada estática es una que no implica implícitamente una referencia a una instancia de la clase externa.
Статические вложенные классы могут иметь методы экземпляра и статические методы.
В Java нет такого понятия, как статический класс верхнего уровня.
Конечный класс не может быть подклассом. Это сделано из соображений безопасности и эффективности. Следовательно, многие классы стандартной библиотеки Java
final
, например,java.lang.System
иjava.lang.String
. Все методы классаfinal
неявноfinal
.Метод, объявленный как
final
не может быть переопределен подклассами. Это используется для предотвращения неожиданного поведения подкласса, который изменяет метод, который может иметь решающее значение для функции или согласованности класса.Una variable
final
sólo se puede inicializar una vez, ya sea a través de un inicializador o una declaración de asignación. No necesita ser inicializado en el punto de la declaración: esto se llama una variable final en blanco (blank final
). Una variable de instanciafinal
en blanco de una clase debe asignarse definitivamente al final de cada constructor de la clase en la que se declara; De manera similar, una variable estática final en blanco debe asignarse definitivamente en un inicializador estático de la clase en la que se declara; De lo contrario, se producirá un error de tiempo de compilación en ambos casos.Existe una respuesta en SO realizada por @Ashish
Иногда они усложняют определение определенных ключевых слов, я постараюсь быть максимально простым.
статический:
сделать свойство или метод класса, соответствовать классу, это означает, что если у вас есть класс Dog и у вас есть свойство,
color = "negro"
все объекты собаки, которые вы создаете с этим классом, будут изcolor = negro
, если через мгновение вы измените значение наcolor = "azul"
, теперь все объекты собаки, которые вы создали с черным цветом, будут синими, потому что это зависит от класса.Perro.color = "negro";
// изменен общедоступный статический атрибут String класса DogИзменение связано с тем, что это атрибут класса (вида), а не объекта, если вы изменяете атрибут класса, все объекты этого класса «затрагиваются»
В методах: это позволяет вам вызывать метод напрямую без необходимости создания объекта.В том же случае с собакой, если у нее есть метод
correr()
и он не статичен, вы могли бы вызвать его только такЕсли бы это было так
static
, вам не нужно создавать объект, просто вызовите из классаокончательный
Типы переменных
Final
проще, они только делают атрибут или то, что определено этим словом, не может быть изменено Это его конечное значение, оно в основном используется, когда вы хотите объявить КОНСТАНТЫ, значения, которые никогда не изменятся.Примечание: переменные
static
многое упрощают, потому что при создании элементов с этим значением они могут быть легко доступны только из класса. атрибут "final" позволяет только убедиться, что элемент неизменяем, его нельзя изменить. Атрибуты "static final" позволяют оба, доступны из любого места только из вашего класса и являются неизменяемыми.Константы объявляются так:
static -> указывает, что он доступен на уровне класса и не требует использования его экземпляра.
final -> указывает, что однажды объявленное значение не может быть изменено.
пример
Los static no se necesita instanciar la clase... osea
= new Clase()
para llamarlos, es simplemente llamar el método por ejemplo:clase.metodoStatic();
,sin requerir la instanciaClase clase = new Clase()
, dentro de estos solo puedes usar mas métodos estáticos, ninguno de instancia.La clase Final significa que no pueden tener herencia.
Y esa es toda la diferencia, lo demás es pura paja... información de mas.
Espero pode ayudarte, saludos.