文章目录
- 类的概念
- 对象的概念
- 面向对象的三步骤
- 对象的内存解析
- JVM 内存结构划分
- 对象内存分析
类的概念
具有相同特征的事物的抽象描述,是抽象的、概念上的定义。
对象的概念
实际存在的该类事物的每个个体,是具体的,因而也称为实例。
面向对象的三步骤
1、类的定义
public class Person{ int age ;//声明属性 agepublic 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对象存储一致)。