Ответ
Все числовые классы-обертки (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 прямо в ебало.