Java Number 类
最后修改时间:2025 年 4 月 13 日
java.lang.Number
类是 Java 中所有数值包装类的抽象超类。 它是处理不同数值类型(包括 Integer
、Double
、Float
、Long
、Short
和 Byte
)的基础。 了解 Number
类对于执行数值转换和使用原始值的面向对象表示至关重要。
Number
类提供了将数值转换为各种原始类型的方法。 这些方法由所有数值包装子类实现,确保无缝类型转换。 作为原始数值类型及其对象对应项之间的桥梁,Number
类简化了数值数据的操作,同时保持了灵活性。
Number 类的关键方法
Number
类定义了其子类必须实现的基本抽象方法。 这些方法通过返回数值的原始表示形式来促进类型转换。 主要方法包括
intValue
将数值转换为int
。doubleValue
将数值转换为double
。longValue
将数值转换为long
。floatValue
将数值转换为float
。
通过实现这些方法,数值包装类提供了处理不同数据类型的便捷方式,同时保留了面向对象的原则。
在实践中,Number
类对于编写通用的、灵活的代码至关重要,这些代码可以无缝处理各种数值类型,而无需提前了解特定的类型。 这使得它在需要多态性的场景中特别有价值,例如设计 API、集合或动态处理不同数值类型的实用程序方法。
例如,API 可能需要接受不同的数值输入 - 无论是 Integer
、Double
还是 Float
- 而无需强制执行严格的类型依赖性。 通过使用 Number
作为参数或返回类型,开发人员可以确保他们的代码保持适应性,能够支持多种数值类型而无需进行大量的类型检查逻辑。 这种方法增强了代码的可重用性和可扩展性,使其更容易扩展功能,同时保持强大的类型安全性。
此外,由于所有数值包装类都实现了 Number
中定义的转换方法,开发人员可以使用 intValue
、doubleValue
、longValue
和 floatValue
等方法轻松地在原始类型之间切换。 这允许在数学运算、计算和数据处理工作流程中进行平滑的类型转换,确保精度,同时遵守面向对象的设计原则。
总的来说,在通用编程中利用 Number
类可以培养模块化、可维护和高效的代码,帮助开发人员处理各种数值类型,而不会牺牲灵活性或性能。
基本 Number 用法
Number
类是抽象的,因此我们使用它的具体子类,如 Integer
或 Double
。 此示例演示了将 Number
引用与不同数值类型一起使用的基本用法。
package com.zetcode; public class Main { public static void main(String[] args) { Number num1 = Integer.valueOf(42); Number num2 = Double.valueOf(3.14); Number num3 = Float.valueOf(2.718f); System.out.println("Integer value: " + num1.intValue()); System.out.println("Double value: " + num2.doubleValue()); System.out.println("Float value: " + num3.floatValue()); // Using Number as a common type Number[] numbers = {num1, num2, num3}; for (Number num : numbers) { System.out.println("Number value: " + num.doubleValue()); } } }
在此示例中,我们创建对不同数值类型的 Number
引用。 然后,我们演示如何使用转换方法访问值。 Number
数组展示了如何将 Number
用作不同数值类的公共类型。
Number 转换
Number
类提供了在不同数值类型之间进行转换的方法。 此示例显示了数值类型之间的各种转换方案。
package com.zetcode; public class Main { public static void main(String[] args) { Number num = Double.valueOf(123.456); // Converting to different types int intVal = num.intValue(); long longVal = num.longValue(); float floatVal = num.floatValue(); double doubleVal = num.doubleValue(); System.out.println("int: " + intVal); System.out.println("long: " + longVal); System.out.println("float: " + floatVal); System.out.println("double: " + doubleVal); // Potential loss of precision Number bigNum = Double.valueOf(1.23e50); System.out.println("Big double as float: " + bigNum.floatValue()); } }
此示例演示了将 Double
Number
转换为各种原始类型。 请注意,转换可能会导致精度损失,尤其是在将大数转换为 float
时。 该示例显示了精确转换和有损转换。
Number 解析
虽然 Number
本身不提供解析方法,但其子类提供解析方法。 此示例演示了如何使用不同的数值类型将字符串解析为 Number
对象。
package com.zetcode; public class Main { public static void main(String[] args) { try { // Parsing different number types Number intNum = Integer.valueOf("42"); Number doubleNum = Double.valueOf("3.14159"); Number floatNum = Float.valueOf("2.71828"); System.out.println("Parsed Integer: " + intNum.intValue()); System.out.println("Parsed Double: " + doubleNum.doubleValue()); System.out.println("Parsed Float: " + floatNum.floatValue()); // Hexadecimal parsing Number hexNum = Integer.valueOf("FF", 16); System.out.println("Hexadecimal FF: " + hexNum.intValue()); } catch (NumberFormatException e) { System.out.println("Invalid number format: " + e.getMessage()); } } }
此示例演示了如何使用不同数值包装类的 valueOf
方法将字符串解析为 Number
对象。 它还显示了十六进制解析,并包括对无效数字格式的错误处理。
Number 比较
由于不同的数值类型,比较 Number
对象需要小心。 使用 Integer.valueOf(100)
、Double.valueOf(100.0)
或自动装箱(例如,Number num = 100
)来创建包装对象。 此示例演示了如何通过将 Number
对象转换为通用类型来正确比较它们。
package com.zetcode; public class Main { public static void main(String[] args) { Number num1 = Integer.valueOf(100); Number num2 = Double.valueOf(100.0); Number num3 = Float.valueOf(100.0f); // Comparing as doubles for precision System.out.println("num1 == num2: " + (num1.doubleValue() == num2.doubleValue())); System.out.println("num1 == num3: " + (num1.doubleValue() == num3.doubleValue())); // Comparing with epsilon for floating point double epsilon = 0.0001; Number floatNum = Float.valueOf(1.0f / 3.0f); Number doubleNum = Double.valueOf(1.0 / 3.0); System.out.println("Float vs Double exact: " + (floatNum.doubleValue() == doubleNum.doubleValue())); System.out.println("Float vs Double with epsilon: " + (Math.abs(floatNum.doubleValue() - doubleNum.doubleValue()) < epsilon)); } }
此示例演示了 Number
对象的正确比较技术。 它显示了转换为通用类型 (double
) 以进行比较,并使用 epsilon 进行浮点比较以解决类型之间的精度差异。
Number 算术
使用 Number
对象执行算术运算需要转换为原始类型。 此示例演示了如何使用不同的 Number
类型安全地执行算术运算。
package com.zetcode; public class Main { public static void main(String[] args) { Number num1 = Integer.valueOf(10); Number num2 = Double.valueOf(3.5); // Performing arithmetic by converting to appropriate types double sum = num1.doubleValue() + num2.doubleValue(); double product = num1.intValue() * num2.doubleValue(); double division = num1.doubleValue() / num2.doubleValue(); System.out.println("Sum: " + sum); System.out.println("Product: " + product); System.out.println("Division: " + division); // Handling different numeric types Number[] numbers = {Integer.valueOf(5), Double.valueOf(2.5), Float.valueOf(1.5f)}; double total = 0; for (Number num : numbers) { total += num.doubleValue(); } System.out.println("Total: " + total); } }
此示例演示了如何通过将 Number
对象转换为适当的原始类型来执行算术运算。 它演示了加法、乘法和除法,以及对混合 Number
类型的数组求和。
数字格式化
可以使用 NumberFormat
或 DecimalFormat
格式化 Number
对象以进行显示。 此示例演示了 Number
对象的不同格式化选项。
package com.zetcode; import java.text.NumberFormat; import java.text.DecimalFormat; import java.util.Locale; public class Main { public static void main(String[] args) { Number num = Double.valueOf(12345.6789); // Default locale formatting NumberFormat defaultFormat = NumberFormat.getInstance(); System.out.println("Default format: " + defaultFormat.format(num)); // Currency formatting NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(); System.out.println("Currency format: " + currencyFormat.format(num)); // Percentage formatting Number percentNum = Double.valueOf(0.85); NumberFormat percentFormat = NumberFormat.getPercentInstance(); System.out.println("Percent format: " + percentFormat.format(percentNum)); // Custom decimal formatting DecimalFormat decimalFormat = new DecimalFormat("#,##0.00"); System.out.println("Custom format: " + decimalFormat.format(num)); // Locale-specific formatting NumberFormat frenchFormat = NumberFormat.getInstance(Locale.FRANCE); System.out.println("French format: " + frenchFormat.format(num)); } }
此示例演示了格式化 Number
对象以进行显示的各种方法。 它显示了默认数字格式、货币格式、百分比格式、自定义十进制格式以及使用不同区域设置的特定于区域设置的格式。
Number 和集合
在处理混合数值类型的集合时,Number
类非常有用。 此示例演示了如何处理包含不同 Number
实现的集合。
package com.zetcode; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Number> numbers = new ArrayList<>(); numbers.add(Integer.valueOf(42)); numbers.add(Double.valueOf(3.14159)); numbers.add(Float.valueOf(2.71828f)); numbers.add(Long.valueOf(1000000000L)); // Processing mixed numbers double sum = 0; for (Number num : numbers) { sum += num.doubleValue(); System.out.println("Processing: " + num.getClass().getSimpleName() + " with value: " + num); } System.out.println("Total sum: " + sum); System.out.println("Average: " + (sum / numbers.size())); // Finding maximum value double max = Double.MIN_VALUE; for (Number num : numbers) { if (num.doubleValue() > max) { max = num.doubleValue(); } } System.out.println("Maximum value: " + max); } }
此示例演示了如何处理混合 Number
类型的集合。 它显示了如何处理每个数字,而不管其具体类型如何,计算总和和平均值,并通过转换为通用类型 (double
) 找到集合中的最大值。
来源
在本文中,我们通过实际示例介绍了 Java Number
类。 了解 Number
对于在 Java 集合和 API 中处理数值转换和混合数值类型至关重要。
作者
列出所有Java教程。