java面向对象简易内存分析
注:本次内存分析主要是通过其内存中的地址来实现。
内存分析中相关知识点普及:
栈:
- 每个线程私有,不能实现线程间的共享!
- 局部变量放置于栈中。 ** 3. 栈是由系统自动分配,速度快!栈是一个连续的内存空间!
堆:
- 放置new出来的对象!
- 堆是一个不连续的内存空间,分配灵活,速度慢!
方法区:
- 被所有线程共享!
- 用来存放程序中永远是不变或唯一的内容。(类代码信息、静态变量、字符串常量)
本次内存分析的实现通过一个事件来演示。主要通过对电脑的颜色修改来实现。
首先,创建一个 人 类(Person ),
具有 姓名(name),年龄(age)属性
人可以对电脑进行修改颜色(changeComputer),
其次,创建一个电脑 类(Computer),
电脑具有品牌(computerName),颜色(computerColor)两个属性。
最后,创建一个Test类执行主方法,测试内存分析。
测试开始,
先创建一台电脑对象,黑色的华硕电脑。引用对象c(地址是:0x0001),color=“黑色”,name=“华硕”
接着创建一个电脑维修员,30岁的李师傅。引用对象p,
打印我自己的电脑 c (地址是:0x0001)的信息
这台电脑(地址是:0x0001)想改成 守望先锋款式 的颜色,通过changeColor(c,“守望先锋”),
p.changeColor(c,"守望先锋");
通过对电脑c (地址是:0x0001)调用人(类)中的 changColor()方法实现
//改变电脑颜色功能 两个形参 电脑 和 颜色
public void changeColor(Computer computer,String color){
//通过传过来的电脑地址 对相应地址的电脑颜色参数 进行改变
computer.setComputerColor(color);
//打印 电脑的颜色
System.out.println("修改后的电脑颜色为:"+computer.getComputerColor());
}
方法中通过对传过来的电脑地址,确定要修改的电脑。通过修改电脑颜色功能实现对相应电脑颜色的修改。修改后的电脑地址仍然是0x0001。
//打印我现在的电脑款式
System.out.println("现在我的电脑是"+c.getComputerColor()+"款式的"+c.getComputerName()+"电脑");
修改后测试,仍然是原来地址的电脑(地址是:0x0001)。但是,其中颜色已经被改变了。
后来,你的电脑(地址是:0x0001)时间长了,玩游戏有点带不动了。你想让李师傅给你的电脑颜色重新喷一遍 守望先锋款式 的。
李师傅看着破旧的电脑摇了摇头,没有给你的电脑喷漆。他向你推荐了一款新的电脑。
//有一天,你的电脑坏掉了,没有维修的价值了,没有给你修改颜色。
// 维修员让你买一台新的电脑,没有返回值
p.changeComputer(c,"守望先锋");
他向你推荐了一款粉色的联想小新,是一台新的电脑 (地址是:0x0010)。他说还可以帮你把新电脑的颜色喷成守望先锋款式的,你看了看,并没有购买。
//一个没有返回值换电脑方法
public void changeComputer(Computer computer,String color){
Computer c=new Computer("联想小新","粉色");
c.setComputerColor(color);
//没有返回值,所以对原来的电脑没有发生改变
}
在这儿,出现了一台新的电脑(地址是:0x0010),与你原来的电脑(地址是:0x0001)并没有什么关系。
所以返回你的电脑信息的时候仍然是你之前的老电脑,你带着你之前的老电脑走了。
过了几天,你又带着你的老电脑(地址是:0x0001)回来了。
//有一天,你的电脑坏掉了,没有维修的价值了,没有给你修改颜色。
// 维修员让你买一台新的电脑,有返回值
c=p.changeComputer1(c,"守望先锋");
你还是之前的要求,李师傅还是向你推荐了这款电脑(地址是:0x0010),你心动了,咬了咬牙,为了更棒的游戏体验,买了新的电脑。
//一个含有返回值的换电脑方法
public Computer changeComputer1(Computer computer,String color){
Computer c=new Computer("联想小新","粉色");
c.setComputerColor(color);
//返回的时候将新的电脑地址给了原来的地址,原来的电脑地址被改变了
return c;
}
在这儿,你走的时候拿走了新的电脑(地址是:0x0010),你原来的电脑被扔掉了,所以再查看你的电脑信息的时候,看到的是新的电脑信息。
至此,整个的简易内存分析就结束了。
新的电脑地址覆盖了你以前的来的电脑地址,你手里的是新的电脑。
测试源码如下:
//内存分析
public class Test {
public static void main(String[] args) {
//创建一台电脑对象
Computer c=new Computer("华硕","黑色");
//创建一个电脑维修员
Person p=new Person("李师傅",30);
//打印我原来的电脑信息
System.out.println("原来我的电脑是"+c.getComputerColor()+"款式的"+c.getComputerName()+"电脑");
//修改我的电脑颜色 为守望先锋款式
p.changeColor(c,"守望先锋");
//打印我现在的电脑款式
System.out.println("现在我的电脑是"+c.getComputerColor()+"款式的"+c.getComputerName()+"电脑");
//有一天,你的电脑坏掉了,没有维修的价值了,没有给你修改颜色。
// 维修员让你买一台新的电脑,没有返回值
p.changeComputer(c,"守望先锋");
//打印当前的电脑,没有返回值的时候
System.out.println("现在我的电脑是"+c.getComputerColor()+"款式的"+c.getComputerName()+"电脑");
//有一天,你的电脑坏掉了,没有维修的价值了,没有给你修改颜色。
// 维修员让你买一台新的电脑,有返回值
c=p.changeComputer1(c,"守望先锋");
//打印当前的电脑
System.out.println("现在我的电脑是"+c.getComputerColor()+"款式的"+c.getComputerName()+"电脑");
}
}
//人
class Person {
//属性私有化 人的名字 人的年龄
private String name;
private int age;
//创建构造方法(无参)
public Person() {
}
//创建构造方法(有参)
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//改变电脑颜色功能 两个形参 电脑 和 颜色
public void changeColor(Computer computer,String color){
//通过传过来的电脑地址 对相应地址的电脑颜色参数 进行改变
computer.setComputerColor(color);
//打印 电脑的颜色
System.out.println("修改后的电脑颜色为:"+computer.getComputerColor());
}
//一个没有返回值换电脑方法
public void changeComputer(Computer computer,String color){
Computer c=new Computer("联想小新","粉色");
c.setComputerColor(color);
//没有返回值,所以对原来的电脑没有发生改变
}
//一个含有返回值的换电脑方法
public Computer changeComputer1(Computer computer,String color){
Computer c=new Computer("联想小新","粉色");
c.setComputerColor(color);
//返回的时候将新的电脑地址给了原来的地址,原来的电脑地址被改变了
return c;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//创建一个类电脑
class Computer {
//属性私有化,电脑品牌,电脑颜色
private String computerName;
private String computerColor;
public Computer() {
}
public Computer(String computerName, String computerColor) {
this.computerName = computerName;
this.computerColor = computerColor;
}
public String getComputerName() {
return computerName;
}
public void setComputerName(String computerName) {
this.computerName = computerName;
}
public String getComputerColor() {
return computerColor;
}
public void setComputerColor(String computerColor) {
this.computerColor = computerColor;
}
}