Java for Beginner
672 subscribers
541 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Что выведет код?

public class VariableTypesExample {
static int classVariable = 10; // Class variable

public static void main(String[] args) {
int localVariable = 5; // Local variable
VariableTypesExample example = new VariableTypesExample();
example.instanceMethod();
staticMethod();

System.out.println("Class Variable: " + classVariable);
System.out.println("Local Variable: " + localVariable);
System.out.println("Instance Variable: " + example.instanceVariable);
}

int instanceVariable = 20; // Instance variable

void instanceMethod() {
classVariable = 15;
instanceVariable = 25;
}

static void staticMethod() {
classVariable = 30;
}
}

#Tasks
Подписывайтесь на канал, не придется писать говно😏

https://t.me/Java_for_beginner_dev

#Mems
Сериализация и десериализация объектов

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


Сериализация

Для того чтобы объект можно было сериализовать, его класс должен реализовывать интерфейс Serializable. Этот интерфейс является маркерным, то есть не содержит методов и служит лишь для указания JVM, что объекты этого класса могут быть сериализованы.

Пример класса, реализующего Serializable:
import java.io.Serializable;

class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}

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


Процесс сериализации:

Создаем объект ObjectOutputStream, связанный с выходным потоком (например, FileOutputStream).
Вызываем метод writeObject(Object obj) для записи объекта в поток.


Пример сериализации:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("John Doe", 30);

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
}
}



Десериализация

Процесс десериализации включает чтение последовательности байтов и создание из них объекта. Для этого используется класс ObjectInputStream.

Процесс десериализации:


Создаем объект ObjectInputStream, связанный с входным потоком (например, FileInputStream).
Вызываем метод readObject() для чтения объекта из потока. Обязательно выполняем приведение типа (casting) к нужному классу.


Пример десериализации:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserializationExample {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}


serialVersionUID

Каждый сериализуемый класс должен иметь статическое поле serialVersionUID, которое используется для обеспечения совместимости версий класса. Если serialVersionUID у класса изменится, десериализация объектов, сериализованных с предыдущей версией класса, вызовет ошибку.


Пример объявления serialVersionUID:
class Person implements Serializable {
private static final long serialVersionUID = 1L;
// остальные поля и методы
}


Транзиентные поля

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


Пример использования transient:
class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private transient String password;

public User(String username, String password) {
this.username = username;
this.password = password;
}

@Override
public String toString() {
return "User{username='" + username + "', password='" + password + "'}";
}
}

В этом примере поле password не будет сериализовано.

#Java #Training #IO #Serializable
Классы-обёртки (Wrapper classes): Integer, Double

В Java классы-обёртки (Wrapper classes) предоставляют способ использования примитивных типов данных (таких как int, char, boolean и т.д.) в качестве объектов. Это необходимо, потому что многие методы и структуры данных в Java работают только с объектами, а не с примитивами.

Каждый примитивный тип данных имеет соответствующий класс-обёртку в пакете java.lang:

boolean -> Boolean
byte -> Byte
char -> Character
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double


Зачем нужны классы-обёртки?


Коллекции: Коллекции в Java, такие как ArrayList, могут хранить только объекты, поэтому классы-обёртки необходимы для работы с примитивными типами в коллекциях.
Методы: Некоторые методы, особенно в сторонних библиотеках, работают только с объектами.
Методы утилиты: Классы-обёртки предоставляют много полезных методов для преобразования, сравнения и манипулирования значениями.


Примеры использования классов-обёрток

Integer - класс-обёртка для примитивного типа int.

Основные методы:

static Integer valueOf(int i): Возвращает экземпляр Integer, представляющий заданное значение int.
int intValue(): Возвращает значение int, хранимое в объекте Integer.
static int parseInt(String s): Преобразует строку в int.
static String toString(int i): Преобразует int в строку.
int compareTo(Integer anotherInteger): Сравнивает два объекта Integer.


