JAVA值引用和地址引用


在Java方法中参数列表有两种类型的参数,基本类型和引用类型。

基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。

引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果通过操作副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象会被修改。(两个引用,同一个地址,任何修改行为2个引用同时生效)。

这两种类型都是将外面的参数变量拷贝一份到局部变量中,基本类型为值拷贝,引用类型就是将引用地址拷贝一份。

像引用数据类型的我们可以直接传递他的实例对象到方法中改变他的值 不用返回,这个实例对象的值也会变,包装类型和基本数据类型不行。

package com.zhao.tool.test;

/**
 * java 的值引用和地址引用探究
 * Java方法中参数列表有两种类型的参数,基本类型和引用类型。
 *      基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。
 *      引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果通过操作副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。(两个引用,同一个地址,任何修改行为2个引用同时生效)。
 *      这两种类型都是将外面的参数变量拷贝一份到局部变量中,基本类型为值拷贝,引用类型就是将引用地址拷贝一份
 */
public class ValueAndAddressReferences {
    /**
     *  基本数据类型
     *  方法执行完 局部变量不再被使用到,等待被GC回收
     * @return
     */
    public  static int getAInt(){
        int a=0;
        addParamInt(a);
        return a;

    }
    static  void addParamInt(int c){
        c++;
    }

    public  static Integer getAInteger(){
        Integer a=0;
        addParamInteger(a);
        return a;

    }
    static  void addParamInteger(Integer c){
            c++;
    }

    public  static ClassObject getClassObject(){
        ClassObject title =new ClassObject();
        addParamClassObject(title);
        return title;

    }
    static  void addParamClassObject(ClassObject s){
        s.setTitle("武汉病毒来袭,在家 2020/2/8 ‘正月十五晚上’");
    }

    public static void swapObjectReference(ClassObject object1, ClassObject object2) {
        ClassObject temp = object1;
        object1 = object2;
        object2 = temp;
    }

    public static void main(String[] args) {
        //当方法参数为基本类型时,是将外部变量值拷贝到局部变量中而进行逻辑处理的,故方法是不能修改原基本变量的
        System.out.println("基本数据类型: "+ValueAndAddressReferences.getAInt());
        /**
         * 当传入参数为包装类型时,为对象的引用地址拷贝
         * 因为Java中的自动装箱机制,当在方法中执行 c++时,实际在编译后执行的是 c = Integer.valueOf(true)+1,即又会产生一个新的Integer对象。
         */
        System.out.println("包装类型: "+ValueAndAddressReferences.getAInteger());

        /**
         * 对于引用类型的方法参数,会将外部变量的引用地址,复制一份到方法的局部变量中,两个地址指向同一个对象。
         * 所以如果通过操作副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象也会被修改。(两个引用,同一个地址,任何修改行为2个引用同时生效)
         */
        System.out.println("方法参数为类的对象引用时 : "+ValueAndAddressReferences.getClassObject().getTitle());
        /**
         * 交换2个对象
         * 只是对方法中的两个局部变量的对象引用值进行了交换,不会对原变量引用产生任何影响的。
         */
        ClassObject c=new ClassObject("对象一");
        ClassObject c1=new ClassObject("对象2");
        System.out.println("对象一 :"+c.getTitle()+"\t对象二:"+c1.getTitle());
        ValueAndAddressReferences.swapObjectReference(c,c1);
        System.out.println("对象一 :"+c.getTitle()+"\t对象二 :"+c1.getTitle());
    }
}
package com.zhao.tool.test;


public class ClassObject {
    public ClassObject() {
      super();
    }
    public ClassObject(String title) {
        this.title = title;
    }

    private  String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

 

注意 List这些如果传参进去也是引用的地址。

参考: https://www.cnblogs.com/lingyejun/p/11028808.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM