原始类型包装器

Posted

技术标签:

【中文标题】原始类型包装器【英文标题】:Primitive Type Wrappers 【发布时间】:2021-09-11 12:51:25 【问题描述】:

我目前正在阅读名为 Java 的完整参考书。第 18 章介绍了 Primitive Type Wrappers。

如本书第一部分所述,Java 使用原始类型,例如 int 和 char,出于性能原因。这些数据类型不是对象的一部分 等级制度。它们是按值传递给方法的,不能直接传递 引用。此外,两种方法无法引用相同的 int 的实例 有时,您需要为 这些原始类型之一。比如有集合类 在第 19 章中讨论的仅处理对象;将原始类型存储在 这些类之一,您需要将原始类型包装在一个类中。

作者在粗体字中的实际意思是什么? 两种方法无法引用同一个 int 实例。 如果有人用一个例子来解释这一行,那就太好了:) 提前谢谢你。

【问题讨论】:

“作者实际上是什么意思...” 这句话没有太大意义。你应该问作者。 你不确定的说法确实不清楚。如果不是该声明的作者,很难知道作者的意图是什么。 或者换一种说法……>我们 (我认为这是荒谬的。原始类型有值,而不是实例。实例意味着(比如说)数字有身份。他们没有。你无法区分(比如说)整数的副本1.) 【参考方案1】:

我对粗线的考虑可能是错误的,正如社区用户在 cmets 中提到的那样。但是,AFAIK,它试图说如果一个原始类型变量或原始类型的包装器被传递给两个方法,那么这两个方法都有不同的副本。我已经实现了一个示例来帮助您。

您可以尝试运行它并查看所有情况下的输出。在传递 int 或 Integer 的情况下,值的变化不会反映在另一个方法中。

请原谅我的骆驼套。

public class TestPrimitive


    public static void main(String[] args)
    
        int i = 15;
        Integer j = 20;
        StringBuffer str = new StringBuffer("Hello");
        XYZ obj = new XYZ(10);
        printIWithAddition(i);
        printIWithoutAddition(i);
        IntegerWrapperWithChange(j);
        IntegerWrapperWithoutChange(j);
        StringBufferWithChange(str);
        StringBufferWithoutChange(str);
        XYZWithChange(obj);
        XYZWithoutChange(obj);
    

    private static void printIWithAddition(int i) 
        i++;
        System.out.println(i);
    

    private static void printIWithoutAddition(int i) 
        System.out.println(i);
    

    private static void IntegerWrapperWithChange(Integer j) 
        j++;
        System.out.println(j);
    

    private static void IntegerWrapperWithoutChange(Integer j) 
        System.out.println(j);
    

    private static void StringBufferWithChange(StringBuffer str) 
        System.out.println(str.append(" World"));
    

    private static void StringBufferWithoutChange(StringBuffer str) 
        System.out.println(str);
    

    private static void XYZWithChange(XYZ obj) 
        obj.a = 20;
        System.out.println(obj);
    

    private static void XYZWithoutChange(XYZ obj) 
        System.out.println(obj);
    


class XYZ 

    int a;

    public int getA()
    
        return a;
    

    public void setA(int a)
    
        this.a = a;
    

    public XYZ(int a)
    
        this.a = a;
    

    @Override public String toString()
    
        return "XYZ" + "a=" + a + '';
    

【讨论】:

我猜你的回答非常适合作者提到的陈述。谢谢!

以上是关于原始类型包装器的主要内容,如果未能解决你的问题,请参考以下文章

将 Streams 与原始数据类型和相应的包装器一起使用

何时使用包装类和原始类型

Java数据类型包装器

ongl(原始类型和包装类型)

JavaScript - 原始值包装类型

JavaScript - 原始值包装类型