上一小节提到对象的创建和使用:
- 创建对象语法: 类名 对象名 = new 类名();
- 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)。
类中成员的访问机制
- 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。 (例外:static方法访问非static,编译不通过。后面单独讲解)
实例:
package com.qwy;
class Person {
int id ;//属性
String name;//属性
String sex;//属性
public void printMessage(){//方法
name ="张三";//调用本类的属性
sex = "男";//调用本类的属性
System.out.println("姓名:"+name+", 性别:"+sex);
}
}
- 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
实例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中的内存分布:
说明:
- 栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。 局部变量表存放了编译期可知长度的 各种基本数据类型(boolean、byte、 char 、 short 、 int 、 float 、 long 、 double)、对象引用(reference类型, 它不等同于对象本身,是对象在堆内 存的首地址)。 方法执行完,自动释 放。
- 堆(Heap),此内存区域的唯一目的 就是存放对象实例,几乎所有的对象 实例都在这里分配内存(包括数组、对象)。这一点在 Java虚拟机规范中的描述是:所有的 对象实例以及数组都要在堆上分配。
- 方法区(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 ? 哈哈,不明白的话,看看内存图吧。
====================================================================================================
自己也是最近才开始写文章,看到大家都分享自己的经验给别人。我也是受益者之一,做人不能只懂的索取而不去回馈,所以也将自己学习的知识分享给大家。我不能保证每个问题都讲的是对的,毕竟我也是个学习者。如果有地方写得不对或理解有误的,也希望大家给指出,我当非常感谢。编写过程也不易,也希望大家给个赞,关注下本人。这也能激励我继续分享。
====================================================================================================