☕ Вопросы интервью по Java

Вопросы 21-30 для новичков и опытных разработчиков

Вопрос 21
Что такое Wrapper class в Java?

Ответ: Wrapper Class — это класс, который преобразует примитивный тип данных в объект и наоборот. Это позволяет использовать примитивные значения там, где требуются объекты, например в Collections и generic классах.

Соответствие примитивных типов и Wrapper классов:
Примитивный тип Wrapper класс
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
Пример использования:

// Примитивный тип
int a = 5;

// Wrapper класс
Integer obj = new Integer(5);
// или через autoboxing:
Integer obj = 5;

// Распаковка (unboxing)
int value = obj;
                
Вопрос 22
Почему нам нужны wrapper classes?

Ответ: Wrapper classes — это объектные классы, которые инкапсулируют примитивные типы данных. Они нужны по нескольким причинам:

Основные причины:
  • Wrapper classes являются final и immutable: Их значения не могут быть изменены после создания
  • Предоставляют методы: Методы как valueOf(), parseInt() для преобразований
  • Поддержка autoboxing и unboxing: Автоматическое преобразование между примитивами и объектами
  • Использование в Collections: Collections (ArrayList, HashMap) могут хранить только объекты, не примитивы
  • Использование в Generics: Generic классы требуют объектов, а не примитивных типов
Пример необходимости Wrapper classes:

// Collections требуют объектов
List<Integer> numbers = new ArrayList<>();
numbers.add(10);      // autoboxing
numbers.add(20);      // autoboxing

// Без wrapper classes это было бы невозможно
// List<int> numbers = new ArrayList<>();  // Ошибка!
                
Вопрос 23
Различие между instance и local variables

Ответ: Instance и local переменные — это два разных типа переменных в Java с важными отличиями:

Instance Variable Local Variable
Объявляется вне метода, напрямую в классе Объявляется внутри метода
Имеет значение по умолчанию Нет значения по умолчанию
Может использоваться во всех методах класса Область видимости ограничена методом
Создаётся при создании объекта Создаётся при входе в метод
Удаляется при удалении объекта Удаляется при выходе из метода
Пример:

public class MyClass {
    int instanceVar;      // Instance variable (по умолчанию 0)
    
    public void myMethod() {
        int localVar;     // Local variable (нет значения по умолчанию)
        // System.out.println(localVar);  // Ошибка! не инициализирована
        
        localVar = 10;    // Теперь инициализирована
        System.out.println(localVar);  // OK
    }
}
                
Вопрос 24
Какие значения по умолчанию присваиваются переменным и экземплярам в Java?

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

Тип данных Значение по умолчанию
byte, short, int, long 0
float, double 0.0
boolean false
char '\u0000' (нулевой символ)
Объектные типы (String, Object и т.д.) null
Пример:

public class DefaultValues {
    static byte b;
    static int i;
    static long l;
    static boolean bool;
    static String str;
    static Object obj;
    
    public static void main(String[] args) {
        System.out.println("byte: " + b);          // 0
        System.out.println("int: " + i);           // 0
        System.out.println("long: " + l);          // 0
        System.out.println("boolean: " + bool);    // false
        System.out.println("String: " + str);      // null
        System.out.println("Object: " + obj);      // null
    }
}
                
Вопрос 25
Что такое Class Variable?

Ответ: Class Variable (также известна как static variable) — это переменная, объявленная внутри класса с использованием static ключевого слова. Она принадлежит самому классу, а не отдельным объектам.

Характеристики Class Variable:
  • Объявляется с static ключевым словом внутри класса, но вне методов
  • Существует только одна копия, независимо от количества созданных объектов
  • Может быть доступна через имя класса без создания объекта
  • Инициализируется один раз при загрузке класса
Пример:

public class Counter {
    public static int count = 0;  // Class variable
    
    public Counter() {
        count++;  // Увеличивается для каждого нового объекта
    }
    
    public static void main(String[] args) {
        Counter obj1 = new Counter();
        Counter obj2 = new Counter();
        Counter obj3 = new Counter();
        
        System.out.println("Создано объектов: " + Counter.count);  // 3
        // Доступ через имя класса, а не через объект!
    }
}
                
Вопрос 26
Какое значение по умолчанию хранится в Local Variables?

Ответ: Local variables НЕ имеют значения по умолчанию. Примитивные переменные и объекты не получают никаких значений по умолчанию.

Важные пункты:
  • Local переменные должны быть инициализированы перед использованием
  • Использование неинициализированной local переменной приведёт к ошибке компиляции
  • В отличие от instance переменных, local переменные не получают автоматическое значение
Пример ошибки:

