IT技术篇

Java引用传递和值传递

2018-05-17  本文已影响2人  dpengwang

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就不一样,他们跟普通的引用类型一样

上一篇 下一篇

猜你喜欢

热点阅读