对于基本数据类型,修改这个值并不会影响做为参数传进来的那个变量,由于你修改的是方法的局部变量,是一个副本。实参的精度级别应等于或低于形参的精度级别,不然报错。数组
class JB{ void f(int x, int y){ x=x+1; y=y+1; System.out.printf("参数x和y的值分别是:%d, %d\n", x, y); } } public class CS { public static void main(String[] arg){ int x=10; int y=12; JB jb=new JB(); jb.f(x, y); System.out.printf("main方法中x和y的值分别是:%d, %d\n", x, y); } }
结果:
参数x和y的值分别是:11, 13 main方法中x和y的值分别是:10, 12
引用类型包括类、数组以及后面将要学习的接口。当形参是引用类型时,实参传给形参的值是对象的引用。若是修改形参引用的对象,那么实参引用的对象也会发生一样的变化。由于实参的引用拷贝给了形参,因此实参和形参引用同一个对象,对形参引用对象的修改就至关于对实参引用对象的修改。学习
若是修改的不是形参引用的对象而是形参值自己,也就是让形参指向其它对象,则实参值和实参引用的对象都不改变。spa
class A{ int N; A(int n){ N = n; } void setN(int n){ N = n; } int getN(){ return N; } } class A2 extends A{ A2(int n) { super(n); } } class B{ void f(A a){ a.setN(12); // a = new A2(111); System.out.println("在执行方法f时, 形参a修改了本身的N值"); System.out.println("当前形参mouse的N值: " + a.getN()); } } main B b = new B(); A a = new A(2); System.out.println("在调用方法f以前,实参a的N值: "+ a.getN()); b.f(a); System.out.println("在调用方法f以后, 实参a的N值: " + a.getN());
结果: 在调用方法f以前,实参a的N值: 2 在执行方法f时, 形参a修改了本身的N值 当前形参a的N值: 12 在调用方法f以后, 实参a的N值: 12
注意:形参指向其它对象这句话的理解,a = new A2(111);让mouse又指向了另外一个对象,因此他所修改后的值和实参没有关系,实参的值和引用都不会改变。在代码中新加入的A2就是继承了A,经过方法传入的是A(a)的对象的引用,把a = new A2(111);那么以后改变是A2的内容,和A就无关了,因此A(实参)的引用对象和值都不变。code
结果:对象
在执行方法f时, 形参a修改了本身的N值 当前形参a的N值: 111 在调用方法f以后, 实参a的N值: 2