JAVA的内存模型

class Dog

{

int age = 5;

}

public class Test2

{

 publicstatic void fun(Dog temp)

{

           temp.age = 20;

}

publicstatic void fun2(String temp)

{

           temp = "fish";

}

Public static void fun3(){

     String temp ="dish";

     temp += "dddd";

    System.out.println(temp);//输出fish

     }

publicstatic void main(String[] args)

{

Dogd = new Dog();

d.age= 15;

fun(d);

System.out.println(d.age);//输出是20

System.out.println("---------------------------");

Stringstr = "dog";

fun2(str);

System.out.println(str);//输出dog

fun3();

}

}


1、当我执行java Test2时,系统会把加载两个类到内存中,分别是Dog和Test2。JVM从内存中调用这个类,并处理,进而输出结果。此时,系统的内存被分成了4个部分,分别是栈内存、堆内存、data sagementcode sagement。类里面定义的static属性、字符串常量都是存储在data sagement里面的,类里面的方法、类如if……elsewhile等都是存储在code sagement里面的

2、main方法是java的主程序入口,当执行java Test2时,实际上执行的是javaTest2.main,所以是从main开始执行的。把main方法定义为static就是因为它只有是类相关的,才能这么调用。

3、执行Dog d = new Dog();时,会在栈内存里面创建一个引用类型变量d,在堆内存里面创建一个newDog()对象,这个new Dog()对象有一个属性是age:5,并把d指向这个new Dog()对象。

4、当执行fun(d)时,会在栈内存里面创建一个引用类型变量temp,之后把temp也指向之前堆内存里面创建的new Dog()对象。由于temp和d执行的是同一个对象,那么当temp对这个对象进行操作后,这个对象改变了,所以在通过d来调用这个对象的age属性时,它已经改变了.当fun执行完之后,temp就不再执行new Dog()对象了,它将被垃圾回收机制回收。

5、当执行String str = "dog";时,会在栈内存中创建一个引用类型变量str,在data sagement里面的字符串常量池里面创建一个dog字符串常量。并将str指向这个dog字符串常量。

6、当执行fun(str)时,会在栈内存里面创建一个temp引用类型变量,这个temp也指向字符串常量池里面的dog字符串。之后执行temp = “fish”时,会在data sagement里面的字符串常量池里面创建一个fish字符串常量,temp就会指向这个fish。而str自始至终执行的都是dog,所以System.out.println(str);//输出dog。

7、当执行fun3()的Stringtemp = "dish";时,程序会在data sagement里面的字符串常量池里面创建一个dish字符串常量,并在栈内存里面创建一个temp引用类型的变量,且temp是指向dish的。当执行temp +="dddd";程序会在字符串常量池里面创建一个dddd字符串常量,和dishdddd字符串常量,并最终把temp指向dishdddd。这样程序就创建了3个字符串常量,而前两个都没有用了,所以这样会造成程序资源的浪费。在for循环里面一定不要这么用。

8、String str1 = "hwp";

      String str2 = newString("hwp");

   执行这两行代码,程序会创建两个对象。执行第一行代码时,程序程序会在data sagement里面的字符串常量池里面创建一个hwp字符串常量,执行第二行代码时程序会在堆内存里面创建一个new String(x)对象,并试图在data sagement里面的字符串常量池里面创建一个hwp字符串常量,将x指向这个字符串常量。但创建时,发现字符串常量池里面已经有一个hwp的字符串常量了,那么它就不再创建了,就直接将x执行已经存在的这个字符串常量。

9、String str1 = "hwp";

     String str2 = new String("hhx");

 执行这两行代码,程序会创建三个对象。执行第一行代码时,程序程序会在data sagement里面的字符串常量池里面创建一个hwp字符串常量,执行第二行代码时程序会在堆内存里面创建一个new String(x)对象,并试图在data sagement里面的字符串常量池里面创建一个hhx字符串常量,将x执行这个字符串常量。由于现在字符串常量池里面现在并没有一个hhx的字符串常量存在,那么其就会创建成功。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值