赞
踩
在java中只有值传递,没有引用传递,即使是包装类型,传递了引用,但是依然是通过创建副本进行传递的!
class ss{
static class Student{
int id;
String name;
/*
public Student(int id, String name) {
this.id = id;
this.name = name;
}*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
int a = 1;
method1(a);
System.out.println(a);
System.out.println("------");
Integer aa = 1;
method2(aa);
System.out.println(aa);
System.out.println("------");
String aaa = "1";
method3(aaa);
System.out.println(aaa);
Student student = new Student();
method4(student);
System.out.println(student);
}
public static void method4(Student input){
input.setId(3);
}
public static void method1(int input){
input = 2;
}
public static void method2(int input){
input = 2;
}
public static void method3(String input){
input = "2";
}
}
结果是什么?
有返回值的设值才会让String、int改变,而对javabean的直接赋值不需要返回直接变化掉
这是什么导致的?存储位置吗?
值的传递是需要确定 传输的是 存储位置还是一个复制的成员变量
在java中只有值传递,没有引用传递,即使是包装类型,传递了引用,但是依然是通过创建副本进行传递的!
我们创建变量和对象,都是在栈中创建了对象引用,引用指向了堆中的具体值
在上面代码中,String、Integer本来就是finial类型,其引用指向的是一个常量池,如果变化,只是在栈中复制了一个引用,并指向了新的位置
这里注意对于局部变量:当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中,
所以copy_a对应值应该在方法栈中,并非堆中
一旦method方法结束,copy_a变量作为一个局部变量就将被清理;
copy_a进行了如下操作:
而对于Student对象,
copy_student进行了如下操作:
基本数据类型是放在栈中还是放在堆中,这取决于基本类型声明的位置。
在方法中声明的变量,即使变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因。
在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。
(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中
(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。
在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。
同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量
(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的
(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。