Пример использования Integer:
public class WrapperExample {
public static void main(String[] args) {
Integer integerObject = Integer.valueOf(10);
int intValue = integerObject.intValue();
System.out.println("Integer value: " + intValue);

String str = "20";
int parsedInt = Integer.parseInt(str);
System.out.println("Parsed integer: " + parsedInt);
}
}


Double - класс-обёртка для примитивного типа double.

Основные методы:

static Double valueOf(double d): Возвращает экземпляр Double, представляющий заданное значение double.
double doubleValue(): Возвращает значение double, хранимое в объекте Double.
static double parseDouble(String s): Преобразует строку в double.
static String toString(double d): Преобразует double в строку.
int compareTo(Double anotherDouble): Сравнивает два объекта Double.


Пример использования Double:
public class WrapperExample {
public static void main(String[] args) {
Double doubleObject = Double.valueOf(10.5);
double doubleValue = doubleObject.doubleValue();
System.out.println("Double value: " + doubleValue);

String str = "20.5";
double parsedDouble = Double.parseDouble(str);
System.out.println("Parsed double: " + parsedDouble);
}
}


Character - класс-обёртка для примитивного типа char.


Основные методы:

static Character valueOf(char c): Возвращает экземпляр Character, представляющий заданное значение char.
char charValue(): Возвращает значение char, хранимое в объекте Character.
static boolean isDigit(char ch): Проверяет, является ли символ цифрой.
static boolean isLetter(char ch): Проверяет, является ли символ буквой.
static char toUpperCase(char ch): Преобразует символ в верхний регистр.
static char toLowerCase(char ch): Преобразует символ в нижний регистр.


Пример использования Character:
public class WrapperExample {
public static void main(String[] args) {
Character charObject = Character.valueOf('a');
char charValue = charObject.charValue();
System.out.println("Character value: " + charValue);

char upperChar = Character.toUpperCase(charValue);
System.out.println("Upper case: " + upperChar);

boolean isLetter = Character.isLetter(charValue);
System.out.println("Is letter: " + isLetter);
}
}


#Java #Training
Что выведет код?

