1.基本数据类型传递的是值,所以一方修改对另一方没有影响
public static void main(String[] args) {
        int a=1;
        int b=2;
        a=b;
        System.out.println(a);//2
        System.out.println(b);//2 b的值传递给了a
        b=3;
        System.out.println(a);//2
        System.out.println(b);//3 b值的修改对a没有影响
    }
2.引用数据类型传递的是地址值,所以一方修改对另一个方有影响
public class Test3 {
    public static void main(String[] args) {
        Try try1 = new Try("1");
        Try try2 = new Try("2");
        System.out.println(try1==try2);//false
        try1=try2;
        System.out.println(try1==try2);//true try2的地址赋给了try1
        System.out.println(try1.name);//2
        System.out.println(try2.name);//2  此时name值是同一个
        try2.name="3";
        System.out.println(try1==try2);//true
        System.out.println(try1.name);//3
        System.out.println(try2.name);//3  改变try2的name值,会对try1的值产生影响
    }
}
class Try {
    String name;
    public Try(String name) {
        this.name = name;
    }
}
3.十分特殊的String,String的特殊性来自于其创建方式的特殊性
3.1 String s1=“a”,这种创建方式,栈内存里面s1的名字,会指向常量池里的常量"a",而且"a"在常量池中只存一份
public static void main(String[] args) {
        String s1="a";
        String s2="a";
        System.out.println(s1==s2);//true 他们的都指向了常量池里面的同一个"a"
    }
3.2 String s1 =new String(“a”),这种创建方式,栈内存里面s1的名字,会先指向堆内存里的一个地址,然后该地址会指向常量池里的"a"
public static void main(String[] args) {
        String s1 = new String("a");
        String s2 = new String("a");
        System.out.println(s1==s2);//false 他们的地址不同
    }
3.3 String的+运算,只有完全都是常量的+运算会在常量池中进行,其余的情况都是在堆内存中进行
public static void main(String[] args) {
        String s1 = "a";
        String s2 = "b";
        String s3="ab";
        String s4="a"+"b";
        System.out.println(s3==s4);//true 都是常量在常量池中计算,s3和s4指向常量池中唯一的"ab"
        String s5="a"+s2;
        System.out.println(s3==s5);//false 此时计算是在堆内存中,s5先指向堆内存的一个地址,然后指向常量池中的"ab"
        String s6=s1+s2;
        System.out.println(s3==s6);//false 同s5
        System.out.println(s5==s6);//false s5和s6在堆内存中有不同的地址
    }