17--对象的创建和使用(内存图示)

上一小节提到对象的创建和使用:

  1. 创建对象语法: 类名 对象名 = new 类名();
  2. 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)。

类中成员的访问机制

  1. 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。 (例外:static方法访问非static,编译不通过。后面单独讲解)
    实例:
package com.qwy;

class Person {
	int id ;//属性
	String name;//属性
	String sex;//属性
	
	public void printMessage(){//方法
		name ="张三";//调用本类的属性
		sex = "男";//调用本类的属性
		System.out.println("姓名:"+name+", 性别:"+sex);
	}
}

  1. 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
    实例2:
package com.qwy;

public class TestPerson {
	public static void main(String[] args) {
		//不同的类中调用其他类中的方法和属性需要创建对象
		Person per= new Person();//创建类的对象
		per.name="张三";//调用属性
	
		per.sex="男";//调用属性
		
		per.printMessage();//调用类中的方法
	}
}

java中常用的内存区域

为了更好理解对象,这里看看java中的内存分布:
在这里插入图片描述
说明:

  1. 栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。 局部变量表存放了编译期可知长度的 各种基本数据类型(boolean、byte、 char 、 short 、 int 、 float 、 long 、 double)、对象引用(reference类型, 它不等同于对象本身,是对象在堆内 存的首地址)。 方法执行完,自动释 放。
  2. 堆(Heap),此内存区域的唯一目的 就是存放对象实例,几乎所有的对象 实例都在这里分配内存(包括数组、对象)。这一点在 Java虚拟机规范中的描述是:所有的 对象实例以及数组都要在堆上分配。
  3. 方法区(Method Area),用于存储已 被虚拟机加载的类信息、常量、静态 变量、即时编译器编译后的代码等数据。

一个简单对象的内存图

Person类:

package com.qwy;

class Person {
	int id ;//属性
	String name;//属性
	String sex;//属性
	public void printMessage(){//方法
		System.out.println("姓名:"+name+", 性别:"+sex);
	}
}

测试类:

package com.qwy;

public class TestPerson {
	public static void main(String[] args) {
		Person per= new Person();//创建类的对象
		per.id=12;
		per.name="张三";//调用属性
		per.sex="男";//调用属性
		per.printMessage();//调用类中的方法
	}
}

运行结果:
姓名:张三, 性别:男

内存图:
Person per = new Person();
图(1)
在这里插入图片描述

per.id=12;
per.name=“张三”;
per.sex=“男”;
图(2)
在这里插入图片描述

多个对象内存图示

这里使用上面的Person类,修改测试如下:

package com.qwy;

public class TestPerson {
	public static void main(String[] args) {
		Person per1= new Person();//创建类的对象
		per1.id=12;
		per1.name="张三";//调用属性
		per1.sex="男";//调用属性
		per1.printMessage();//调用类中的方法
		
		Person per2= new Person();//创建类的对象
		per2.id=16;
		per2.name="李四";//调用属性
		per2.sex="女";//调用属性
		per2.printMessage();//调用类中的方法
	}
}

运行结果:
姓名:张三, 性别:男
姓名:李四, 性别:女

内存图示:
Person per1 = new Person();
Person per2 = new Person();
图(3)
在这里插入图片描述
per1.id=12;
per1.name=“张三”;
per1.sex=“男”;

per2.id=16;
per2.name=“李四”;
per2.sex=“女”;
图(4)
在这里插入图片描述

继续修改测试类

package com.qwy;

public class TestPerson {
	public static void main(String[] args) {
		Person per1= new Person();//创建类的对象
		per1.id=12;
		per1.name="张三";//调用属性
		per1.sex="男";//调用属性
		per1.printMessage();//调用类中的方法
		
		Person per2= new Person();//创建类的对象
		per2.id=16;
		per2.name="李四";//调用属性
		per2.sex="女";//调用属性
		
		per2 = per1;//将per1的地址赋值为per2
		per2.printMessage();//调用类中的方法
	}
}

注意:这里将per1的地址赋值给了per2。
运行结果:
姓名:张三, 性别:男
姓名:张三, 性别:男

图示:注意这里省略了图(3),图(4),在上两个图的基础上继续(原谅我的懒惰)
图(5):
在这里插入图片描述

匿名对象

1.我们也可以不定义对象的句柄,而直接调用这个对象的方法。这 样的对象叫做匿名对象。
2. 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
实例:

package com.qwy;

public class TestPerson {
	public static void main(String[] args) {
		//使用匿名对象
		new Person().id=12;
		new Person().name="王五";
		new Person().sex="男";
		new Person().printMessage();
	}
}

执行结果:
姓名:null, 性别:null
明明都给name属性和sex属性赋值了,为什么都打印了null ? 哈哈,不明白的话,看看内存图吧。
====================================================================================================
  自己也是最近才开始写文章,看到大家都分享自己的经验给别人。我也是受益者之一,做人不能只懂的索取而不去回馈,所以也将自己学习的知识分享给大家。我不能保证每个问题都讲的是对的,毕竟我也是个学习者。如果有地方写得不对或理解有误的,也希望大家给指出,我当非常感谢。编写过程也不易,也希望大家给个赞,关注下本人。这也能激励我继续分享。
  ====================================================================================================

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值