第一部分:类与对象概念
理解面向对象编程的核心思想,区分类与对象的关系
学习目标
理解类是对象的模板,对象是类的实例,掌握二者的区别与联系
什么是类?
类是描述一类事物的模板或蓝图,它定义了这类事物的属性和行为。
生活中的例子:
- 汽车设计图纸 → 类
- 饼干模具 → 类
- 房屋户型图 → 类
什么是对象?
对象是类的具体实例,是根据类创建出来的实际存在的事物。
生活中的例子:
- 根据图纸生产的具体汽车 → 对象
- 用模具制作的每块饼干 → 对象
- 按照户型图建造的具体房屋 → 对象
关键理解
类是抽象的概念,对象是具体的实体。一个类可以创建多个对象,每个对象都有独立的属性值。
第二部分:类的基本结构
学习如何定义一个Java类,包括属性、方法和构造器
学习目标
掌握类的基本组成部分,能够独立定义一个简单的类
1
类的基本语法
Java类的完整结构包含:
public class 类名 {
// 1. 属性(成员变量)
private 数据类型 属性名;
// 2. 构造方法
public 类名() {
// 初始化代码
}
// 3. 普通方法
public 返回类型 方法名(参数列表) {
// 方法体
return 返回值;
}
}
2
创建学生类示例
让我们创建一个实际的Student类:
public class Student {
// 属性(成员变量)
private String name; // 姓名
private int age; // 年龄
private String studentId; // 学号
private double gpa; // 绩点
// 构造方法(无参构造)
public Student() {
// 默认构造器
}
// 构造方法(带参数构造)
public Student(String name, int age, String studentId) {
this.name = name;
this.age = age;
this.studentId = studentId;
this.gpa = 0.0;
}
// getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age < 100) {
this.age = age;
}
}
// 自定义方法
public void study() {
System.out.println(name + "正在学习");
}
public void introduce() {
System.out.println("大家好,我是" + name +
",学号是" + studentId +
",今年" + age + "岁");
}
}
注意事项
- 类名必须与文件名完全一致(区分大小写)
- 一个.java文件中可以有多个类,但只能有一个public类
- 属性通常使用private修饰,实现封装
- 方法名使用小驼峰命名法(如getName)
第三部分:对象的创建与使用
学习如何根据类创建对象,并调用对象的方法
学习目标
掌握对象创建的语法,能够正确使用对象的方法和属性
1
对象的创建语法
创建对象的基本语法:
// 语法格式
类名 对象名 = new 类名(参数);
// 实际示例
Student student1 = new Student();
Student student2 = new Student("张三", 20, "2024001");
2
对象的使用示例
创建一个完整的使用示例:
public class StudentTest {
public static void main(String[] args) {
// 创建学生对象
Student stu1 = new Student("张三", 20, "2024001");
Student stu2 = new Student();
// 设置属性值
stu2.setName("李四");
stu2.setAge(19);
// stu2.studentId = "2024002"; // 错误!不能直接访问私有属性
// 调用对象方法
stu1.introduce();
stu1.study();
stu2.introduce();
stu2.study();
// 访问属性值
System.out.println("张三的年龄是:" + stu1.getAge());
}
}
大家好,我是张三,学号是2024001,今年20岁
张三正在学习
大家好,我是李四,学号是null,今年19岁
李四正在学习
张三的年龄是:20
第四部分:内存模型分析
深入理解对象在内存中的存储方式
学习目标
理解栈内存、堆内存和方法区的区别,明白对象引用的本质
栈内存 (Stack)
student1 (引用地址)
student2 (引用地址)
main方法栈帧
堆内存 (Heap)
Student对象1
name="张三"
age=20
studentId="2024001"
name="张三"
age=20
studentId="2024001"
Student对象2
name="李四"
age=19
studentId=null
name="李四"
age=19
studentId=null
方法区 (Method Area)
Student.class
方法代码
常量池
内存分配说明
- 栈内存:存储局部变量和对象引用,线程私有
- 堆内存:存储对象实例,所有线程共享
- 方法区:存储类信息、常量、静态变量等
第五部分:常见错误与解决方案
总结初学者在使用类与对象时最容易犯的错误
错误1:空指针异常
错误代码:
Student stu;
System.out.println(stu.getName()); // NullPointerException
正确写法:
Student stu = new Student();
System.out.println(stu.getName());
错误2:直接访问私有属性
错误代码:
Student stu = new Student();
stu.name = "张三"; // 编译错误:name是私有的
正确写法:
Student stu = new Student();
stu.setName("张三");
错误3:忘记实例化对象
错误代码:
Student[] students = new Student[3];
students[0].setName("张三"); // NullPointerException
正确写法:
Student[] students = new Student[3];
students[0] = new Student();
students[0].setName("张三");
错误4:混淆对象和引用
错误理解:
认为"stu1 = stu2"会复制对象
实际情况:
Student stu1 = new Student("张三");
Student stu2 = stu1; // stu2和stu1指向同一个对象
stu2.setName("李四"); // stu1的名字也变成了"李四"
第六部分:实战练习
通过实际项目巩固类与对象的概念
学习目标
独立完成一个完整的类设计,并创建多个对象进行操作
练习任务:图书管理系统
要求:
- 创建Book类,包含属性:书名、作者、价格、库存数量
- 包含方法:显示图书信息、借书、还书
- 创建Library类管理多本图书
- 在main方法中测试功能
步骤1:创建Book类
public class Book {
private String title;
private String author;
private double price;
private int stock;
public Book(String title, String author, double price, int stock) {
this.title = title;
this.author = author;
this.price = price;
this.stock = stock;
}
public void displayInfo() {
System.out.println("《" + title + "》 - " + author +
" - ¥" + price + " - 库存:" + stock);
}
public boolean borrowBook() {
if (stock > 0) {
stock--;
System.out.println("借阅成功!");
return true;
} else {
System.out.println("库存不足!");
return false;
}
}
public void returnBook() {
stock++;
System.out.println("还书成功!当前库存:" + stock);
}
}
步骤2:测试类
public class LibraryTest {
public static void main(String[] args) {
// 创建图书对象
Book book1 = new Book("Java编程思想", "Bruce Eckel", 108.0, 5);
Book book2 = new Book("算法导论", "Thomas Cormen", 128.0, 3);
// 显示图书信息
book1.displayInfo();
book2.displayInfo();
// 借阅操作
book1.borrowBook();
book1.borrowBook();
// 还书操作
book1.returnBook();
}
}
《Java编程思想》 - Bruce Eckel - ¥108.0 - 库存:5
《算法导论》 - Thomas Cormen - ¥128.0 - 库存:3
借阅成功!
借阅成功!
还书成功!当前库存:4
学习总结
- 类是模板,对象是实例
- 使用new关键字创建对象
- 对象引用存储在栈中,对象数据存储在堆中
- 封装通过private实现,提供public的getter/setter方法
- 构造方法用于对象初始化
- 注意避免空指针异常