当前位置: 首页 > 知识库问答 >
问题:

基元类型包装

梁丘弘
2023-03-14

我目前正在读一本名为Java的完整参考的书。第18章介绍了基元类型包装器。

正如本书第一部分所提到的,出于性能原因,Java使用基本类型,如int和char。这些数据类型不是对象层次结构的一部分。它们通过值传递给方法,不能直接通过引用传递。另外,有时两个方法无法引用同一个int实例,您需要为这些基元类型之一创建对象表示。例如,第19章讨论的集合类只处理对象;若要在这些类中的一个中存储基元类型,需要在类中包装基元类型。

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

共有1个答案

詹唯
2023-03-14

我对粗体行的考虑可能是错误的,社区用户在评论中也提到了这一点。但是,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 + '}';
    }
}
 类似资料:
  • 我有以下简单的测试用例 结果是: 2 1 我不明白,为什么使一个大小的列表,元素是char[]。

  • 为了便于操作基本类型值,JavaScript 还提供了3个特殊的引用类型:Boolean、Number 和 String。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。来看下面的例子。 var s1 = "some text"; var s2 = s1.substring(2); 这个例子中的变量 s1 包含一个字符串,

  • 为了便于操作基本类型值,ECMAScript 还提供了3 个特殊的引用类型:Boolean、Number 和String。这些类型与本章介绍的其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。来看下面的例子。 var s1 = "some text"; var s2

  • 基本包装类型 基本包装类型包括:Number、Boolean、String。 每当 读取(访问)基本类型值时,后台就会创建一个 对应的基本包装类型的对象。从而让我们能调用一些方法来操作这个数据。 注:后台自动创建的基本包装类型的生命周期只存在于 执行 这行代码 的瞬间。 var s1 = "hellow javaScript"; var s2 = s1.substring(2); 这个例子中,

  • 如果按照“字节”->“短”->“int”->“长”->“浮点”->“双倍”的自动转换,那么输出应该打印“双倍”,对吗? (https://www.geeksforgeeks.org/type-conversion-java-examples/)