java参数传递中值传递与引用传递的区别(绝对干货!!!)

创建对象

要创建一个对象,我们用关键字new 并紧跟类名以及()来触发它的构造函数。
构造函数没有返回值,因为他总是返回它数据类型的对象的引用,每当用例调用了new(),系统都会:

  1. 为新的对象分配内存空间
  2. 调用构造函数初始化对象中的值
  3. 返回该对象的一个引用

我们可以用同一个类创建无数对象--每一个对象都有自己的标示(内存地址),且所储存的值和另一个相同类型的对象可以相同也可以不同

值传递

附:和原始数据类型不同的是,对象变量关联的是指向对象的引用而并非数据类型的值本身
那参数传递来说: 首先Java默认是把指针封装起来,以免乱用,
原始数据类型对象传递的是值,可以这么解释,

void function(int a){}

由于Java默认将指针封装以来了,参数形式(int a)实际上相当于(int a = new int()),int的type实际为integer类,如:

public static void main(String[] args){
        Integer a = new Integer(5);
        System.out.println(a);
      }
        输出为5<br>

(但Java对于简单类型变量,是无法直接获得变量类型的;
我们可以通过写一个方法来获取,如:

public class test1 {

        public static void main(String[] args)
        {
            int i=1; //int类型变量
            System.out.println(getType(i)); //打印变量类型为int

        }
        public static String getType(Object o){ //获取变量类型方法
            return o.getClass().toString(); //使用int类型的getClass()方法
        }
    }
输出为class java.lang.Integer

Process finished with exit code 0

对于包装类型变量,是可以直接获得的,变量名称.getClass().getName();)

这是由于Java的封装指针引起的,在声明原始数据类型变量int a,实际上系统为他分配了一个新的内存空间以及内存地址,

例如:

int a = 1;
int b = a;
//实际上相当于
int a = new int();
int b= new int();  b = a;

根据类创建对象的原则:系统都会:

  1. 为新的对象分配内存空间
  2. 调用构造函数初始化对象中的值
  3. 返回该对象的一个引用
    综上所述:原始数据类型参数传递是值传递:新的引用(即内存地址)指向新的内存空间中存储的新的值。

引用传递

再来说说,引用传递: 如:

public class Test {
    public static void main(String[] args){
       Car car = new Car();
        Test test = new Test();
        test.function(car);


      }
      void function(Car car){

      }
}

class Car{

}

由于Test是一个类,由你自己定义的类,由你自己定义的抽象数据类型,其中包括一组值以及一组对这些值的操作集合
,他并没有经过Java内部的指针的封装(除非你自己将他封装), 所以参数(Car car)并没有通过new关键字创建一个实例对象, 只是声明了一个变量,在栈区给他分配了一个局部变量的内存空间,当test.function(car)时,你把实例(Car car = new Car()根据第三条规则:3.返回该对象的一个引用) car()的引用(内存地址)传给参数(Car car) 参数car指向对象实例car的内存地址 综上所述:引用数据类型参数传递即为引用传递

总结

每当用例调用了new(),返回的是该对象的一个引用。
原始数据类型经Java本身将指针封装,以免乱用,所以即使未使用new关键字也会为原始数据类型每声明一个原始数据类型变量并赋值(只要不是类字段和数组,其它变量一律要赋值。)都将

  1. 为新的变量分配内存空间
  2. 为变量分配值
  3. 返回该对象的一个引用
    也就是说原始数据类型相当于默认new了一个实例
    而引用类型如Car car只是声明了一个变量而已,并未指向任何内存地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值