Java 为什么不能将整数强制转换为字符串?
这是我在Java中从未真正理解过的东西。假设我有:Java 为什么不能将整数强制转换为字符串?,java,string,int,Java,String,Int,这是我在Java中从未真正理解过的东西。假设我有: int x = 4; 现在我不能这样做 需要字符串(x)的函数或需要字符串((字符串)x)的函数 现在我无法传递需要字符串变量x的函数。我也无法将它从int转换为字符串。通常的做法是: Integer.toString(x)或String.valueOf(x) 现在为什么我可以这样做呢 需要字符串(“+x)”的函数 这与将整数转换为字符串有何不同?将int转换为字符串在Java中是不可能的。在表达式中: functionThatRequire
int x = 4;
现在我不能这样做
需要字符串(x)的函数
或需要字符串((字符串)x)的函数
现在我无法传递需要字符串变量x
的函数。我也无法将它从int转换为字符串。通常的做法是:
Integer.toString(x)
或String.valueOf(x)
现在为什么我可以这样做呢
需要字符串(“+x)”的函数
这与将整数转换为字符串有何不同?将int转换为字符串在Java中是不可能的。在表达式中:
functionThatRequiresString(""+x)
没有强制转换,只需调用+运算符,如果其中一个参数是字符串,它将返回字符串。在Java中,将int强制转换为字符串是不可能的。在表达式中:
functionThatRequiresString(""+x)
没有强制转换,所发生的是调用+运算符,如果其中一个参数是字符串,该运算符将返回字符串。强制转换具有特定含义,即更改引用的类型,但决不更改被引用对象的类型或内容
“”+x
有一个只与字符串相关的特定用例。您不能以这种方式转换为任何其他数据类型
Java没有从一种类型的对象“转换”到另一种类型的概念。转换有一个特定的含义,即更改引用的类型,但决不更改被引用对象的类型或内容
“”+x
有一个只与字符串相关的特定用例。您不能以这种方式转换为任何其他数据类型
Java没有从一种类型的对象“转换”到另一种类型的概念。简单的回答是,您不能将int
转换为String
,因为String
不是int
的父类或子类。强制转换是关于如何在不同的相关类中查看对象
我想,你真正想问的是,为什么Java不能自动地在不同类型之间转换
答案和您不能执行要求字符串(x)
的函数的原因是因为Java是,并且坚持要将正确的值类型传递给方法。这样做的好处是,当您将错误的类型传递给函数时,不会出现难以发现的bug,但它会被静默地转换为正确的类型,因此您可以编译代码,但在运行时会表现得非常奇怪。正如您所看到的,缺点是当您确实想要执行转换时,它不太方便
之所以可以做像“+x
这样的事情,是因为这是一个非常常见的操作,编译器会为您处理所有转换。当您在这里显式创建字符串时,可以安全地进行转换。简单的回答是,您不能将int
强制转换为字符串,因为String
不是int
的父类或子类。强制转换是关于如何在不同的相关类中查看对象
我想,你真正想问的是,为什么Java不能自动地在不同类型之间转换
答案和您不能执行要求字符串(x)
的函数的原因是因为Java是,并且坚持要将正确的值类型传递给方法。这样做的好处是,当您将错误的类型传递给函数时,不会出现难以发现的bug,但它会被静默地转换为正确的类型,因此您可以编译代码,但在运行时会表现得非常奇怪。正如您所看到的,缺点是当您确实想要执行转换时,它不太方便
之所以可以做像“+x
这样的事情,是因为这是一个非常常见的操作,编译器会为您处理所有转换。当您在此处显式创建字符串时,可以安全地进行转换。强制转换意味着您告诉编译器“我这里有一个a类型的对象,但我希望您将其视为B类型。不要给出错误,因为它在您看来不像B”
强制转换不会进行任何转换(至少对于非基元类型不会)。如果在运行程序时,对象确实不是类型B,则会得到一个ClassCastException
您不能将int
强制转换为字符串,因为int
根本不是字符串
——您可以让编译器假装它是,但运行程序时会得到ClassCastException
您给出的其他示例将将int
转换为字符串转换表示您告诉编译器“我这里有一个类型为a的对象,但我希望您将其视为类型B。不要给出错误,因为它看起来不像B”
强制转换不会进行任何转换(至少对于非基元类型不会)。如果在运行程序时,对象确实不是类型B,则会得到一个ClassCastException
您不能将int
强制转换为字符串,因为int
根本不是字符串
——您可以让编译器假装它是,但运行程序时会得到ClassCastException
您给出的其他示例将将int
转换为字符串仅为了完整性,我们可以查看编译的字节码:
int i = 1;
String s1 = "" + i;
String s2 = Integer.toString(i);
使用JDK1.5.0_16(我知道很古老,但我认为较新的JDK不会有什么不同),将编译为:
0: iconst_1
1: istore_1
2: new #2; //class java/lang/StringBuilder
5: dup
6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
9: ldc #4; //String
11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: iload_1
15: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
21: astore_2
22: iload_1
23: invokestatic #8; //Method java/lang/Integer.toString:(I)Ljava/lang/String;
26: astore_3
(它创建一个新对象并调用append(String)
,然后调用StringBuilder
的append(int)
方法,然后将其转换为字符串
因此,像Integer.toString(int)
这样的函数更为重要