1. class Tank{
    2. int leael;
    3. }
    4. public class Assignment{
    5. public static void main(String[] args){
    6. Tank t1 = new Tank();
    7. Tank t2 = new Tank();
    8. t1.level = 9;
    9. t2.level = 27;
    10. print(t1.level + t2.level);
    11. t1 = t2;
    12. print(t1.level + t2.level);
    13. t1.level = 80;
    14. print(t1.level + t2.level);
    15. t1 = new Tank();
    16. print(t1.level + t2.level);
    17. }
    18. }
    19. /* output
    20. 1:9 27
    21. 2:27 27
    22. 3:80 80
    23. 4:0 80
    24. */

    之所以出现以上输出结果其原理图如下:
    屏幕截图 2021-03-19 180051.png
    原因就在于赋值操作的是一个对象的引用,即将t2的引用copy了一份给t1,当t1没有受到引用改变(例如t1=new Tank()重新分配内存),两份引用指向的是同一个内存地址,可以通过任意一个引用来操作此时的对象。当t1的引用受到改变后,引用指向的内存地址就此更改,但t2的引用仍然指向原来的内存地址。和此类似的方法别名问题也是这个原因。

    1. public static class Letter{
    2. char c;
    3. }
    4. public static class Change{
    5. static void change(Letter l){
    6. l.c = 'y';
    7. }
    8. }
    9. public static class Change1{
    10. static void change(Letter l){
    11. l = new Letter();
    12. l.c = 'x';
    13. }
    14. }
    15. public static void main(String[] args) {
    16. Letter letter1 = new Letter();
    17. letter1.c = 'a';
    18. Change.change(letter1);
    19. System.out.println(letter1.c);
    20. Change.change1(letter1);
    21. System.out.println(letter1.c);
    22. }
    23. /*output
    24. 1:y
    25. 2:x
    26. */