← Назад к вопросам

Можно ли создать объект класса Number напрямую?

2.0 Middle🔥 141 комментариев
#Docker, Kubernetes и DevOps#JVM и управление памятью#ORM и Hibernate

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Класс Number и прямое создание объектов

Нет, вы не можете создать объект класса Number напрямую. Number — это абстрактный класс, и попытка инстанцировать его приведёт к ошибке компиляции.

Попытка создания (не работает)

// ❌ Ошибка компиляции!
Number num = new Number();  // COMPILE ERROR!
// "Number is abstract; cannot be instantiated"

Компилятор отказывает потому, что Number объявлен как abstract:

public abstract class Number implements Serializable {
    // ...
}

Почему Number абстрактный

Number служит базовым классом для всех числовых типов в Java:

Number (abstract)
├── Byte
├── Short
├── Integer
├── Long
├── Float
├── Double
├── BigDecimal
├── BigInteger
└── AtomicInteger, AtomicLong, ...

Каждый подкласс Number предоставляет специфичную реализацию методов:

public abstract class Number implements Serializable {
    // Абстрактные методы
    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

Способ 1: Используй конкретные подклассы

// ✅ Правильно
Number num1 = new Integer(42);
Number num2 = new Double(3.14);
Number num3 = new Long(1000L);
Number num4 = new BigDecimal("99.99");

System.out.println(num1.intValue());      // 42
System.out.println(num2.doubleValue());   // 3.14
System.out.println(num3.longValue());     // 1000
System.out.println(num4.doubleValue());   // 99.99

Способ 2: Автоупаковка (Boxing)

// ✅ Правильно
Number num1 = 42;          // Integer (автоупаковка)
Number num2 = 3.14;        // Double (автоупаковка)
Number num3 = 100L;        // Long (автоупаковка)

System.out.println(num1.intValue());      // 42
System.out.println(num2.doubleValue());   // 3.14

Полиморфизм с Number

Вот где Number полезен — для работы с разными числовыми типами через один интерфейс:

public class MathHelper {
    // Метод принимает любой подкласс Number
    public static double sum(Number... numbers) {
        double total = 0;
        for (Number num : numbers) {
            total += num.doubleValue();  // Все подклассы реализуют doubleValue()
        }
        return total;
    }
}

// Использование
public class Main {
    public static void main(String[] args) {
        double result = MathHelper.sum(
            new Integer(10),
            new Double(5.5),
            new Long(100),
            new BigDecimal("2.99")
        );
        
        System.out.println(result);  // 118.49
    }
}

Преобразования между типами Number

public class NumberConversions {
    public static void main(String[] args) {
        // Преобразование через doubleValue()
        Integer intNum = 42;
        Number num = intNum;
        
        int i = num.intValue();        // 42
        long l = num.longValue();      // 42
        float f = num.floatValue();    // 42.0
        double d = num.doubleValue();  // 42.0
        
        // ❌ Прямое приведение типа опасно
        if (num instanceof Integer) {
            Integer original = (Integer) num;  // ✅ Безопасно
        }
    }
}

Практический пример: обработка различных чисел

public class Calculator {
    public static void processNumbers(List<Number> numbers) {
        for (Number num : numbers) {
            // Работаем с Number, не зная точного типа
            double value = num.doubleValue();
            
            // Но можем проверить тип если нужна специфичная обработка
            if (num instanceof BigDecimal) {
                System.out.println("Точное значение: " + num);
            } else if (num instanceof Integer) {
                System.out.println("Целое число: " + num);
            } else if (num instanceof Double) {
                System.out.println("С плавающей точкой: " + num);
            }
        }
    }
}

// Использование
List<Number> numbers = Arrays.asList(
    42,
    3.14,
    1000L,
    new BigDecimal("99.99")
);

Calculator.processNumbers(numbers);

Зачем Number абстрактный?

  1. Требует реализации методов — каждый подкласс должен определить, как конвертировать его значение в int, long, float, double

  2. Предотвращает неполную реализацию — если бы можно было создать Number() прямо, то это был бы объект без чёткого числового значения

  3. Семантическая ясность — Number — это контракт, а не конкретный объект

Иерархия и реализация

// Integer реализует Number
public final class Integer extends Number implements Comparable<Integer> {
    private final int value;
    
    public Integer(int value) {
        this.value = value;
    }
    
    @Override
    public int intValue() {          return value; }
    
    @Override
    public long longValue() {        return (long) value; }
    
    @Override
    public float floatValue() {      return (float) value; }
    
    @Override
    public double doubleValue() {    return (double) value; }
}

// Double реализует Number по-другому
public final class Double extends Number implements Comparable<Double> {
    private final double value;
    
    public Double(double value) {
        this.value = value;
    }
    
    @Override
    public int intValue() {          return (int) value; }
    
    @Override
    public long longValue() {        return (long) value; }
    
    @Override
    public float floatValue() {      return (float) value; }
    
    @Override
    public double doubleValue() {    return value; }
}

Частая ошибка в коде

// ❌ Проблема: забыли что Number абстрактный
public class DataProcessor {
    public Number parseNumber(String input) {
        try {
            return new Number();  // COMPILE ERROR!
        } catch (Exception e) {
            return null;
        }
    }
}

// ✅ Правильно: выбираем конкретный тип
public class DataProcessor {
    public Number parseNumber(String input) {
        try {
            if (input.contains(".")) {
                return Double.parseDouble(input);
            } else {
                return Integer.parseInt(input);
            }
        } catch (NumberFormatException e) {
            return null;
        }
    }
}

Вывод

  • Нельзя создать Number напрямую — это абстрактный класс
  • Используй подклассы (Integer, Double, BigDecimal и т.д.)
  • Полиморфизм — Number как тип ссылки для разных чисел
  • Методы преобразования — intValue(), doubleValue(), etc.
  • instanceof для безопасных приведений типов