public class BoxingExample {
public static void main(String[] args) {
Integer a = 1000;
Integer b = 1000;
Integer c = 10;
Integer d = 10;

System.out.println(a == b);
System.out.println(c == d);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
29%
false false
50%
true true
21%
false true
0%
true false
Подписывайтесь на канал, мы поможем построить правильные планы 😏

https://t.me/Java_for_beginner_dev

#Mems
Автоупаковка (Autoboxing) и распаковка (Unboxing)

Автоупаковка (Autoboxing) и распаковка (Unboxing) — это процесс автоматического преобразования между примитивными типами данных и их соответствующими классами-обёртками в Java. Эти функции были введены в J2SE 5.0 и значительно упрощают код, устраняя необходимость явного преобразования.

Автоупаковка (Autoboxing)

Автоупаковка — это автоматическое преобразование примитивного типа в соответствующий ему объект класса-обёртки.

Примеры автоупаковки:
public class AutoboxingExample {
public static void main(String[] args) {
int intValue = 5;
Integer integerObject = intValue; // Автоупаковка
System.out.println("Integer object: " + integerObject);

char charValue = 'a';
Character characterObject = charValue; // Автоупаковка
System.out.println("Character object: " + characterObject);
}
}


В этом примере примитивный int автоматически преобразуется в объект Integer, а примитивный char — в объект Character.



Распаковка (Unboxing)


Распаковка — это автоматическое преобразование объекта класса-обёртки обратно в соответствующий примитивный тип.

Примеры распаковки:
public class UnboxingExample {
public static void main(String[] args) {
Integer integerObject = Integer.valueOf(10);
int intValue = integerObject; // Распаковка
System.out.println("Primitive int: " + intValue);

Character characterObject = Character.valueOf('a');
char charValue = characterObject; // Распаковка
System.out.println("Primitive char: " + charValue);
}
}


В этом примере объект Integer автоматически преобразуется в примитивный int, а объект Character — в примитивный char.

Преимущества автопреобразования

Упрощение кода: Снижение количества явных преобразований, улучшение читаемости и поддерживаемости кода.
Совместимость с коллекциями: Возможность использования примитивных типов данных в коллекциях, таких как ArrayList, без необходимости явного преобразования.

Особенности и подводные камни


Производительность: Автоупаковка и распаковка могут привести к снижению производительности из-за дополнительных операций создания объектов.
NullPointerException: При распаковке, если объект класса-обёртки равен null, возникает NullPointerException.


Пример потенциальной ошибки с распаковкой:
public class UnboxingPitfall {
public static void main(String[] args) {
Integer integerObject = null;
try {
int intValue = integerObject; // Может вызвать NullPointerException
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException!");
}
}
}


В этом примере попытка распаковки null объекта Integer приводит к NullPointerException.

#Java #Training
Класс Object и его значение в Java

В Java класс Object является родительским классом для всех других классов. Это означает, что любой класс в Java неявно наследуется от класса Object, если явно не указано иное. Это делает Object основным строительным блоком для всех классов в Java и предоставляет несколько методов, которые могут быть переопределены для конкретного поведения.

Основные методы класса Object

Класс Object содержит несколько методов, которые могут быть использованы и переопределены в ваших классах:

public boolean equals(Object obj)
public int hashCode()
public String toString()
protected Object clone() throws CloneNotSupportedException
public final void wait() throws InterruptedException
public final void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
public final void notify()
public final void notifyAll()
protected void finalize() throws Throwable


equals()

Метод equals() используется для сравнения двух объектов на равенство. По умолчанию метод equals() в классе Object сравнивает ссылки на объекты, т.е. проверяет, указывают ли обе ссылки на один и тот же объект в памяти. Обычно этот метод переопределяется, чтобы определить равенство объектов по их содержимому.

Пример переопределения equals()
public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
}


hashCode()

Метод hashCode() возвращает целочисленное значение, представляющее внутренний адрес объекта. В Java рекомендуется переопределять hashCode() всякий раз, когда переопределяется equals(), чтобы поддерживать согласованность между этими двумя методами. Объекты, которые равны по методу equals(), должны иметь одинаковый хеш-код.

Пример переопределения hashCode()
public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}


toString()

Метод toString() возвращает строковое представление объекта. Этот метод часто переопределяется, чтобы предоставить более информативное строковое представление объектов.

Пример переопределения toString()
public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}


#Java #Training #Object
Что выведет код?

public class ObjectMethodsExample {
public static void main(String[] args) {
MyClass obj1 = new MyClass(1);
MyClass obj2 = new MyClass(1);
MyClass obj3 = obj1;

System.out.println(obj1.equals(obj2));
System.out.println(obj1 == obj2);
System.out.println(obj1.hashCode() == obj2.hashCode());
System.out.println(obj1 == obj3);
}
}

class MyClass {
int value;

MyClass(int value) {
this.value = value;
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MyClass myClass = (MyClass) obj;
return value == myClass.value;
}

@Override
public int hashCode() {
return value;
}
}

#Tasks
Подписывайтесь на канал, мы умеем фиксить баги! 😂🤌

https://t.me/Java_for_beginner_dev

#Mems
Другие методы класса Object

clone()

Метод clone() создает и возвращает копию объекта. Для использования этого метода класс должен реализовывать интерфейс Cloneable, иначе вызов метода clone() приведет к выбросу исключения CloneNotSupportedException.

Пример использования метода clone()
public class Person implements Cloneable {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}

@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}

