Java中一些概念理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/changerzhuo_319/article/details/53312339

1. Java中的值传递, 引用传递。

a 、
首先需要明确,Java中只有值传递, 没有引用传递。对于参数,可以分为基本类型参数和引用类型参数,基本类型参数就是我们所熟知的Java中8种基本数据类型, 引用数据类型参数,则是除了这8中基本数据类型外的所有类型的参数,所有的形式参数都是变量值的副本, 所以在调用方法中对变量的修改,均不会影响到原方法中变量的值。
b、
明确一下所说的修改操作的区别:
修改:即直接改变其变量的值, 如:num由8变为9,user:由内存地址4b71bbc9修改为9a71bbc9;
操作: 修改user对象的name属性, 由原来的test变为change
c、
基本数据类型:
int num = 8;//此时变量num的值就是8
引用数据类型:
User user = new User();//此时user的值是new关键字开辟的堆内存地址值 在栈中的 存放位置的 地址值,例如为4b71bbc9, 这个地址值,最终会指向对内存的空间地址

d、

public void test(){ 
    int num = 8; //此时num的值是8
    User user = new User();// 此时user的值是内存地址假定是4b71bbc9(内存地址值是随机的)
    user.setName("test");
    //调用其他方法
    change(num, user);
    //无论在change方法中怎么操作都只会输出8
    System.out.println("num: "+num);
    //在change方法中如果是以4b71bbc9内存地址为操作对象,会影响name属性的值,
    //否则不会影响该name属性的输出值
    System.out.println("name: "+user.getName());
}

public void change(int numC, User userC){//numC,userC都是test方法中num和user变量值的副本。
    numC ++;
    // 关键测试代码A; 修改形参userC的值,假设userC=9a71bbc9
    // userC = new User(); 
    userC.setName("change");
}

e、
在test方法中将变量作为实际参数传递到change方法中,change方法中形参的值是test方法中变量值的副本,此时在change方法中修改(这里说的是修改,不是操作;对于基本数据类型的变量,无论怎么修改、操作都不会对原来变量的值产生任何影响)参数的值或对修改后的参数进行操作(如:numC的自增, userC设置name属性),都不会对test方法中的变量及变量最终指向的堆内存中的值产生任何影响。
例如:在change方法中修改numC的值, 修改userC的值(需要打开关键测试代码A的注释), test方法中输出的依旧是num: 8, name:test(是以内存地址9a71bbc9为操作对象的,所以 不会影响到内存地址4b71bbc9指向的值)。
如果将关键测试代码A注释,则不会修改userC的值(此时userC的值仍然是4b71bbc9),此时直接对userC设置name属性, 则会影响到test方法中user对象的name属性值, 因为此刻是以内存地址4b71bbc9为对象的操作。

阅读更多
换一批

没有更多推荐了,返回首页