终于通了!!!
类、对象、对象实例
- 类(Class):
- 类可以看作是创建对象的模板或蓝图。它定义了构成特定类型对象的属性和方法。
- 类是抽象的,不能直接操作它,而是通过它来创建对象。
- 例如,一个
Person
类定义了人的属性(如姓名、年龄)和方法(如说话、行走)。
- 对象(Object):
- 对象是类的实例化结果,根据类的定义创建的具体实体。
- 每个对象都有自己独立的属性值,但共享相同的方法结构。
- 例如,根据
Person
类创建的对象可能代表具体的张三,拥有自己的姓名和年龄。
- 对象实例(Instance):
- 对象实例通常是指特定的对象,有时这两个词可以互换使用。
- 在更严格的语境下,实例可能强调的是某个类的一个具体表现或具体化的结果。
- 例如,张三这个
Person
对象就是一个Person
类的实例。
基本类型 —— 代码示例:
*局部变量 —— 栈中;成员变量 —— 堆中;被 static 修饰的变量存放在堆中,它属于类,不属于对象
public class Test {
// 成员变量,存放在堆中
int a = 10;
// 被 static 修饰,也存放在堆中,但属于类,不属于对象
// JDK1.7 静态变量从永久代移动了 Java 堆中
static int b = 20;
public void method() {
// 局部变量,存放在栈中
int c = 30;
static int d = 40; // 编译错误,不能在方法中使用 static 修饰局部变量
}
}
详细介绍
类的元数据:类型信息、运行时常量池等通常存储在方法区(jdk之前叫永久代)
静态变量:属于类的(不是与类的实例相关联),由所有对象实例共享。静态变量在JDK8之前通常存储在方法区,而在JDK8及以后版本中则存储在堆中。
对象实例:即通过new关键字创建的具体的对象,存储在Java堆中。每个对象实例都有自己的成员变量,这些成员变量随对象存储在堆中。当创建一个新的对象时,会在堆上分配相应的内存空间来存储对象的状态。
成员变量 :是对象的状态表示,存储在每个对象实例中。所以jdk8之前就在堆中了
类的Class对象:它也是存在于堆中的。Class对象是类的运行时表示,包含了与类相关的元数据,如方法代码、变量名、方法名、访问权限等。这些信息是在类加载过程中由类加载器从类文件中提取并创建的Class对象的。
好记忆 tips:原本位于方法区的永久代(PermGen)被移除,取而代之的是元空间(Metaspace)。但这个变化主要是针对类的元数据,即类的信息、运行时常量池等。对于普通的对象实例而言,它们的存储位置并没有改变,依然存放在Java堆中。