public class LocalVarExample {
    public static void main(String[] args) {
        int x;  // Local variable, нет значения по умолчанию
        
        // System.out.println(x);  // Ошибка компиляции!
        // "variable x might not have been initialized"
        
        x = 10;  // Теперь инициализирована
        System.out.println(x);  // OK, выводит 10
    }
}
                
Вопрос 27
Объясните разницу между instance variable и class variable

Ответ: Instance и class переменные — это два разных типа переменных в классе с различным назначением:

Instance Variable Class Variable
Объявляется без static ключевого слова Объявляется с static ключевым словом
Каждый объект получает свою копию Одна копия для всех объектов
Память выделяется при создании объекта Память выделяется один раз при загрузке класса
Доступ через объект: obj.variable Доступ через класс: ClassName.variable
Изменения в одном объекте не влияют на другие Изменения видны всем объектам
Пример:

public class Car {
    int speed;              // Instance variable
    static int totalCars;   // Class variable
    
    public Car() {
        totalCars++;
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car();
        car1.speed = 100;
        
        Car car2 = new Car();
        car2.speed = 120;
        
        // Instance variables разные для каждого объекта
        System.out.println("car1.speed: " + car1.speed);  // 100
        System.out.println("car2.speed: " + car2.speed);  // 120
        
        // Class variable одна на всех
        System.out.println("Всего машин: " + Car.totalCars);  // 2
    }
}
                
Вопрос 28
Что такое static variable?

Ответ: Static variable (static ключевое слово) используется для общего доступа к одной переменной или методу в данном классе. Static переменные — это переменные, которые один раз объявлены и одна копия переменной создаётся и общая для всех объектов.

Характеристики static variable:
  • Когда переменная объявлена как static, одна копия существует независимо от количества объектов
  • Static переменная инициализируется только один раз, при загрузке класса
  • Все объекты класса общают одну и ту же static переменную
  • Static переменные могут быть доступны непосредственно из класса
Пример:

public class Student {
    String name;           // Instance variable
    static int totalStudents; // Static variable
    
    public Student(String name) {
        this.name = name;
        totalStudents++;   // Увеличивается для каждого студента
    }
}

public class Main {
    public static void main(String[] args) {
        Student s1 = new Student("Alice");
        Student s2 = new Student("Bob");
        Student s3 = new Student("Charlie");
        
        System.out.println("Всего студентов: " + Student.totalStudents);  // 3
    }
}
                
Вопрос 29
Отличие между System.out, System.err и System.in

Ответ: System.out, System.err и System.in — это три стандартных потока ввода-вывода, предоставляемые Java:

Поток Тип Назначение Пример
System.out PrintStream Вывод стандартных сообщений на консоль System.out.println("Hello")
System.err PrintStream Вывод сообщений об ошибках System.err.println("Error")
System.in InputStream Чтение данных с клавиатуры Scanner sc = new Scanner(System.in)
Различия System.out и System.err:
  • System.out выводит в стандартный output консоли (обычно чёрный текст)
  • System.err выводит в стандартный error поток (обычно красный текст в IDE)
  • Оба используют PrintStream, но System.err используется для ошибок
  • Оба выводят на консоль, но могут быть перенаправлены отдельно
Пример использования System.in:

import java.util.Scanner;

public class InputExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.print("Введите число: ");
        int num = sc.nextInt();
        
        System.out.println("Вы ввели: " + num);
    }
}
                
Вопрос 30
Что вы понимаете под IO stream?

Ответ: IO (Input/Output) Stream в Java — это поток данных между программой и внешним источником или пунктом назначения, таким как файл, клавиатура, сеть или другая программа. Потоки предоставляют способ чтения данных из входного источника и записи данных в выходное назначение.

Типы IO Streams:
  • Input Streams: Используются для чтения данных из источника (файл, клавиатура, сеть)
  • Output Streams: Используются для написания данных в пункт назначения (файл, консоль, сеть)
Основные понятия:
  • Java предоставляет классы в пакете java.io для эффективной обработки операций ввода-вывода
  • Существуют byte streams (для бинарных данных) и character streams (для текстовых данных)
  • Все byte input streams наследуются от класса InputStream
  • Все byte output streams наследуются от класса OutputStream
Пример - чтение данных с файла:

import java.io.FileInputStream;
import java.io.IOException;

public class StreamExample {
    public static void main(String[] args) {
        try {
            // Создание input stream для чтения файла
            FileInputStream fis = new FileInputStream("file.txt");
            
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data);
            }
            
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
                
💡 Важно: Всегда закрывайте streams после использования, чтобы освободить ресурсы. Используйте try-with-resources или метод close().