赋值运算符 =
= 用于赋值,将 = 右边的值赋给左边的变量
int prev = 0;
String str = "String";
基本类型赋值
基本类型赋值,传递的是值的副本
变量prev的值改变了,不影响prev1的值
int prev = 0;
int prev1 = prev;
prev++;
System.out.println( prev ); //输出1
System.out.println( prev1 ); //输出0
引用类型
引用类型赋值,传递的是对象引用的副本(地址)
user 变量和 user1 变量的值是相同的,也就是两个变量共同指向了同一个对象实例
user 变量和 user1 变量其中任意一个对其对象实例进行修改时,两个变量最后获取
的都是修改后的值
public class OperationTest {
private static int value = 0;
public static void main( String[] args ) {
User user = new User( );
user.setName( "user" );
user.setGender( "女" );
User user1 = user;
System.out.println( user == user1 );
System.out.println( "user:" + JSONUtil.toJsonStr( user ) );
System.out.println( "user1:" + JSONUtil.toJsonStr( user1 ) );
user1.setGender( "男" );
System.out.println( "user:" + JSONUtil.toJsonStr( user ) );
System.out.println( "user1:" + JSONUtil.toJsonStr( user1 ) );
// true
// user:{"name":"user","gender":"女"}
// user1:{"name":"user","gender":"女"}
// user:{"name":"user","gender":"男"}
// user1:{"name":"user","gender":"男"}
}
@Data
static class User {
private String name;
private String gender;
}
}
比较运算符 ==
==用于比较运算符两边的值
public static void main( String[] args ) {
int a = 1;
int b = 2;
System.out.println( a == b ); //false
int d;
int c = d = 5;
System.out.println( c == d ); //true
System.out.println( a == d ); //false
User user = new User( );
user.setName( "user" );
user.setGender( "女" );
User user1 = user;
User user2 = new User( );
user.setName( "user" );
user.setGender( "女" );
System.out.println( user == user1 ); //true
System.out.println( user == user2 ); //false
}
基本类型比较的是值是都相等
引用类型使用 == 比较的是引用是否相等,即比较指向对象的地址是否相等(是否指向同一个对象)
prev == (prev = get())
两次比较输出的是 true 还是 false?
public class OperationTest {
private static int value = 0;
public static void main( String[] args ) {
int prev = 0;
System.out.println(prev == (prev = get()) );
System.out.println(prev == (prev = get()) );
}
public static int get( ) {
return value++;
}
}
value是类的静态成员变量,get()方法每次调用时对value进行 + 1操作
main方法中定义了一个局部变量prev,赋值为0
prev == (prev = get()) 的运算顺序是:
- == 左边的操作数会先被求值(左边的prev)
- 接着,对 == 右边括号内的操作数求值( (prev = get()) )
- 先调用get()方法,获取返回值
- 将返回值赋值给prev
- prev更新为新的值
- 最后,是旧的值与新的值比较
所以,代码中的逻辑是:
第一个System.out.println(prev == (prev = get()) )
- == 左边,prev 的值是 0
- == 右边,get() 的返回值是0,最终右边的 prev 值也是0
- 最后:0 == 0,为true
- 第一个打印结束后,value 的值是1,prev 的值是0
第二个System.out.println(prev == (prev = get()) )
- == 左边,prev 的值是0
- == 右边,get() 的返回值是1,最终右边的 prev 值也是1
- 最后:0 == 1,为false
- 第二个打印结束后,value 的值是2,prev 的值是1
value++ :先用后加,get()方法获取到的是原始的value值,之后才是对value值进行+1操作