我刚刚开始学习Java中的Basics,并且正在测试通过连接原始变量来初始化字符串变量。
public class Main{
public static void main(String[] args){
byte lbyte = 3;
short lshort = 1;
int lint = 1;
long llong = 0;
float lfloat = 2.0f;
double ldouble = lfloat;
char lchar = 'H';
boolean lbool = true;
String lstring = " w0r1d ";
String lOutput = lchar+lbyte+lshort+lint+llong+lstring+ldouble+' '+lbool;
System.out.println(lOutput);
}
}
在这段代码中,我的目标是创建一个输出字符串:
H3110 w0r1d 2.0 true
然而,当我运行它时输出为:77 w0r1d 2.0 true
意外的结果是77,其余的都很好。即使我假设数字变量会被添加,它也只会是5个。变量lchar也显然是"吸收"进入数字。
77来自哪里以及l在l中发生了什么?
编辑:目标是在连接中使用尽可能多的原始变量。
Edit2:感谢所有有用的答案。
答案 0 :(得分:3)
'H'
的ASCII / Unicode值为72.从左到右处理添加内容,因此lchar + lbyte
为'H' + (byte) 3
,等于72 + 3
。
如果其中一个操作数是字符串,则只能从+
获得字符串结果。直到最后连接lstring
才会发生这种情况,这解释了为什么所有数字(和char
)变量被加在一起得到77. lstring
右边的所有内容都是逐个连接,每个转换为一个字符串,因为所有+
s的左手操作数都是该点的字符串。
快速解决方法是从""
开始强制用字符串完成所有操作。
String lOutput = ""+lchar+lbyte+lshort+lint+llong+lstring+ldouble+' '+lbool;
答案 1 :(得分:3)
77来自你添加字符时。添加字符时,它会添加它们的值,因为它们的行为类似于整数。另外,数字的其他变量可能已加在一起。 ' H' java中72 = 72 + 3 = 75和75 + 1 = 76,最后76 + 1 = 77。
要解决此问题,您可以将""在你构建字符串的开头。
修正:
myFacebookLoginButton.setFragment(this); //Assuming you're in a Fragment class
答案 2 :(得分:2)
Java从左到右评估表达式,所以发生的事情是你告诉Java将char和byte一起添加,然后Java将获取字符的整数值(72)并添加整数值字节(3)到它。
所以你真正告诉Java的是:
String lOutput = (72+3+1+1+0)+" w0r1d"+2.0+' '+true;
当Java来到+" w0r1d"
时,它会将第一部分转换为String并将它们连接起来,但在此之前你要添加+
被定义为添加的类型,因此Java会将它们相加到77岁。
要获得所需的行为,您需要从String开始,因此这样做将按您的要求运行:
String lOutput = String.valueOf(lchar)+lbyte+lshort+lint+llong+lstring+ldouble+' '+lbool;
答案 3 :(得分:0)
这是自动类型转换。在ASCI图表中,大写'H'的整数表示为72.首先,'H'从int
升级为char
,然后它与string
权利相连接