Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
⌨️ Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?

Сначала вызываются все статические блоки в очередности от первого статического блока корневого предка и выше по цепочке иерархии до статических блоков самого класса.

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

1️⃣ Parent static block(s) → Child static block(s)

2️⃣ Parent non-static block(s) → Parent constructor
→ Child non-static block(s) → Child constructor

Пример:

public class Alert {
public Alert(String message) {
System.out.println(message);
}
}



public class Parent {
public static Alert statVar1 = new Alert("Parent: static variable (statVar1)");
public static Alert statVar2;
static {
statVar2 = new Alert("Parent: static initialization block (statVar2)");
}

public Alert var1 = new Alert("Parent: variable (var1)");
public Alert var2;
{
var2 = new Alert("Parent: initialization block (var2)");
}
public Alert var3 = new Alert("Parent: variable (var3)");

public static Alert statVar3 = new Alert("Parent: static variable (statVar3)");

public Alert contructorVar;
public Parent() {
contructorVar = new Alert("Parent: constructor (contructorVar)");
}
}



public class Child extends Parent {
public static Alert statVar1 = new Alert("Child: static variable (statVar1)");
public static Alert statVar2;
static {
statVar2 = new Alert("Child: static initialization block (statVar2)");
}

public Alert var1 = new Alert("Child: variable (var1)");
public Alert var2;
{
var2 = new Alert("Child: initialization block (var2)");
}
public Alert var3 = new Alert("Child: variable (var3)");

public static Alert statVar3 = new Alert("Child: static variable (statVar3)");

public Alert contructorVar;
public Child() {
contructorVar = new Alert("Child: constructor (contructorVar)");
}
}



public class Test {
public static void main(String[] args) {
new Child();
}
}


Вывод консоли:

Parent: static variable (statVar1)
Parent: static initialization block (statVar2)
Parent: static variable (statVar3)
Child: static variable (statVar1)
Child: static initialization block (statVar2)
Child: static variable (statVar3)
Parent: variable (var1)
Parent: initialization block (var2)
Parent: variable (var3)
Parent: constructor (contructorVar)
Child: variable (var1)
Child: initialization block (var2)
Child: variable (var3)
Child: constructor (contructorVar)


#java #initialization #static #block #constructor
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102❤‍🔥2🔥2
⌨️ Могут ли нестатические методы перегрузить статические?

Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.

#java #overload #static
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62👨‍💻2
⌨️ К каким конструкциям Java применим модификатор static?

полям;
методам;
вложенным классам;
блокам инициализации;
членам секции import.

#java #static
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3🤝1
⌨️ В Java static import (статический импорт) позволяет импортировать статические члены (методы и поля) из класса, чтобы использовать их напрямую без указания имени класса. Это может сделать код более читабельным и компактным.


// Для импорта конкретного статического члена
import static package.Clazz.member;

// Для импорта всех статических членов класса
import static package.Clazz.*;


Пример:

public class MathUtils {
public static final double PI = 3.141592653589793;
public static int add(int a, int b) {
return a + b;
}
public static int subtract(int a, int b) {
return a - b;
}
}



import static MathUtils.PI;
import static MathUtils.add;

public class Main {
public static void main(String[] args) {
System.out.println("Value of PI: " + PI);
System.out.println("Addition result: " + add(5, 3));
}
}



import static MathUtils.*;

public class Main {
public static void main(String[] args) {
System.out.println("Value of PI: " + PI);
System.out.println("Addition result: " + add(5, 3));
System.out.println("Subtraction result: " + subtract(5, 3));
}
}


Плюсы: читаемость, компактность кода.

Минусы:
- не очевидно откуда берется поле или метод
- импорт всех статических членов может привести к конфликтам имен, если разные классы содержат статические члены с одинаковыми именами

#java #static #import
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥21👏1🤡1👨‍💻1
⌨️ Для чего в Java используются статические блоки инициализации?

Статические блоки инициализация используются для выполнения кода, который должен выполняться один раз при инициализации класса загрузчиком классов, в момент, предшествующий созданию объектов этого класса при помощи конструктора. Такой блок (в отличие от нестатических, принадлежащих конкретном объекту класса) принадлежит только самому классу (объекту метакласса Class).

#java #static #initialization
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91🔥1
⌨️ Можно ли объявить метод абстрактным и статическим одновременно?

Нет. В таком случае компилятор выдаст ошибку: "Illegal combination of modifiers: ‘abstract’ and ‘static’".

Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.

#java #abstract #static
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
⌨️ В чем разница между членом экземпляра класса и статическим членом класса?

Модификатор static говорит о том, что данный метод или поле принадлежат самому классу и доступ к ним возможен даже без создания экземпляра класса. Поля, помеченные static инициализируются при инициализации класса. На методы, объявленные как static, накладывается ряд ограничений:

✔️ Они могут вызывать только другие статические методы.

✔️ Они должны осуществлять доступ только к статическим переменным.

✔️ Они не могут ссылаться на члены типа this или super.

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

Пример:

public class MainClass {
public static void main(String args[]) {
System.out.println(TestClass.v);
new TestClass().a();
System.out.println(TestClass.v);
}
}



public class TestClass {

public static String v = "Initial val";

{
System.out.println("!!! Non-static initializer");
v = "Val from non-static";
}

static {
System.out.println("!!! Static initializer");
v = "Some val";
}

public void a() {
System.out.println("!!! a() called");
}

}


Результат:

!!! Static initializer
Some val
!!! Non-static initializer
!!! a() called
Val from non-static


#java #static
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8👨‍💻31🔥1
⌨️ Где разрешена инициализация статических/нестатических полей?

