补补基础——小小考题(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41622183/article/details/81532978

前言:

       之前看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还是原来的值,出这个完全是搞什么灰机,面试题经常会出这种骗人的东西。

总结:

         今天就先补充一下这点。后面会持续记录错题集。

程序人生,与君共勉~!

猜你喜欢

转载自blog.csdn.net/weixin_41622183/article/details/81532978