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 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
Историческая справка

#java #meme #interview
😁32🤣11👏2🤩1
⌨️ Типы конструкторов

Конструктор по умолчанию (Default Constructor)
Это конструктор без параметров, который автоматически создается компилятором, если в классе не объявлено ни одного конструктора. Он будет пустым и не делает ничего, кроме вызова конструктора суперкласса.

public class MyClass {
private int number;
private String text;

// Компилятор создаст конструктор по умолчанию:
// public MyClass() {
// super();
// }
}


Конструктор с параметрами (Parameterized Constructor)
Это конструктор, который принимает один или несколько параметров, используемых для инициализации полей класса. Если объявлен хотя бы один конструктор с параметрами, конструктор по умолчанию больше не создается автоматически (его нужно явно определить, если он нужен).

public class MyClass {
private int number;
private String text;

public MyClass(int number, String text) {
this.number = number;
this.text = text;
}
}


Конструктор копирования (Copy Constructor)
Это конструктор, который создает новый объект как копию существующего объекта того же класса.

public class MyClass {
private int number;
private String text;

// Конструктор копирования
public MyClass(MyClass other) {
this.number = other.number;
this.text = other.text;
}
}

#java #constructor
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83🔥1👨‍💻1
⌨️ Виды классов

1. Обычные классы (Regular Classes)
Это наиболее распространенные классы, которые вы создаете для определения объектов. Они могут содержать поля, методы, конструкторы и вложенные классы.

public class MyClass {
private int field;

public MyClass(int field) {
this.field = field;
}

public void method() {
// some code
}
}


2. Абстрактные классы (Abstract Classes)
Абстрактные классы не могут быть созданы как объекты напрямую. Они предназначены для предоставления общей функциональности, которую подклассы должны реализовать или дополнить.

public abstract class AbstractClass {
public abstract void abstractMethod();

public void concreteMethod() {
// some code
}
}


3. Вложенные классы (Nested Classes)
Классы, объявленные внутри другого класса. Они могут быть статическими или нестатическими.

🔹 Статические вложенные классы (Static Nested Classes):
Эти классы могут быть созданы без экземпляра внешнего класса.

public class OuterClass {
static class StaticNestedClass {
// some code
}
}


🔹 Внутренние классы (Inner Classes):
Эти классы имеют доступ ко всем членам внешнего класса и создаются в контексте экземпляра внешнего класса.

public class OuterClass {
class InnerClass {
// some code
}
}


4. Локальные классы (Local Classes)
Классы, объявленные внутри метода, конструктора или блока. Они имеют доступ к финальным переменным из охватывающего метода.

public class OuterClass {
public void method() {
class LocalClass {
// some code
}
LocalClass local = new LocalClass();
}
}


5. Анонимные классы (Anonymous Classes)
Классы без имени, создаваемые на месте для реализации интерфейса или наследования от класса. Часто используются для создания экземпляров интерфейсов или абстрактных классов.

public class OuterClass {
public void method() {
Runnable runnable = new Runnable() {
@Override
public void run() {
// some code
}
};
}
}


6. Перечисления (Enums)
Специальные классы, представляющие набор констант. Они могут содержать поля, методы и конструкторы.

public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}


7. Интерфейсы (Interfaces)
Технически не классы, но важная часть объектно-ориентированного программирования в Java. Интерфейсы определяют контракты, которые должны быть реализованы классами.

public interface MyInterface {
void myMethod();
}


8. Записи (Records)
Нововведение в Java 14 (в предварительном виде) и официально в Java 16. Они предоставляют компактный способ создания неизменяемых классов с полями и автоматически сгенерированными методами, такими как equals, hashCode и toString.

public record Point(int x, int y) {}


#java #classes
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍7🔥5❤‍🔥1👏1👨‍💻1
Какие побитовые операции вы знаете?


~ Побитовый унарный оператор NOT;
& Побитовый AND;
&= Побитовый AND с присваиванием;
| Побитовый OR;
|= Побитовый OR с присваиванием;
^ Побитовый исключающее XOR;
^= Побитовый исключающее XOR с присваиванием;
>> Сдвиг вправо (деление на 2 в степени сдвига);
>>= Сдвиг вправо с присваиванием;
>>> Сдвиг вправо без учёта знака;
>>>= Сдвиг вправо без учёта знака с присваиванием;
<< Сдвиг влево (умножение на 2 в степени сдвига);
<<= Сдвиг влево с присваиванием.


#java #bitwise
👍18🔥51👏1
public class Quest {

public static void main(String[] args) {
System.out.println(condition(null) ? 1 : 2);
}

public static boolean condition(Number o) {
return true;
}

public static boolean condition(Long l) {
return false;
}

}
👍2
Что выведет код?
Anonymous Quiz
25%
1
19%
2
56%
ошибка компиляции
3👍2👏2🎉1💯1