美文网首页IT技术篇
Java引用传递和值传递

Java引用传递和值传递

作者: dpengwang | 来源:发表于2018-05-17 20:41 被阅读2次

    1.Java中数据类型的存储

    基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,
    引用类型包括:类类型,接口类型和数组。

    Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。
    基本类型的变量保存原始值,即它代表的值就是数值本身;
    而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,
    对象本身存放在这个引用值所表示的地址的位置。

    2.基本类型和引用类型在分配空间上的区别

    基本数据类型在申明的时候就给该变量分配空间,因为基本数据类型占用的空间是指定的

    引用数据类型在声明的时候只分配了应用空间,而不分配数据空间,比如

    Date a,b;//在内存中开辟了两个引用空间
    a = new Date();//new date()开辟了Date对象的数据空间,并把该空间的首地址赋给a
    b=a;//将a存储空间的中的地址写到b的存储空间中
    

    此时a和b指向的是同一块内存区域,ab各自的修改会影响到对方

    class student{
        String name;
        public student(String name) {
            this.name =name;
            // TODO Auto-generated constructor stub
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    public class demo6 {
        public static void main(String[] args) {
            student a,b;
            a =  new student("bob");
            b=a;
            a.setName("bob2.0");
            System.out.println(a.getName());
            System.out.println(b.getName());
        }
    }
    ===>
    bob2.0
    bob2.0
    

    引用也是占空间的

    3.引用传递和值传递

    java中都是值传递,不过传递的是地址

    值传递:

    方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。

    引用传递:

    也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
    在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。

    class student{
        String name;
        public student(String name){
            this.name=name;
        }
    }
    public class demo5 {
        public static void change_name(student oStudent){
            oStudent.name ="has been change";
        }
         public static void change_number(Integer a){
             a =a+1;
         }
        public static void main(String[] args) {
            student aStudent = new student("xiaoming");
            System.out.println(aStudent.name);
            change_name(aStudent);
            System.out.println(aStudent.name);
            
            int a = 1;
            Integer aInteger = new Integer(4);
            change_number(aInteger);
            System.out.println(aInteger);               
        }
    ==>
    xiaoming
    has been change
    4
    

    所以:

    (1)基本数据类型传值,对形参的修改不会影响实参;
    (2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;

    4.特殊类型

    String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待,可以认为是和基本数据类型相似,传值操作。

    但stringbuilder和stringbuffer就不一样,他们跟普通的引用类型一样

    相关文章

      网友评论

        本文标题:Java引用传递和值传递

        本文链接:https://www.haomeiwen.com/subject/ztmidftx.html