Java - 引用类型

什么是引用

除了8种原始类型,其他类型都是引用类型,包括字符串、数组和文件流。
reference variable就是以某种方式存储对象所在的内存地址的变量。
An illustration of a reference

比如上图,有两个Point类型的对象,他们的内存地址是1000和1024。有三个引用point1、point2和point3,point1和point3指向地址1000的那个对象,point2指向1024那个对象。point1和point3存储1000的值,point2存储1024的值。
引用或者保存对象的内存地址,或者不指向任何对象,此时,他们保存null引用。不能引用原始变量。

=的意思

假如有两个原始变量lhs和rhs,对于

        lhs = rhs;

的意思是,保存在rhs的值,被拷贝到原始变量lhs。以后修改lhs或者rhs不影响另一个。
对于对象,=的意思相同:保存的值被拷贝了。如果lhs和rhs是引用,赋值以后,lhs引用rhs引用的对象。就是说拷贝了地址。lhs之前引用的对象不再被lhs引用,如果该对象不再被引用,就可以被GC回收了。

参数传递

由于使用值调用(call-by-value),实际参数被送给形式参数。如果参数是引用类型,形式参数现在引用的对象就是实际参数引用的对象。
比如下面的代码:

    public static void clearButton(Button b) {
        b.setLabel( "No" );
        b = null;
    }

call-by-value
clearButton方法返回的时候,b指向null,yesButton还指向以前的对象。

==的意思

对于原始类型,如果保存的值相同就返回true。对于引用类型,含义不同。
如果两个引用类型引用的是同一个对象(或者都是null),就返回true。比如

        Button a = new Button( "Yes" );
        Button b = new Button( "Yes" );
        Button c = b;

现在,有两个对象。第一个是a,第二个有两个引用b和c。b == c会返回true,而a == c会返回false。!=的判断规则也类似。

猜你喜欢

转载自blog.csdn.net/weixin_43364172/article/details/84769600