Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不能将整数强制转换为字符串?_Java_String_Int - Fatal编程技术网

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

这是我在Java中从未真正理解过的东西。假设我有:

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)
这样的函数更为重要