java传参机制(基本数据类型 VS 引用类型)

大家好,我是教授.F

基本数据类型和引用类型的传参机制是不同的,前者传递的是值(值拷贝),不会影响实参:后者传递的是地址,会影响实参的值。

本质上,区别就在于在堆创建还是在栈创建内存。

基本数据类型的内存只在栈中,引用数据类型在堆中有地址。

实例:

public class MethodParameter01{
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        AA  object = new AA();//执行完在堆有一个地址
        object.swap(a,b); //产生新栈
        System.out.println("a=" + a + "b=" + b); 
    }
}
class AA{
    public void swap(int a,int b){
    System.out.println("\na和b交换前的值\na=" + a + "\tb=" + b);
    int temp = a;
    a = b;
    b = temp;
    System.out.println("\na和b交换后的值\na=" + a + "\tb=" + b);
     }
}

main栈先创建成功,基本数据类型,就会直接在main方法中有地址,然后new AA类出来,在堆中直接创建地址。执行object.swap(a,b); 语句后,会产生一个于main方法没有交际的栈,用来存放

int a、int b 和 int temp 的值。因为swap的栈于main方法的栈不同,所以a与b改变之后并不会改变main中的值。所以基本数据类型不会影响到实参的值。

补充:在 Java 中,栈内存主要用于存储方法调用和局部变量。当你在方法中声明一个局部变量时,该变量的值会被存储在栈内存中。这些局部变量可以是基本数据类型(如int、float、boolean等)或者对象引用。

 对于引用类型创建,创建时在堆中会有地址。

就算调用类中的方法,产生的栈存放的也只是指向堆中的地址。

实例:

用类型传递的是地址(传递也是值但是值是地址),可以通过形参影响实参
类也是引用类型
public class MethodParameter02{
    public static void main(String[] args){
        B b = new B();//在堆创建一个对象
        int[] arr = {1,2,3};//一引用型类型,在堆有空间
        b.text100(arr);  
        System.out.println("main中的数组");
        for(int i = 0;i < arr.length;i++){
            System.out.prinit(arr[i] + "\t");        
        }          
    }
}
class B{//这里的arr也指向堆中的arr地址
    public void text100(int[] arr){
        arr[0] = 200; 
        System.out.println("text100中的数组");   
        for(int i = 0;i < arr.length;i++){
            System.out.prinit(arr[i] + "\t");        
        }
    }
}

与基本数据类型的区别在于在栈中产生的地址,存放的是 指向 引用类型在堆中的地址。如下图:

 所以引用类型在栈中产生的内存只是指向堆中的地址。因为改变的是堆中的数据,又因为main中的数据指向的堆中的数据,所以数据的交换会影响到实参。

注意:类也是引用类型。此外,当栈没有使用时,会自动销毁。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中的数据类型可以分为基本数据类型引用数据类型基本数据类型有 boolean、byte、short、int、long、float 和 double,它们存储的是简单的值。而引用数据类型则包括类、接口、数组等类型,它们存储的是对象的引用,也称为句柄。 以下是java基本数据类型的例子: 1.boolean类型,表示逻辑值,取值为 true 和 false。 ```java boolean b = true; ``` 2.byte类型,8 位二进制补码。在 Java 中,byte 类型用于节省空间,可取值范围为 -128 到 127。 ```java byte b = 100; ``` 3.short类型,16 位二进制补码。在 Java 中,short 类型同样用于节省空间,可取值范围为 -32768 到 32767。 ```java short s = 1000; ``` 4.int类型,32 位二进制补码。在 Java 中,int 类型是最常用的数据类型,可取值范围为 -2147483648 到 2147483647。 ```java int i = 100000; ``` 5.long类型,64 位二进制补码。在 Java 中,long 类型用于存储较大范围的整数,可取值范围为 -9223372036854775808 到 9223372036854775807。 ```java long l = 100000000L; ``` 6.float类型,32 位单精度浮点数,可取值范围为 1.4E-45 到 3.4028235E38。 ```java float f = 3.1415926f; ``` 7.double类型,64 位双精度浮点数,可取值范围为 4.9E-324 到 1.7976931348623157E308。 ```java double d = 3.1415926535897932; ``` 以下是java引用数据类型的例子: 1.类类型,可以用来定义类的属性和方法。 ```java class Person { String name; int age; } ``` 2.接口类型,可以用来定义接口的方法。 ```java interface Printable { void print(); } ``` 3.数组类型,可以用来定义数组。 ```java int[] arr = {1, 2, 3, 4, 5}; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值