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 sagement、code sagement。类里面定义的static属性、字符串常量都是存储在data sagement里面的,类里面的方法、类如if……else、while等都是存储在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的字符串常量存在,那么其就会创建成功。