初学者在学习Java的时候经常会混淆这个概念,但是学C语言的时候却不会混淆这个概念,因为C语言中有一个特殊的东西:指针,进而就会产生疑问:Java是通过什么方式进行参数传递的?
常见的传递方式是两种:按值传递和按引用传递
而Java总是采用按值传递,获得的是参数的拷贝【这句话总是容易引起歧义】具体要看两个角度:
-
在传递类型是基本类型:int,double时,方法定义的是局部变量,所以无法修改传入参数的值,只能以返回值的方式修改参数。
private int increase(int x){ x =x+1; ruturn x; } private void test(){ int x = 1; this.increase(x); //x 为1 x = this.increase(x); //x 为2 }
-
在传递的参数为对象类型,如Student 的实例s1,传入时在方法中修改对象却可以修改数值,这因为在传入的参数中,传入的是对象的引用,这里并不是说拷贝创建了一个新的对象,而是将对象的引用赋值给了局部变量,所以操作的还是原对象:
public void increase(Student s1){ int temp = s1.getX(); temp++; s1.setX(temp); } //x = 2
这段代码在C++中其实应是传入一个对象的引用指针
public void increase(Student& s1)
这里回到主题,Student student 这里的student不是对象,只是一个变量,只有当student 变量真正引用到一个student类型的对象时,它才能代表这个对象,这样就能理解空指针异常。
本篇关键词:按值传递