Java传参,传的是什么?

java传参,传的既不是引用也不是内容

经典案例

public class JavaTest {
    public static void main(String[] args) {
        String mes = "Hello";
        transf(mes);
        System.out.println(mes);

    }
    private static void transf(String mes){
        mes = mes +"world";//这里就相当于new 一个新的String
    }
}
输出结果:
Hello

这是为什么呢?

  • 在main方法中,mes = "Hello"在栈中存入一个引用,堆中开辟一个内存
  • 当调用transf(mes)方法时候,mes会复制一个引用的副本传进方法内
  • 在方法内部,对 mes = mes +"world"则改变了mes副本的引用地址,所以内部mes是改变了的
  • 但当main函数中 transf(mes),mes出栈的时候,mes仍是原有的引用,并没有改变,所以输出的还是原有的值: Hello

equals&==

  • 对象的 : == :判断的是对象的引用是够相等,即存在栈中的引用位置
  • Object :equals :最底层的equals实现是直接判断引用是否相等
  • String:==:判断的是对象的引用是够相等,即存在栈中的引用位置
  • String :equals :重写了Object的equals方法,判断内容是否相等
  • 8大基本类型 :equals :都重写了Object的equals方法,判断内容是否相等
  • 自定义对象:equals :未重写equals方法的,都是判断引用相等,不能用==
    (java基本类型 才有操作符重载)

例如:byte、long,int,double等,还比如Integer,String,这些都重写了Object的equals方法,判断内容是否相等。

当重写Object的equals方法时,也需要重写hashcode方法,以防内容相等,引用不同时候,hashcode不同的情况。

猜你喜欢

转载自blog.csdn.net/Growing_way/article/details/83412340