package first;
public class hana {
public static void main(String[] args) {
int n=1;
jo a=new jo();
a.j(n);
System.out.println(n);
}
}
class jo{
public void j(int i){
i++;
}
}
//输出为1
--------------------------------------------------------------------------------
package first;
public class hana {
public static void main(String[] args) {
int n=1;
jo a=new jo();
a.j(n);
System.out.println(n);
}
}
class jo{
public void j(int i){
i++;
}
}
//输出为2
基本数据类型与引用数据类型的区别,方法传递来说,一个传的是值,一个是引用;值传递的话方法内的修改不会影响方法外的使用(不是同一个地址),引用传递的话方法内和方法外会指向同一个地址空间(比如数组就是),方法内的修改就会影响方法外的使用(改的同一个地址的东西)
基本数据类型:在内存中只有一块对应的内存空间
数组:数组类型在内存中存储了两块空间,一是用于存储数组中的内容,二是用来存储内容的位置
方法的入参叫实参,进入到方法体后,叫形参,实参和形参指向同一个内存地址的对象,无论怎么对形参自身进行改变的操作,如=号赋值,自增++都影响不了方法外的实参;但是如果形参和实参为引用数据类型,如数组,自定义对象等,对数组的元素,对象的属性进行改变,改变的仅仅是数组元素和对象属性的地址,对象本身的地址没有发生变化,所以形参和实参都会改变,这里有一个例外,String类型等同于基本数据类型,因为是final类,不可修改的。
-------------------------------------------------------------
打个比方,数组A,对应的内存地址是111;
A的第一个元素A[0]=1,对应的内存地址是222,当修改A的第一个元素A[0]=2,对应的内存地址为333,由于A的内存地址没变还是111,所以形参和实参的A还是同一个,但是A[0]发生了变化。
如有帮助,望采纳!如有疑问,直接点头像私聊我!希望能帮助到你
首先,你上面的代码实际上两个执行输出的结果都是一样的,都是1,其次,JAVA中存在的值传递和引用传递两种类型。
值传递: 变量作为方法参数的时候,先复制一份方法参数的值,然后传给方法,也就是说,它不会影响被复制的参数,就跟你上面说为什么i传递了到方法中了但是值还是1。值传递类型有:常见的八大基本类型即byte short int long float double char boolean以及java中基本数据类型的包装类也是值传递,比如:Boolean、Integer等这些包装类以及String类,他们走的是值传递,这些类可以理解成永恒不可变类。
引用传递(pass by reference): 在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。除了值传递外的所有类型都是引用传递,如数组。具体图片如下: