Java笔试题学习之02

版权声明:欢迎转载,期待指正 https://blog.csdn.net/fighting_sxw/article/details/89737899
public class TestAB {
    public void add(Byte b){
        b=b++;  
    }
    public void test(){
        Byte a=127;
        Byte b=127;
        add(++a);
        System.out.println(a+" ");
        add(b);
        System.out.println(b+"");
    }

    public static void main(String[] args) {
        new TestAB().test();
    }
}

输出结果为:
-128
127

对应字节码文件如下:

public class TestAB {
    public TestAB() {
    }

    public void add(Byte b) {
        (byte)(b + 1);
    }

    public void test() {
        Byte a = 127;
        Byte b = 127;
        this.add(a = (byte)(a + 1));
        System.out.println(a + " ");
        this.add(b);
        System.out.println(b + "");
    }

    public static void main(String[] args) {
        (new TestAB()).test();
    }
}

分析:
关键点:Byte是引用类型,传递的是引用

首先 add方法中 b=b++ 是先赋值,再做加运算,所以b的值不变,因为加运算的结果没有被赋值

add方法的字节码如下:

public void add(Byte b) {
        (byte)(b + 1);
    }

可以看到 add方法中只进行了+1运行,但是并没有赋值运算

test方法中的++a语句 对应的字节码如下:
a = (byte)(a + 1) 可以看到 a+1 的值 重新赋给了a
但是Byte类型最大为127,+1后出现溢出,所以 a是-128
再调用add方法后,根据上面的分析 a的值不会变化,所以输出a的值为-128

b的值为127,因为add方法不会改变b的值

ps:从大佬的抖音直接搬运过来,抖音号:Todaystart,不妥之处,还望指正!

猜你喜欢

转载自blog.csdn.net/fighting_sxw/article/details/89737899