前言:
之前看java虚拟机时,看到后面真的有些看不下去了。没办法,基础不行看的有些艰涩。现在打算直接刷题,错误题目记录,不惜代价打地基。
错题集:
第一题:
public class ThisTest {
public static void main(String args[]) {
String x= "7";
int a = 2;
int b =3;
System.out.println(a+b+x);
System.out.println(x+a+b);
System.out.println(x+(a+b));
}
}
答案:
题目分析:
这题考连接与算术,相信大家算术是可以的。但是也有肯多坑。 记住:从左到右执行的
(1)首先看a和b都是int类型,那么在遇到“+”号时,他们会先进行运算。
(2) 第二个x是字符串类型,字符串遇到“+”号时,会将后面的操作数(也就是我们自己定义的数字)转换成字符串类型。所以是三个字符串相连接编程723
(3)在看看第三个,第三个括号的优先级级更高,所以就算x是字符串,将后面也转换成字符串类型,但是在转换前,括号里的先执行进行运算了。所以结果是75
第二题:
package com.wen.demo.test.MyClass;
public class JavaFX {
public static void main(String[] args) {
int x= 1 ;
int y =2;
int z = 3;
y+=z--/++x;
System.out.println(y);
}
}
答案:
题目解析:
首先把,这个还是考优先级问题了。老套路只是多了个i++或者是++i这类。
一段代码:y+=z--/++x;可以理解为:2+(z--/++x) ,我们来看接下来(z--/++x)怎么变化。++x是在运算前加1(即在除之前x从1变成了2,),z--这个是运算后减1,所以在运算时还是3没有变化。这时计算可以理解为 2+(3/2)=3.5。那不对呀。答案是3.怎么回事?我们在看看类型,y是int类型,int是没有小数点后的,强转后则为3.
附:优先级表
第三题:
package com.wen.demo.test.MyClass;
public class JavaFX {
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
b=b++;
System.out.println(b+" ");
}
public static void main(String[] args) {
JavaFX a = new JavaFX();
a.test();
}
}
答案:
题目解析:
这题,被坑了。看的太快,没有看到++a,唉~!
(1)形参的变化是不影响实参的。这一点记住。当然,如果传入的是一个对象,传的是这个对象的引用的话,那么形参可能就会影响到实参了。
举个形参影响实参的栗子:(理解就差不多了)
package com.wen.demo.test.MyClass;
public class JavaFX {
//传形参改变实参例子
public void mytest(int[] in){
in[0]=20;
}
public static void main(String[] args) {
int[] in=new int[1];
in[0]=100;
a.mytest(in);//传对象引用
System.out.println(in[0]); //结果是20}
}
(2)回到本题目,我们执行了add(++a)这个方法,由于a是Byte引用类型,++a先是触发拆箱操作Byte.byteValue获得基本值是127,在此基础上+1,意味着传入方法时是(128)
标红色的128不是真正意义上128,因为Byte类型最大值是127,128是越界了。越界的情况下,a的值变成了-128。
(3)add(b)传的形参并不会影响实参,但是他用的是引用类型呀。对,在传入方法时先是触发拆箱操作Byte.byteValue获得基本值是127。所以值还是127没变,不管形参怎么变都不影响实参。
(4)b=b++; 这个就厉害了。完全没意义。这个是先赋值后在加,b赋值给了b,然后在+1,b还是原来的值,出这个完全是搞什么灰机,面试题经常会出这种骗人的东西。
总结:
今天就先补充一下这点。后面会持续记录错题集。