JAVA面向对象——对象和类的基本语法
JAVA面向对象——对象和类的基本语法
一、面向对象编程基础
1. 程序中的数据存储方式
- 基本类型:变量(如
int max = 15;
)。 - 数据结构:数组(一维/二维)、对象(特殊数据结构,用于存储复杂事物数据)。
2. 对象的本质
- 定义:对象是一种特殊的数据结构,用于封装事物的属性(数据),代表现实中的事物(如“赵丽颖”对象包含姓名、年龄、身高、体重等属性)。
- 创建方式:通过类(模板/设计图)使用
new
关键字创建,每new
一次生成一个新对象。Star s1 = new Star(); // 创建对象 s1.name = "赵丽颖"; // 设置属性
二、类的基本语法
1. 类的定义
- 作用:定义对象的模板,包含属性(成员变量)和行为(成员方法)。
- 语法结构:
public class 类名 {// 成员变量(属性)数据类型 变量名; // 如 String name; int age;// 成员方法(行为)public void 方法名() {// 方法逻辑} }
2. 对象的使用步骤
- 定义类:设计对象的属性和方法(如
Star
类)。 - 创建对象:使用
new
关键字实例化对象(如Star s1 = new Star();
)。 - 操作对象:通过对象名访问属性和方法(如
s1.name = "赵丽颖";
)。
三、核心概念解析
1. 构造器(Constructor)
- 作用:创建对象时初始化成员变量。
- 特点:
- 与类同名,无返回值类型声明。
- 默认构造器:若未显式定义构造器,系统自动生成无参构造器。
- 自定义构造器:若定义有参构造器,默认无参构造器会被覆盖,需手动添加无参构造器以保留。
- 语法示例:
public class Student {private String name;private int age;// 无参构造器public Student() {}// 有参构造器public Student(String name, int age) {this.name = name;this.age = age;} }
2. this 关键字
- 作用:
- 指代当前对象,哪个对象调用方法,
this
就指向哪个对象。 - 解决成员变量与方法参数/局部变量同名时的命名冲突问题。
- 指代当前对象,哪个对象调用方法,
- 示例:
public class Student {private String name;public void setName(String name) { // 参数名与成员变量同名this.name = name; // 通过 this 访问成员变量} }
3. 封装(Encapsulation)
- 定义:面向对象三大特征之一,将数据(成员变量)和操作数据的方法封装在类中,通过控制访问权限实现“合理隐藏,合理暴露”。
- 实现方式:
- 隐藏属性:用
private
修饰成员变量,禁止外部直接访问。 - 暴露方法:用
public
修饰getter/setter
方法,用于读写属性。
- 隐藏属性:用
- 示例:
public class Student {private String name; // 私有属性// getter 方法(获取属性)public String getName() {return name;}// setter 方法(设置属性)public void setName(String name) {this.name = name;} }
4. 实体类(Javabean)
- 定义:一种符合特定规范的类,用于存储数据,数据与业务逻辑分离。
- 规范要求:
- 所有成员变量
private
修饰,提供public
的getter/setter
方法。 - 必须包含无参构造器,有参构造器可选。
- 所有成员变量
- 应用场景:在软件开发中用于封装数据(如数据库表中的记录),便于数据传输和存储。
四、static 关键字
1. static 修饰成员变量(静态变量/类变量)
- 特点:
- 属于类,而非单个对象,内存中仅存储一份,被所有对象共享。
- 访问方式:
类名.静态变量
(推荐)或对象名.静态变量
(不推荐)。
- 示例:
public class Student {public static int totalStudents; // 静态变量,记录学生总数private String name;public Student() {totalStudents++; // 每次创建对象时总数加 1} }
2. static 修饰成员方法(静态方法/类方法)
- 特点:
- 属于类,可通过
类名.方法名
直接调用,无需创建对象。 - 限制:静态方法中不能直接访问实例成员(实例变量、实例方法),只能访问静态成员。
- 属于类,可通过
- 应用场景:
- 工具类设计(如
Math
类、自定义的StringUtils
),提供通用功能,避免对象创建开销。 - 主方法
main
是静态方法,程序入口需直接调用。
- 工具类设计(如
- 示例:
public class Utils {// 静态方法:计算两数之和public static int add(int a, int b) {return a + b;} } // 调用方式:Utils.add(1, 2);
3. 静态方法与实例方法的区别
特征 | 静态方法 | 实例方法 |
---|---|---|
所属 | 类 | 对象 |
调用方式 | 类名.方法名 (推荐) | 对象名.方法名 |
能否访问静态成员 | 能 | 能 |
能否访问实例成员 | 不能 | 能 |
是否存在 this 关键字 | 否 | 是(指向当前对象) |
五、内存模型(详细解析)
Java程序运行时的内存分配遵循特定的模型,主要分为 栈内存(Stack Memory)、堆内存(Heap Memory) 和 方法区(Method Area)(JDK 8及之后称为 元空间 Metaspace)。理解这三部分的作用和数据存储机制,对掌握对象创建、变量作用域及内存管理至关重要。
1. 栈内存(Stack Memory)
作用:
- 存储局部变量(方法内定义的变量、方法参数)和对象引用(如
Star s1
中的变量名s1
)。 - 遵循**先进后出(LIFO)**的栈结构,用于管理方法的调用和执行顺序。
特点:
- 线程私有:每个线程拥有独立的栈空间,线程结束后栈内存自动释放。
- 存储内容:
- 基本数据类型的局部变量(如
int age = 18;
中的age
)。 - 对象引用变量(存储对象在堆内存中的地址,如
s1
指向new Star()
的地址)。
- 基本数据类型的局部变量(如
- 内存大小受限:栈的大小由JVM启动参数配置(默认较小,如1MB),若方法嵌套调用过深易引发 栈溢出(StackOverflowError)。
示例:
public class Test {public static void main(String[] args) {Star s1 = new Star(); // s1 是栈内存中的对象引用,指向堆中的 Star 对象int num = 10; // num 是栈内存中的基本类型变量print(s1, num); // 调用方法时,参数 s1 和 num 压入栈}public static void print(Star s, int n) {// s 和 n 是栈内存中的局部变量}
}
2. 堆内存(Heap Memory)
作用:
- 存储对象实例和数组,是对象创建的唯一区域(通过
new
关键字分配内存)。 - 对象的成员变量(属性)在此分配空间并存储具体数据(如
s1.name = "赵丽颖"
中的name
值)。
特点:
- 线程共享:所有线程均可访问堆内存中的对象。
- 动态分配:内存分配灵活,大小由JVM动态管理(可通过
-Xms
、-Xmx
参数调整)。 - 垃圾回收(GC):JVM定期回收不再被引用的对象,避免内存泄漏。
- 存储内容:
- 对象的实例数据(如
Star
对象的name
、age
等属性值)。 - 数组的元素(如
int[] arr = {1, 2, 3};
中的数组元素)。
- 对象的实例数据(如
示例:
Star s1 = new Star(); // 堆内存中创建 Star 对象,存储属性值
s1.name = "赵丽颖"; // "赵丽颖" 存储在堆中对象的 name 属性里
s1.age = 36; // 36 存储在堆中对象的 age 属性里
- 内存地址:堆中的对象有唯一的内存地址(如
0x15aeb7ab
),栈中的引用变量指向该地址。
3. 方法区(Method Area)
作用:
- 存储类的元数据(字节码文件
.class
)、静态变量(static)、常量(final) 和 方法定义(如方法名、字节码指令)。 - 属于线程共享区域,供全程序访问。
特点(JDK 8及之后):
- 元空间(Metaspace):方法区的实现由永久代(PermGen)改为元空间,内存分配从本地内存(Native Memory)中划分,避免了永久代的内存溢出问题。
- 存储内容:
- 类的结构信息(类名、父类、接口、成员变量和方法的定义)。
- 静态变量(如
public static int totalStudents;
)。 - 字面量(如字符串常量
"赵丽颖"
)和符号引用。 - 方法的字节码指令(如
printTotalScore()
方法的执行逻辑)。
示例:
public class Star {static String country = "中国"; // 静态变量 country 存储在方法区final double PI = 3.14; // 常量 PI 存储在方法区String name; // 成员变量的定义存储在方法区,值存储在堆中public void printInfo() { // 方法定义存储在方法区System.out.println("姓名:" + name);}
}
六、关键总结
- 对象与类的关系:类是模板,对象是实例;通过
new
关键字由类创建对象。 - 封装的核心:隐藏属性,暴露接口,保证数据安全性和代码可维护性。
- static 的作用:实现类级别的数据和方法共享,常用于工具类和全局数据管理。
- 构造器的职责:确保对象创建时成员变量被正确初始化,支持重载以灵活初始化。