- 栈:一般存放基本数据类型。
- 堆:用于存放对象。
- 方法区:常量池(常量,比如字符串等),类加载信息。
根据图中可知,Cat类存在于栈中,存储着cat1的地址信息,而cat1在堆中,存储着其属性的地址信息,而真正的属性值在方法区的常量池中。所有类的属性值都存储在方法区中,采用套娃的方式进行存储。
/**首先定义猫类,猫拥有名字,年龄,性别,主人等属性*/
public class Cat {
String name;
int age;
char gender;
String host;
}
class test extends Cat{
public static void main(String []args){
//定义对象cat1,分别给予名字,年龄等等属性
Cat cat1=new Cat();
cat1.name="花花";
cat1.age=2;
cat1.gender='公';
cat1.host="贵妃娘娘";
//定义对象cat2,并且定义等等一系列行为
Cat cat2=new Cat();
cat2.name="阿福";
cat2.age=3;
cat2.gender='母';
cat2.host="华妃娘娘";
//访问猫的属性
System.out.println(cat1.name+cat1.host+cat1.age+cat1.gender);
System.out.println(cat2.name+cat2.host+cat2.age+cat2.gender);
}
}
接下来我们执行一下下一段代码,注意其中对象的机制。直接将对象cat1赋值给cat2,其实相当于将cat1的地址给予的cat2,
/**首先定义猫类,猫拥有名字,年龄,性别,主人等属性*/
public class Cat {
String name;
int age;
char gender;
String host;
}
class test {
public static void main(String []args){
//定义对象cat1,分别给予名字,年龄等等属性
Cat cat1=new Cat();
cat1.name="花花";
cat1.age=2;
cat1.gender='公';
cat1.host="贵妃娘娘";
//定义对象cat2,并且定义等等一系列行为
Cat cat2=cat1;
System.out.println(cat1.name+cat1.host+cat1.age+cat1.gender);
System.out.println(cat2.name+cat2.host+cat2.age+cat2.gender);
}
}
最终我们更改cat2的值,看看是否cat1的值也是否会发生改变???我们更改了cat2的name,可以发现最终cat1也发生了改变,是因为这里改变直接改变了方法区中的值
/**首先定义猫类,猫拥有名字,年龄,性别,主人等属性*/
public class Cat {
String name;
int age;
char gender;
String host;
}
class test {
public static void main(String []args){
//定义对象cat1,分别给予名字,年龄等等属性
Cat cat1=new Cat();
cat1.name="花花";
cat1.age=2;
cat1.gender='公';
cat1.host="贵妃娘娘";
//定义对象cat2,并且定义等等一系列行为
Cat cat2=cat1;
cat2.name="旺旺";
System.out.println(cat1.name+cat1.host+cat1.age+cat1.gender);
System.out.println(cat2.name+cat2.host+cat2.age+cat2.gender);
}
}