Java值传递

方法参数的值传递机制

有一种的说法Java中只有值传递机制,这种说法的原因就是一个是传递的数据值(基本数据类型),一个传递的是地址值(引用数据类型)
在这里插入图片描述

形参是基本数据类型的情况

@Test
public void test(){
    int a = 10;
    int b = 20;
    swap(a,b);
    System.out.println(a+":"+b);//10:20
}

public void swap(int a,int b){
    int temp = a;
    a = b;
    b = temp;
    System.out.println(a+":"+b);//20:10
}

这里运行方法后是没有交换成功的原因是:这里的情况就是实参直接将自己的值传给了形参,而不是地址值,所以形参交换了而实参并没有交换.因为这里的参数是基本数据类型

此过程发生在栈中,原因可以看这篇文章,过程如下:
在这里插入图片描述

形参是引用数据类型的情况

@Test
public void test(){
    Num num = new Num();
    num.m = 10;
    num.n = 20;

    System.out.println(num.m+":"+num.n);//10:20
    swap(num);
    System.out.println(num.m+":"+num.n);//20:10
}

public void swap(Num num){
    int temp = num.m;
    num.m = num.n;
    num.n = temp;
    System.out.println(num.m+":"+num.n);//20:10
}

class Num{
    int n;
    int m;
}

这种就交换成功了,因为这里直接是让形参也指向了与实参一样的地址,所以就交换成功了.

在这里插入图片描述

而String在值传递时我们把它当做基本数据类型来看就可以了

数据存放位置

基本数据类型存放在哪里
1.如果作为方法的传入参数或者方法中的局部变量的话,基本数据类型会存放在Java虚拟机栈中的局部变量表中。
Java虚拟机栈每调用一个方法就会创建一个栈帧用于存放局部变量表、操作数栈、动态连接、方法接口等信息。方法的调用和执行过程对应栈帧在Java虚拟机栈中入栈和出栈的过程。
2.如果作为对象实例中的基本数据类型,就存放在堆中。
3.如果作为静态变量,在JDK7之前会存放在永生代实现的方法区中,在JDK8之后会存放在元空间实现的方法区中。

基本数据类型跟引用类型有什么区别

1.存储方式
针对基本数据类型和引用类型来说,他们存储的位置基本相同。区别在于基本数据类型在存放位置存放的是数值,而引用类型数据存放的是地址值,对象实例存放在堆中。

2.传递方式
他们的本质上都是值的传递。
基本数据类型传递的是数值的副本。
引用数据类型传递的是地址值的副本。

常见的Java值传递的题目

Java拼接问题

@Test
public void test(){
    String s1 = "javaEEhadoop";
    String s2 = "javaEE"+"hadoop";
    String s3 = "javaEE";
    final String s4 = "javaEE"; //s4: 常量

    String s5 = s3 + "hadoop";
    String s6 = s4 + "hadoop";

    //执行intern()方法时,若常量池中不存在等值的字符串,
    //JVM就会在常量池中创建一个等值的字符串,然后返回该字符串的引用。
    String s7 = s5.intern();

    System.out.println(s1 == s2);//true
    System.out.println(s1 == s5);//false
    System.out.println(s1 == s6);//true
    System.out.println(s1 == s7);//true
}

下面代码运行结果是?

class Value{
    public int i=15;
}
public class Test{
    public static void main(String argv[]){
        Test t=new Test( );
        t.first( );
    }
 
public void first( ){
    int i=5;
    Value v=new Value( );
    v.i=25;
    second(v,i);
    System.out.println(v.i);
}
 
public void second(Value v,int i){
    i = 0;
    v.i = 20;
    Value val = new Value( );
    v = val;
    System.out.println(v.i+" "+i);
   }
}

答案:15 0 20

public class foo {
    public static void main(String sgf[]) {
        StringBuffer a=new StringBuffer("A");
        StringBuffer b=new StringBuffer("B");
        operate(a,b);
        System.out.println(a+"."+b);
    }
    
    static void operate(StringBuffer x,StringBuffer y) {
        x.append(y);
        y=x;
    }
}

答案:AB.B

以下代码执行后输出结果为

public class ClassTest{
     String str = new String("hello");
     char[] ch = {'a','b','c'};
     public void fun(String str, char ch[]){
     str="world";
     ch[0]='d';
 }
 public static void main(String[] args) {
     ClassTest test1 = new ClassTest();
     test1.fun(test1.str,test1.ch);
     System.out.print(test1.str + " and ");
     System.out.print(test1.ch);
     }
 }

答案:hello and dbc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值