我目前正在读一本名为Java的完整参考的书。第18章介绍了基元类型包装器。
正如本书第一部分所提到的,出于性能原因,Java使用基本类型,如int和char。这些数据类型不是对象层次结构的一部分。它们通过值传递给方法,不能直接通过引用传递。另外,有时两个方法无法引用同一个int实例,您需要为这些基元类型之一创建对象表示。例如,第19章讨论的集合类只处理对象;若要在这些类中的一个中存储基元类型,需要在类中包装基元类型。
作者在黑体字中给出的行实际上是什么意思?两个方法无法引用int的同一个实例。如果有人用一个例子来解释这行,那就太好了:)提前谢谢你。
我对粗体行的考虑可能是错误的,社区用户在评论中也提到了这一点。但是,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/)