数据存储在哪里?

寄存器 : 最快的存储区,位于处理器中,寄存器会按需求自行分配空间,java不能控制寄存器,所以在程序中感觉不到它的存在

栈(stack) : 位于RAM(内存)中,速度仅次于寄存器,存储对象的引用(地址),指向堆中的对象. 基本类型直接存储值在栈中

堆(heap) : 也位于RAM中,比栈略慢,存储对象

常量存储 : 直接存放在程序代码内部

非RAM存储 : 比如流对象和持久化对象.存储在磁盘中.

Java是值传递还是引用传递?

给方法传参时,可以看作是用等号("=")赋值.

String name = "张三";
obj.setName(name);//可以看作是str=name="张三",此时str和name都指向"张三";
public void setName(String str) {
    str = "李四";  //等于是给str重新赋值,不在指向"张三"了,转而指向李四,所以name指向"张三"并没有受到影响
    System.out.println(str == name);  //false
}  

但是有一种情况下操作方法内的局部变量会使实参受到影响受到影响,如下

Person person = new Pserson("张三");
obj.setPserson(person);  //someone=person=Person对象
public void setPerson(Person someone){
    someone.setName("李四");
    System.out.println(person.name);  //此时输出李四而不是张三.
    
    someone = new Person("王五");
    System.out.println(person.name);  //此时输出李四而不是王五.

    //看出来区别了吗?
}

  

上面的例子可以看出来,调用方法时,实参传入的是对象的引用,此时两个变量都指向同一个对象,调用对象的方法是能够影响到方法外边的成员变量的,如果重新赋值就不行了.

猜你喜欢

转载自www.cnblogs.com/jinyu59/p/10739337.html