✔️ Статические поля можно инициализировать при объявлении, в статическом или нестатическом блоке инициализации.

✔️ Нестатические поля можно инициализировать при объявлении, в нестатическом блоке инициализации или в конструкторе.

#java #initialization #static #nonstatic
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
⌨️ Что такое «статический класс»?

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

Это означает, что он связан с внешним классом, но при этом не имеет доступа к нестатическим членам внешнего класса, если только они не предоставляются явно.

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


public class Outer {
private static String staticMember = "Static Member";
private String instanceMember = "Instance Member";

// Статический вложенный класс
public static class StaticNested {
public void display() {
// Доступ к статическому члену внешнего класса
System.out.println(staticMember);

// Нельзя напрямую обращаться к нестатическому члену внешнего класса
// System.out.println(instanceMember); // Ошибка компиляции
}
}

public static void main(String[] args) {
// Создание экземпляра статического вложенного класса
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.display();
}
}


#java #static #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101🔥1👏1
⌨️ Какие существуют особенности использования вложенных классов: статических и внутренних? В чем заключается разница между ними?

Вложенные классы могут обращаться ко всем членам обрамляющего класса, в том числе и приватным.

Для создания объекта статического вложенного класса объект внешнего класса не требуется.

Из объекта статического вложенного класса нельзя обращаться к не статическим членам обрамляющего класса напрямую, а только через ссылку на экземпляр внешнего класса.

Обычные вложенные классы не могут содержать статических методов, блоков инициализации и классов. Статические вложенные классы - могут.

В объекте обычного вложенного класса хранится ссылка на объект внешнего класса. Внутри статической такой ссылки нет. Доступ к экземпляру обрамляющего класса осуществляется через указание .this после его имени. Например: Outer.this.

#java #nested #static #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1👏1👨‍💻1
⌨️ Может ли статический метод быть переопределён?

В Java статические методы нельзя переопределить в строгом смысле этого слова, поскольку они связаны с классом, а не с объектом. Однако их можно скрыть (hide).

Если в подклассе объявить статический метод с той же сигнатурой, что и в суперклассе, то метод суперкласса будет скрыт в контексте подкласса.

Такое скрытие не является переопределением, потому что оно не зависит от объекта, а определяется на уровне класса.

Если вы вызываете статический метод через ссылку на суперкласс, будет вызван метод суперкласса, независимо от того, какой класс был фактически использован для создания объекта.

Пример:

class Parent {
static void staticMethod() {
System.out.println("Parent");
}
}

class Child extends Parent {
static void staticMethod() {
System.out.println("Child");
}
}

public class Main {
public static void main(String[] args) {
Parent parent = new Child();
parent.staticMethod(); // Parent
}
}


Почему статические методы нельзя переопределить?

Переопределение в Java работает через механизм динамической диспетчеризации, который зависит от объекта, а не от класса. Поскольку статические методы вызываются на уровне класса, такой механизм для них неприменим.

#java #static #override
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥32
⌨️ Что такое "статический класс"?

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

Статический вложенный класс имеет несколько особенностей, отличающих его от обычных вложенных классов:

1️⃣ Нет привязки к экземпляру внешнего класса
Статический вложенный класс не связан с экземпляром внешнего класса. Это означает, что он может быть создан без необходимости создавать объект внешнего класса. В отличие от обычного вложенного класса, который всегда ассоциирован с экземпляром внешнего класса, статический вложенный класс может быть использован независимо.

2️⃣ Доступ к членам внешнего класса
Статический вложенный класс может обращаться только к статическим членам (поля и методы) внешнего класса. Он не имеет доступа к нестатическим членам внешнего класса, поскольку не существует привязки к экземпляру внешнего класса.

Пример:

public class OuterClass {
private static int staticVar = 10;
private int nonStaticVar = 20;

static class StaticNestedClass {
void display() {
// Доступ к статическому полю внешнего класса
System.out.println("Static variable from outer class: " + staticVar);

// Ошибка компиляции: нестатическое поле нельзя использовать в статическом вложенном классе
// System.out.println("Non-static variable from outer class: " + nonStaticVar);
}
}
}

public class Main {
public static void main(String[] args) {
// Создаем экземпляр статического вложенного класса
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
nestedObject.display();
}
}


Для чего используется:
✔️ Когда вложенный класс не должен иметь доступа к состоянию экземпляра внешнего класса.

✔️ Когда вложенный класс используется для представления логически связанного функционала, но не зависит от состояния внешнего объекта.

#java #static #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍151
⌨️ В Java static import (статический импорт) позволяет импортировать статические члены (методы и поля) из класса, чтобы использовать их напрямую без указания имени класса. Это может сделать код более читабельным и компактным.


// Для импорта конкретного статического члена
import static package.Clazz.member;

// Для импорта всех статических членов класса
import static package.Clazz.*;


Пример:

public class MathUtils {
public static final double PI = 3.141592653589793;
public static int add(int a, int b) {
return a + b;
}
public static int subtract(int a, int b) {
return a - b;
}
}



import static MathUtils.PI;
import static MathUtils.add;

public class Main {
public static void main(String[] args) {
System.out.println("Value of PI: " + PI);
System.out.println("Addition result: " + add(5, 3));
}
}



import static MathUtils.*;

public class Main {
public static void main(String[] args) {
System.out.println("Value of PI: " + PI);
System.out.println("Addition result: " + add(5, 3));
System.out.println("Subtraction result: " + subtract(5, 3));
}
}


Плюсы: читаемость, компактность кода.

Минусы:
- не очевидно откуда берется поле или метод
- импорт всех статических членов может привести к конфликтам имен, если разные классы содержат статические члены с одинаковыми именами

#java #static #import
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥41