liujijiang

java 学习笔记 --3-- 操作符

2020.03.23

在最低层java中的数据是通过使用操作符操作的


赋值

基本类型的赋值

对基本类型的赋值就是对数值的复制
如果a,b为基本类型
a=b 就是把b的值复制一份给a 所以a和b的操作互不影响

对象的赋值

package com.company;


public class Main {


    public static void main(String[] args) {
	// write your code here

        Test test1 = new Test("test1");
        Test test3 = new Test("test1");

        test3 = test1;

        test3.a = "test3";

        System.out.println(test1.a);
        System.out.println(test3.a);
    }
}
class Test {

    public String a ;

    public Test(String a){
        this.a = a;
    }
}

对象的赋值是将引用从一个地方复制到另一个地方
new Test 的时候在堆中生成一个对象
然后其实是把这个对象的引用复制给 test1
然后把test1 的引用也就是这个对象复制给test3
所以 这时test1 test3 其实指向的是同一个对象,就是堆中的那个对象
然后改变test3 就是改变堆中的那个对象,所有的这个对象的引用也就随之改变了,这是跟基本类型的赋值是不一样的

其实赋值产生区别的原因就是 基础类型的大小是固定的,对基础类型的赋值是在堆栈中产生一个新的值, 在new一个对象的时候是在堆中的,然后 后面的赋值都是对其的引用 就是指向堆中的这个对象

当堆中的一个对象 没有任何的引用的时候 他就会被垃圾回收器自动清理

自增 自减 运算符

package com.company;


public class Main {


    public static void main(String[] args) {
	// write your code here

        int a =1;
        System.out.println(a++);
        a=1;
        System.out.println(++a);
    }
}

返回结果 是 1 和 2
前缀式和后缀式的区别:
前缀 先运算,再生成值
后缀 先生成值,后运算

关系运算符

package com.company;


public class Main {


    public static void main(String[] args) {
	// write your code here

        Integer n1 = new Integer(12);
        Integer n2 = new Integer(12);

        System.out.println(n1 == n2);
        System.out.println(n1 != n2);
    }
}


输出的结果 false 和 true
n1 和 n2 的引用是不相等的 即使他们的值是相等的
== 和 != 是对引用的判断
在堆中new 出两个值相等的对象 然后两个引用指向两个对象
由于基本类型是直接复制,所以==和!=可以判断基本类型的值
而包装类或者String如果想要比较值的话可以使用.equals()方法

package com.company;


public class Main {


    public static void main(String[] args) {
	// write your code here

        Integer n1 = new Integer(12);
        Integer n2 = new Integer(12);

        System.out.println(n1.equals(n2));
    }
}


输出结果为true

三元运算符

package com.company;


public class Main {


    public static void main(String[] args) {
	// write your code here

        System.out.println(1<2 ? "true1" : "false1" );
    }
}

输出 true1

常见错误

java中while不会将整数转换为布尔值
所以while(1) 在编译时候回报错

截尾和舍入

将float和double装换为int时,其实是舍去小数点后面的数
如果想要舍入 可以使用Math().round()方法

package com.company;


public class Main {


    public static void main(String[] args) {
	// write your code here

        int a = Integer.MAX_VALUE;
        System.out.println(a);
        System.out.println(a *= 20);
    }
}


结果是一个10位数 和 -20
出现溢出情况而且编译器也不会报错
char short byte 都是比int小的类型 在使用时会自动装换为int,类型提升
窄化转换:例如将double装换为int 会出现数据丢失的情况