文章目录
- 类的概念
- 对象的概念
- 面向对象的三步骤
- 对象的内存解析
- JVM 内存结构划分
- 对象内存分析
类的概念
具有相同特征的事物的抽象描述,是抽象的、概念上的定义。
对象的概念
实际存在的该类事物的每个个体,是具体的,因而也称为实例。
面向对象的三步骤
1、类的定义
public class Person{
int age ;//声明属性 age
public void eat() {
System.out.println("吃饭");
}
}
2、对象的创建
class PersonTest{
public static void main(String[] args){
//创建 Person 类的对象
Person p1 = new Person();
}
}
3、对象调用属性或方法
Phone.java
public class Phone {
//属性
int price;
String color;
String name;
//方法
public void call(String who) {
System.out.println("给" + who + "打电话");
}
public void sendMessage(String text) {
System.out.println("群发短信" + text);
}
public void playGame() {
System.out.println("玩游戏");
}
public void showColor() {
System.out.println("手机颜色为" + color);
}
}
PhoneTest.java
public class PhoneTest {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.call("张三");
p1.color = "红色" ;
p1.showColor();
p1.sendMessage("今天天气不错");
}
}
对象的内存解析
JVM 内存结构划分
HotSpot Java 虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分 (Runtime Data Area)。
堆(Heap):此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例 都在这里分配内存。这一点在 Java 虚拟机规范中的描述是:所有的对象实例以 及数组都要在堆上分配。
栈(Stack):是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放 了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、 float、long、double)、对象引用(reference 类型,它不等同于对象本身,是 对象在堆内存的首地址)。 方法执行完,自动释放。
方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变 量、即时编译器编译后的代码等数据。
对象内存分析
内存解析图:
堆:凡是 new 出来的结构(对象、数组)都放在堆空间中。 对象的属性存放在堆空间中。
创建一个类的多个对象(比如 p1、p2),则每个对象都拥有当前类的一套 “副本”(即属性)。当通过一个对象修改其属性时,不会影响其它对象此 属性的值。
当声明一个新的变量使用现有的对象进行赋值时(比如 p3 = p1),此时 并没有在堆空间中创建新的对象。而是两个变量共同指向了堆空间中同一 个对象。当通过一个对象修改属性时,会影响另外一个对象对此属性的调用(与JavaScript对象存储一致)。