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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
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
Что выведет код?
Anonymous Quiz
10%
111
39%
121
51%
122
👍6🤯2😱1🎉1🤡1
⌨️ К каким конструкциям 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
public class Quest {
public static void main(String[] args) {
System.out.println(!!true);
}
}


#java #quest
Что выведет код?
Anonymous Quiz
45%
true
6%
false
7%
!!true
42%
ошибка компиляции
🤯4🎉3👍2😱1🤩1😍1
⌨️ Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?

При переопределении метода нельзя сузить модификатор доступа к методу (например с public в MainClass до private в Class extends MainClass).

Изменить тип возвращаемого значения при переопределении метода нельзя, будет ошибка attempting to use incompatible return type.

Можно сузить возвращаемое значение, если они совместимы.


public class Animal {
public Animal eat() {
System.out.println("animal eat");
return null;
}

public Long calc() {
return null;
}
}



public class Dog extends Animal {
public Dog eat() {
return new Dog();
}

/*attempting to use incompatible return type
public Integer calc() {
return null;
}
*/
}


#java #override
Please open Telegram to view this post
VIEW IN TELEGRAM
21👍1