1. Що таке клас-обгортка (Wrapper class) у Java?
У загальному сенсі, обгортка (Wrapper) – це більший об'єкт, який інкапсулює менший. У Java клас-обгортка є об'єктним класом, який інкапсулює примітивні типи даних.
Примітивні типи даних — це типи, з яких можна створювати інші типи даних. Наприклад, з цілих чисел можна створити типи long, byte, short тощо. Натомість рядки не є примітивними, тому вони не підлягають такій трансформації.
Повертаючись до класу-обгортки, Java містить 8 класів-обгорток. Це Boolean, Byte, Short, Integer, Character, Long, Float і Double. Крім того, у Java можна створювати власні класи-обгортки, що схоже на концепцію структури у мові програмування C. Ми створюємо власний клас-обгортку з необхідними типами даних.
2. Чому нам потрібні класи-обгортки?
Клас-обгортка є об'єктним класом, який інкапсулює примітивні типи даних, і нам вони потрібні з таких причин:
- Класи-обгортки є фінальними (final) та незмінними (immutable).
- Вони надають методи, як-от valueOf(), parseInt() тощо.
- Вони забезпечують функціональність автозапакування (autoboxing) та розпакування (unboxing).
3. Відмінності між змінними класу та локальними змінними.
4. Які значення за умовчанням присвоюються змінним та екземплярам у Java?
У Java, коли ми не ініціалізуємо змінні екземпляра, компілятор ініціалізує їх за умовчанням. Значення за умовчанням для змінних та екземплярів залежать від їхніх типів даних. Ось деякі типові значення за умовчанням:
- Значення за умовчанням для числових типів (byte, short, int, long, float, double) — це 0.
- Значення за умовчанням для типу boolean — це false.
- Значення за умовчанням для об'єктних типів (класи, інтерфейси, масиви) — це null.
- Символ null — "u0000" — це значення за умовчанням для типу char.
5. Що таке змінна класу?
У Java змінна класу (також відома як статична змінна) — це змінна, яка оголошується в межах класу, але поза методами, конструкторами або блоками. Змінні класу оголошуються за допомогою ключового слова static, і вони спільні для всіх екземплярів (об'єктів) класу та для самого класу. Незалежно від того, скільки об'єктів буде створено з класу, кожна змінна класу існуватиме лише один раз.
class GFG {
public static int ctr = 0;
public GFG() { ctr++; }
public static void main(String[] args)
{
GFG obj1 = new GFG();
GFG obj2 = new GFG();
GFG obj3 = new GFG();
System.out.println("Number of objects created are "
+ GFG.ctr);
}
}
Вивід
Number of objects created are 3
6. Яке значення за умовчанням зберігається в локальних змінних?
У локальних змінних немає значення за умовчанням. Також примітивні змінні та об'єкти не мають значень за умовчанням.
7. Поясніть різницю між змінною екземпляра та змінною класу.
Змінна класу без модифікатора static, яка відома як змінна екземпляра, зазвичай є спільною для всіх екземплярів класу. Ці змінні можуть мати різні значення серед кількох об'єктів. Вміст змінної екземпляра повністю незалежний від одного екземпляра об'єкта до іншого, оскільки вони належать конкретному екземпляру класу.
Приклад:
import java.io.*;
class GFG {
private String name;
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public static void main(String[] args)
{
GFG obj = new GFG();
obj.setName("John");
System.out.println("Name " + obj.getName());
}
}
Вивід
Name John
Змінна класу: Змінну класу можна оголосити на рівні класу, використовуючи ключове слово static. Ці змінні можуть мати лише одне значення для різних об'єктів.
Ці змінні можуть бути спільними для всіх членів класу, оскільки вони не прив'язані до жодного конкретного об'єкта класу.
Приклад:
import java.io.*;
class GFG {
// змінна класу
private static final double PI = 3.14159;
private double radius;
public GFG(double radius) { this.radius = radius; }
public double getArea() { return PI * radius * radius; }
public static void main(String[] args)
{
GFG obj = new GFG(5.0);
System.out.println("Area of circle: "
+ obj.getArea());
}
}
Вивід
Area of circle: 78.53975
8. Що таке статична змінна?
Ключове слово static використовується для спільного доступу до змінної або методу в певному класі. Статичні змінні — це змінні, які після оголошення створюють лише одну копію і спільно використовуються серед усіх об'єктів на рівні класу.
9. У чому різниця між System.out, System.err та System.in?
System.out — Це об'єкт PrintStream, який використовується для запису символів або, іншими словами, для виведення даних на консоль/термінал Command Line Interface.
Приклад:
import java.io.*;
// Основний клас
class GFG {
// Головна функція
public static void main(String[] args)
{
// Використання System.out
System.out.println("");
}
}
System.err — Використовується для відображення повідомлень про помилки.
Приклад:
import java.io.*;
// Основний клас
class GFG {
// Головна функція
public static void main(String[] args)
{
// Виведення помилки
System.err.println(
"This is how we throw error with System.err");
}
}
Вивід:
This is how we throw error with System.err
Хоча System.err має багато подібностей з System.out, між ними існують також чимало відмінностей, давайте розглянемо їх.
System.in — Це InputStream, що використовується для зчитування введення з вікна терміналу. Ми не можемо використовувати System.in безпосередньо, тому використовуємо клас Scanner для отримання введення через system.in.
Приклад:
import java.util.*;
// Основний клас
class Main {
// Головна функція
public static void main(String[] args)
{
// Клас Scanner з System.in
Scanner sc = new Scanner(System.in);
// Отримання введення від користувача
int x = sc.nextInt();
int y = sc.nextInt();
// Виведення результату
System.out.printf("Addition: %d", x + y);
}
}
10. Що ви розумієте під потоками вводу/виводу (I/O)?
Java надає різноманітні потоки з пакету I/O, які допомагають користувачеві виконувати всі операції вводу/виводу. Ці потоки підтримують усі типи об'єктів, типи даних, символи, файли тощо, для повного виконання операцій вводу/виводу.
11. Які суперкласи для всіх потоків?
Всі класи потоків можна поділити на два типи: класи потоку байтів (ByteStream) та класи потоку символів (CharacterStream). Класи потоку байтів додатково поділяються на InputStream і OutputStream. Класи потоку символів поділяються на класи Reader і Writer. Суперкласами для всіх класів InputStream є java.io.InputStream, а для всіх класів OutputStream — java.io.OutputStream. Точно так само для всіх класів Reader суперкласом є java.io.Reader, а для класів Writer — java.io.Writer.
12. У чому різниця між ієрархіями класів Reader/Writer і InputStream/OutputStream?
Основна різниця між ними полягає в тому, що дані потоків байтів зчитуються та записуються класами потоку вводу/виводу. Символи обробляються класами Reader та Writer. На відміну від класів Reader/Writer, які приймають масиви символів як параметри, методи класів InputStream/OutputStream приймають масиви байтів. У порівнянні з потоками вводу/виводу, класи Reader/Writer є більш ефективними, підтримують всі символи Unicode і корисні для інтернаціоналізації.
Використовуйте класи Reader/Writer замість бінарних даних, таких як зображення, якщо тільки ви не робите цього.
13. Що таке FileInputStream і FileOutputStream?
Для зчитування та запису даних Java надає потоки вводу/виводу. Потік (Stream) представляє собою джерело вводу або місце призначення для виводу, яким може бути файл, пристрій вводу/виводу, інша програма тощо. FileInputStream в Java використовується для зчитування даних з файлу у вигляді потоку байтів. Він здебільшого використовується для зчитування бінарних даних, таких як зображення, аудіофайли або серіалізовані об'єкти.
Приклад:
File file = new File("path_of_the_file");
FileInputStream inputStream = new FileInputStream(file);
У Java FileOutputStream використовується для запису даних по байту у зазначений файл або дескриптор файлу. Зазвичай бінарні дані, такі як зображення, записуються у файл за допомогою FileOutputStream.
Приклад:
File file = new File("path_of_the_file");
FileOutputStream outputStream = new FileOutputStream(file);
14. Яка мета використання класів BufferedInputStream і BufferedOutputStream?
Коли ми працюємо з файлами або потоком, щоб підвищити продуктивність вводу/виводу програми, ми використовуємо класи BufferedInputStream і BufferedOutputStream. Обидва ці класи забезпечують можливість буферизації, що означає, що дані зберігаються в буфері перед записом у файл або зчитуванням з потоку. Це також зменшує кількість звернень до операційної системи для взаємодії з мережею або диском. Буферизація дозволяє програмам записувати великі обсяги даних замість того, щоб записувати їх маленькими частинами. Це також зменшує навантаження на доступ до мережі або диска.
BufferedInputStream(InputStream inp);
// використовується для створення потоку BufferedInputStream і збереження аргументів.
BufferedOutputStream(OutputStream output);
// використовується для створення нового буфера з розміром за замовчуванням.
15. Що таке FilterStreams?
Фільтр потоків (Stream filter) або Filter Streams повертає потік, який складається з елементів цього потоку, що відповідають заданому предикату. Під час роботи filter() насправді не виконується фільтрація, а створюється новий потік, який, при проході через нього, містить елементи початкових потоків, що відповідають заданому предикату.
Приклад:
FileInputStream fis =new FileInputStream("file_path");
FilterInputStream = new BufferedInputStream(fis);
16. Що таке I/O фільтр?
I/O фільтр, або фільтр вводу/виводу, — це об'єкт, який зчитує дані з одного потоку і записує їх у джерела вводу та виводу. Для використання цього фільтра використовується пакет java.io.
17. Якими способами можна отримати введення з консолі?
Існує два основні методи отримання введення з консолі в Java:
- За допомогою аргументів командного рядка
- За допомогою класу BufferedReader
- За допомогою класу Console
- За допомогою класу Scanner
Приклад:
System.out.println( "The command line arguments are:");
for (String val : args) System.out.println(val);
// Введення даних за допомогою BufferReader
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
// Використання Console для введення даних користувачем
String x = System.console().readLine();
// Використання Scanner для отримання введення від користувача
Scanner in = new Scanner(System.in);
18. Різниця між використанням print, println і printf.
Методи print, println та printf використовуються для виведення елементів, але print виводить усі елементи, і курсор залишається на тій самій лінії. println переводить курсор на наступний рядок. А з printf ми можемо також використовувати форматні ідентифікатори.
Перекладено з: Java Interview questions for Fresher — Part 2