public static void main(String[] args) {
try {
Person person1 = new Person("John", 25);
Person person2 = (Person) person1.clone();
System.out.println(person1);
System.out.println(person2);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}


wait(), notify() и notifyAll()


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

wait(): Приостанавливает текущий поток до тех пор, пока другой поток не вызовет notify() или notifyAll() для этого объекта.
notify(): Пробуждает один поток, ожидающий на этом объекте.
notifyAll(): Пробуждает все потоки, ожидающие на этом объекте.


Эти методы должны вызываться внутри синхронизированного блока или метода.

Пример использования wait() и notify()
public class WaitNotifyExample {
private static final Object lock = new Object();

public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread 1: Waiting for lock...");
lock.wait();
System.out.println("Thread 1: Got the lock!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

Thread t2 = new Thread(() -> {
synchronized (lock) {
System.out.println("Thread 2: Got the lock!");
lock.notify();
System.out.println("Thread 2: Notified!");
}
});

t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}


finalize() (В настоящее время не рекомендуется к использованию)


Метод finalize() вызывается перед сборкой мусора для объекта. Он может быть использован для выполнения очистки ресурсов, но его использование не рекомендуется из-за непредсказуемости момента вызова и возможности замены на более современные механизмы управления ресурсами, такие как try-with-resources и интерфейс AutoCloseable.

Пример использования finalize()
public class FinalizeExample {
@Override
protected void finalize() throws Throwable {
try {
System.out.println("Finalize method called");
} finally {
super.finalize();
}
}

public static void main(String[] args) {
FinalizeExample obj = new FinalizeExample();
obj = null;
System.gc(); // Запрос сборщика мусора (не гарантия вызова finalize)
}
}


#Java #Training #Object
Введение в Queue

Queue — это интерфейс в Java, представляющий коллекцию, предназначенную для хранения элементов в порядке, поддерживающем принципы FIFO (First-In-First-Out). Элементы добавляются в конец очереди и извлекаются из начала. Queue является частью коллекций Java и находится в пакете java.util.

Реализации Queue

Существует несколько реализаций интерфейса Queue в Java:

LinkedList: Класс LinkedList реализует интерфейс Queue и предоставляет эффективные операции вставки и удаления с обоих концов списка.
Queue<String> queue = new LinkedList<>();


PriorityQueue: Класс PriorityQueue реализует интерфейс Queue и предоставляет приоритетную очередь, в которой элементы упорядочены на основе их естественного порядка или на основе предоставленного компаратора.
Queue<String> priorityQueue = new PriorityQueue<>();


ArrayDeque: Класс ArrayDeque реализует интерфейс Deque (двусторонняя очередь) и может использоваться как Queue.
Queue<String> arrayDeque = new ArrayDeque<>();


Основные операции:

Добавление элементов:

add(E e): Добавляет элемент в конец очереди. Выбрасывает исключение IllegalStateException, если очередь ограничена и заполнена.
queue.add("Element");


offer(E e): Добавляет элемент в конец очереди. Возвращает false, если очередь ограничена и заполнена.
queue.offer("Element");


Удаление элементов:

remove(): Удаляет и возвращает элемент из начала очереди. Выбрасывает исключение NoSuchElementException, если очередь пуста.
String element = queue.remove();


poll(): Удаляет и возвращает элемент из начала очереди. Возвращает null, если очередь пуста.
String element = queue.poll();


Просмотр элементов:

element(): Возвращает, но не удаляет, элемент из начала очереди. Выбрасывает исключение NoSuchElementException, если очередь пуста.
String element = queue.element();


peek(): Возвращает, но не удаляет, элемент из начала очереди. Возвращает null, если очередь пуста.
String element = queue.peek();



Пример использования Queue
import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();

// Добавление элементов
queue.add("Element 1");
queue.offer("Element 2");

// Просмотр элемента
System.out.println("Peek: " + queue.peek());

// Удаление элементов
System.out.println("Removed: " + queue.remove());
System.out.println("Polled: " + queue.poll());

// Попытка просмотра/удаления из пустой очереди
System.out.println("Peek from empty queue: " + queue.peek());
System.out.println("Poll from empty queue: " + queue.poll());
}
}


#Java #Training #Collections #Queue
Что выведет код?

import java.util.*;

public class QueueExample {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.add(3);
queue.offer(4);
queue.poll();
queue.remove();

System.out.println(queue);
}
}


#Tasks
Варинаты ответа:
Anonymous Quiz
9%
[1, 2, 3, 4]
73%
[3, 4]
18%
[2, 3, 4]
0%
[1, 3, 4]