Java中类与对象以及存在形式

Java中类与对象以及存在形式

Java中类与对象

在Java程序中可以认为成一种自定义发数据类型,而例如int类型是由Java提供的数据类型。比如人类,可以认为是一种包含一个鼻子两个眼睛等等属性和会直立行走等等行为的一个类,而猫类可以认为成由毛茸茸的毛四条腿等等属性和吃老鼠等等行为构成的一个生物集合,也可以认为一个数据类型。

而对象可以是类中一个具体的示例,比如张奶奶家里的小花猫就是猫类的一个对象,你我也是人类中的其中一个对象。

image-20220413094813438

观察以下代码:可以发现一个cat类可以定义好多对象,而且将来可以灵活添加很多属性。类是对象的抽象,对象是类的具体实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**首先定义猫类,猫拥有名字,年龄,性别,主人等属性*/
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=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);
}
}

image-20220413094840226

在内存中的存在形式

  1. 栈:一般存放基本数据类型。
  2. 堆:用于存放对象。
  3. 方法区:常量池(常量,比如字符串等),类加载信息。

根据图中可知,Cat类存在于栈中,存储着cat1的地址信息,而cat1在堆中,存储着其属性的地址信息,而真正的属性值在方法区的常量池中。所有类的属性值都存储在方法区中,采用套娃的方式进行存储。

image-20220413095040736

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**首先定义猫类,猫拥有名字,年龄,性别,主人等属性*/
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);

}
}

image-20220413095113870

接下来我们执行一下下一段代码,注意其中对象的机制。直接将对象cat1赋值给cat2,其实相当于将cat1的地址给予的cat2,

image-20220413095134754

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**首先定义猫类,猫拥有名字,年龄,性别,主人等属性*/
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);

}
}

image-20220413095217379

最终我们更改cat2的值,看看是否cat1的值也是否会发生改变???我们更改了cat2的name,可以发现最终cat1也发生了改变,是因为这里改变直接改变了方法区中的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**首先定义猫类,猫拥有名字,年龄,性别,主人等属性*/
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);

}
}

image-20220413095240876