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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
20😁14🤣5🔥3🤯2🤪2
public class Quest {
public static void main(String[] args) {
boolean b = false;
System.out.println(b++);
}
}


#java #quest
Что выведет код?
Anonymous Quiz
13%
false
11%
true
5%
1
70%
Ошибка компиляции
👍6🎉21😍1🏆1
⌨️ Почему в некоторых интерфейсах вообще не определяют методов?

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

#java #interface #marker
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥1
Что имеет более высокий уровень абстракции?
Anonymous Quiz
5%
класс
24%
абстрактный класс
70%
интерфейс
👍4🔥2❤‍🔥1🎉1
⌨️ Зачем нужны и какие бывают блоки инициализации?

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

Существуют статические и нестатические блоки инициализации.

Статический блок инициализации выполняется в момент загрузки класса в JVM загрузчиком классов (Class Loader).

public class StaticInitialization {
static {
System.out.println("Статическая инициализация");
}
}


Нестатический блок инициализации выполняется в момент создания класса (new).

public class NonstaticInitialization {
{
System.out.println("Нестатическая инициализация");
}
}


Несколько блоков инициализации выполняются в порядке следования в коде класса.

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

Блок инициализации возможно создать и в анонимном классе.

#java #initialization #block #static
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93🔥1
public class Test {

public static int VAL;

{
VAL = 5;
}

public Test() {
VAL = 10;
}

public static void print() {
System.out.println(VAL);
}

}

public class Quest {
public static void main(String[] args) {
Test.print();
}
}


#java #quest
Что выведет код?
Anonymous Quiz
11%
0
38%
5
25%
10
26%
ошибка компиляции
🔥9🤯61🎉1
😁41🤣11👍3🙈2🤪1
Domain-Driven Design (DDD) — это методология разработки программного обеспечения, ориентированная на понимание и моделирование бизнес-домена. Она ставит акцент на использовании общего языка между бизнесом и разработчиками, создании детальной модели бизнес-домена, определении сущностей, значений, агрегатов, сервисов и репозиториев для построения гибких, понятных и масштабируемых систем.

DDD подчеркивает важность использования общего, ясного языка (Язык Унифицированного Домена (Ubiquitous Language)), понятного и для бизнеса, и для разработчиков. Это позволяет уменьшить разрыв между бизнесом и разработкой.

#java #DDD #domain #driven #design
👍41🔥1👨‍💻1
⌨️ Каким образом можно получить доступ к члену класса, объявленному как private?

Внутри класса доступ к приватной переменной открыт без ограничений;

Вложенный класс имеет полный доступ ко всем (в том числе и приватным) членам содержащего его класса;

Доступ к приватным переменным извне может быть организован через отличные от приватных методов, которые предоставлены разработчиком класса (геттеры, сеттеры). Например: getX() и setX().

Через механизм рефлексии (Reflection API):


class Hide {
private int field = 42;
}
...
Hide hide = new Hide();
Field field = Hide.class.getDeclaredField("field");
field.setAccessible(true);
int fieldValue = (int) field.get(hide);


#java #private #access
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍31
Какие логические операции и операторы вы знаете?


& Логическое AND (И);
&& Сокращённое AND;
| Логическое OR (ИЛИ);
|| Сокращённое OR;
^ Логическое XOR (исключающее OR (ИЛИ));
! Логическое унарное NOT (НЕ);
&= AND с присваиванием;
|= OR с присваиванием;
^= XOR с присваиванием;
== Равно;
!= Не равно;
?:: Тернарный (троичный) условный оператор.


#java #logical #operations
6🔥2👏2
public class One {
public static void go() {
System.out.print("one ");
}
}



public class Two extends One {
public static void go() {
System.out.print("two ");
}
}



public class Three extends Two {
public static void go() {
System.out.print("three ");
}
}



public class Quest {
public static void main(String[] args) {
One one = new One();
one.go();

One two = new Two();
two.go();

Two two2 = new Three();
two2.go();
}
}


#java #quest
👍103🎉2🤔1
⌨️ Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?

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

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

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
public class Quest {

public static void main(String[] args) {
int i = 1;
System.out.print(i);
System.out.print(change(i));
System.out.print(i);
}

public static int change(int i) {
i = 2;
return i;
}

}


#java #quest
👍2
Что выведет код?
Anonymous Quiz
12%
111
64%
121
24%
122
🔥6🤯2🎉1
⌨️ Способы передачи параметров в методы

Существуют два основных способа передачи параметров в методы: "по значению" (pass-by-value) и "по ссылке" (pass-by-reference). В первом случае метод работает с копией значения параметра, не изменяя исходное значение. Во втором случае метод получает ссылку на объект или переменную, и любые изменения в параметре отражаются на исходном объекте или переменной.

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

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

#java #pass #value #reference
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥1👏1
public class Quest {
public static void main(String[] args) {
Value val = new Value(1);
System.out.print(val.i);
System.out.print(change(val).i);
System.out.print(val.i);
}

public static Value change(Value val) {
val.i = 2;
return val;
}

static class Value {
int i;
public Value(int i) {
this.i = i;
}
}
}


#java #quest
👍2