От какого общего класса наследуются числовые классы-обертки в Java (Integer, Long, Double)?

Ответ

Все числовые классы-обертки (Integer, Long, Double, Float, Short, Byte) наследуются от абстрактного класса java.lang.Number.

Назначение класса Number: Он служит базовым типом для всех числовых оберток и предоставляет абстрактные методы для преобразования значения объекта в примитивные типы.

Сигнатура ключевых методов класса Number:

public abstract class Number {
    public abstract int intValue();
    public abstract long longValue();
    public abstract float floatValue();
    public abstract double doubleValue();
    public byte byteValue() { return (byte) intValue(); } // Реализация по умолчанию
    public short shortValue() { return (short) intValue(); } // Реализация по умолчанию
}

Практический пример использования полиморфизма с Number:

import java.util.ArrayList;
import java.util.List;

public class NumberExample {
    public static void main(String[] args) {
        // Коллекция может хранить разные числовые типы
        List<Number> numbers = new ArrayList<>();
        numbers.add(new Integer(10));   // Integer is-a Number
        numbers.add(new Double(3.14));  // Double is-a Number
        numbers.add(new Long(100L));    // Long is-a Number

        // Обход и преобразование к общему типу double
        double sum = 0.0;
        for (Number num : numbers) {
            sum += num.doubleValue(); // Используем метод из класса Number
        }
        System.out.println("Sum: " + sum); // Вывод: Sum: 113.14
    }
}

Важно: Класс Character и Boolean НЕ наследуются от Number, так как они не представляют числовые значения.

Ответ 18+ 🔞

Ну вот, смотри, классическая история про то, как в джаве пытаются навести хоть какой-то порядок в этом бардаке с числами. Представь себе: есть куча этих оберток — Integer, Long, Double и прочая шушера. И все они, как послушные дети, наследуются от одного папаши — абстрактного класса java.lang.Number.

А зачем он, этот Number, вообще нужен, спросишь ты? А затем, сука, чтобы был какой-то единый контракт, блядь! Он как бы говорит: «Все, кто от меня наследуется, обязуются уметь превращаться в примитивы». И предоставляет для этого абстрактные методы — типа «дай мне int», «дай мне double». Чистая формальность, но без неё — пиздец и анархия.

Вот смотри, как он выглядит изнутри, этот самый Number:

public abstract class Number {
    public abstract int intValue();
    public abstract long longValue();
    public abstract float floatValue();
    public abstract double doubleValue();
    public byte byteValue() { return (byte) intValue(); } // Реализация по умолчанию
    public short shortValue() { return (short) intValue(); } // Реализация по умолчанию
}

Видишь? Четыре абстрактных метода — intValue, longValue, floatValue, doubleValue. А byte и short уже по умолчанию через int реализованы, хитрожопые. Каждый конкретный класс-обертка (Integer, Long и т.д.) обязан эти методы реализовать, иначе компилятор его нахуй пошлёт.

А теперь самое вкусное — полиморфизм, ёпта! Благодаря тому, что все числовые обертки — дети Number, мы можем запихнуть их в одну коллекцию и работать с ними, как с одним типом. Смотри, какой красивый пиздец:

import java.util.ArrayList;
import java.util.List;

public class NumberExample {
    public static void main(String[] args) {
        // Коллекция может хранить разные числовые типы
        List<Number> numbers = new ArrayList<>();
        numbers.add(new Integer(10));   // Integer is-a Number
        numbers.add(new Double(3.14));  // Double is-a Number
        numbers.add(new Long(100L));    // Long is-a Number

        // Обход и преобразование к общему типу double
        double sum = 0.0;
        for (Number num : numbers) {
            sum += num.doubleValue(); // Используем метод из класса Number
        }
        System.out.println("Sum: " + sum); // Вывод: Sum: 113.14
    }
}

Вот это и есть магия! В один список пихаем и Integer, и Double, и Long. А потом в цикле у каждого вызываем doubleValue() — метод, который обещал нам папаша Number. И всё работает, блядь! Сумма считается, мир не рушится.

Важное замечание, чтобы не облажаться: Классы Character и Boolean — это, блядь, НЕ числа! Они от Number не наследуются, и правильно делают. Ну какой с хуя символ или булево значение — число? Никакое. Так что их туда не суй, а то получишь ClassCastException прямо в ебало.