java这段代码为什么输出结果是s=hello a=hello false false
答案:5 悬赏:50 手机版
解决时间 2021-11-18 00:44
- 提问者网友:皆是孤独
- 2021-11-17 01:59
java这段代码为什么输出结果是s=hello a=hello false false
最佳答案
- 五星知识达人网友:迟山
- 2021-11-17 03:37
s本身是"hello"
a是 "he" + "llo",所以也是hello
s==a是false,因为两个都是对象,虽然字符相同,但内存地址不同,所以输出false。字符串若比较字符的话要用equals追问为什么iEnd是char类型程序却没有报错??还有iEnd=2的话最后的a为什么是等于hell??追答char和int是可以互相转换的,都是值类型
substring(beginIndex,length)
iEnd指定截取长度,"llo"截取2的的长度就是ll
所以是hell追问为什么字符串变量==比较的是内存地址,int型变量比较的却不是内存地址??追答字符串是引用类型
char和int是值类型
使用"=="时,如果是引用类型则比较内存抵制,如果是值类型则直接比较数值追问最后一个问题哈 什么时候char类型可以自动转换为int类型?比如本例substring(int,int)为什么没有报错说参数错误char应该为int型??追答java和c里,char和int是按ascii码来转换的,相对于char,int是更底层的,可以理解成char继承于int,因此char在需要时将自动转化为int,int也可以转化为char,不过这时需要用强制转换
substring第二个参数要求是int,输入为char时,因为char继承于int,会自动将char转换为int
举个例子,把一个特有行为比做一个方法——思考(人),而你是一个男人,男人是人的一种,在执行思考时,就自动把男人转化为人来执行这个方法了
a是 "he" + "llo",所以也是hello
s==a是false,因为两个都是对象,虽然字符相同,但内存地址不同,所以输出false。字符串若比较字符的话要用equals追问为什么iEnd是char类型程序却没有报错??还有iEnd=2的话最后的a为什么是等于hell??追答char和int是可以互相转换的,都是值类型
substring(beginIndex,length)
iEnd指定截取长度,"llo"截取2的的长度就是ll
所以是hell追问为什么字符串变量==比较的是内存地址,int型变量比较的却不是内存地址??追答字符串是引用类型
char和int是值类型
使用"=="时,如果是引用类型则比较内存抵制,如果是值类型则直接比较数值追问最后一个问题哈 什么时候char类型可以自动转换为int类型?比如本例substring(int,int)为什么没有报错说参数错误char应该为int型??追答java和c里,char和int是按ascii码来转换的,相对于char,int是更底层的,可以理解成char继承于int,因此char在需要时将自动转化为int,int也可以转化为char,不过这时需要用强制转换
substring第二个参数要求是int,输入为char时,因为char继承于int,会自动将char转换为int
举个例子,把一个特有行为比做一个方法——思考(人),而你是一个男人,男人是人的一种,在执行思考时,就自动把男人转化为人来执行这个方法了
全部回答
- 1楼网友:渊鱼
- 2021-11-17 07:44
字符串标比较不能用==,要用 s.equals(a)追问晕 我没报错 我是问结果为什么是那样的
- 2楼网友:野味小生
- 2021-11-17 06:53
引用和引用的指是不一样的。s和a本身都只是引用
- 3楼网友:由着我着迷
- 2021-11-17 05:23
首先,来分析 a=a+b.substring(iBeg,iEnd);
虽然,iEnd是char类型的,但是传到substring方法后它会转成整型值为3.
b.substring(iBeg,iEnd) 返回的是b自己的引用 (因为开始到结束位置形成的字符串跟自己相同,具体可见substring的source code). 值依旧为"llo"
而执行到 a=a+b.substring(iBeg,iEnd);
a+b.substring(iBeg,iEnd) 会创建一个新的String对象,而a会引用这个新的对象,且值为"hello".
所以,虽然,s和a的值都是"hello", 但是引用是不同的,所以s==a 会返回false.
虽然,iEnd是char类型的,但是传到substring方法后它会转成整型值为3.
b.substring(iBeg,iEnd) 返回的是b自己的引用 (因为开始到结束位置形成的字符串跟自己相同,具体可见substring的source code). 值依旧为"llo"
而执行到 a=a+b.substring(iBeg,iEnd);
a+b.substring(iBeg,iEnd) 会创建一个新的String对象,而a会引用这个新的对象,且值为"hello".
所以,虽然,s和a的值都是"hello", 但是引用是不同的,所以s==a 会返回false.
- 4楼网友:执傲
- 2021-11-17 04:42
对象不同,s、a、b只是一种指向对象的变量,即存的是对象所处内存的地址值
用== 比较,只是比较的地址值,因为对象不同,所以地址不同,所以a==s会输出FALSE,
如果改为s.equals(a),就是比较对象里的内容,这样才会输出true追问那int型变量用“==”就不是比较地址了?为什么??为什么iEnd是char类型程序却没有报错??还有iEnd=2的话最后的a为什么是等于hell??追答你要明白堆栈的这个东西,一般的变量是存在栈里的,像int、float、double等类型,还有就是对象这个类型了,在生成对象类型时会在堆里面创建一个空间,在这里面存储对象的内容,而栈里会保存对象的地址,就是s、a之类的,所以int类型可以直接==比较
用== 比较,只是比较的地址值,因为对象不同,所以地址不同,所以a==s会输出FALSE,
如果改为s.equals(a),就是比较对象里的内容,这样才会输出true追问那int型变量用“==”就不是比较地址了?为什么??为什么iEnd是char类型程序却没有报错??还有iEnd=2的话最后的a为什么是等于hell??追答你要明白堆栈的这个东西,一般的变量是存在栈里的,像int、float、double等类型,还有就是对象这个类型了,在生成对象类型时会在堆里面创建一个空间,在这里面存储对象的内容,而栈里会保存对象的地址,就是s、a之类的,所以int类型可以直接==比较
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