一、回顾与启程
在上一篇文章中,我们成功搭建了Java开发环境,编写了第一个"Hello World"程序,掌握了Java程序的基本结构。现在,让我们开始探索Java编程的核心基础——变量、数据类型和面向对象编程。
今天,我们将创建一个"学生类",这是构建学生信息管理系统的第一步。
二、变量与数据类型
什么是变量?
变量是存储数据的容器,就像生活中的盒子,可以存放不同类型的物品。
Java中的基本数据类型:
- 整数类型
java
byte age = 20; // 字节型,范围:-128 ~ 127
short year = 2024; // 短整型,范围:-32768 ~ 32767
int studentId = 1001; // 整型(最常用),范围:约±21亿
long population = 1400000000L; // 长整型(注意后面的L) - 浮点类型(小数)
java
float price = 99.9f; // 单精度浮点(注意后面的f)
double score = 89.5; // 双精度浮点(最常用) - 字符类型
java
char grade = ‘A’; // 单个字符,使用单引号
char chineseChar = ‘学’; // 中文字符也可以 - 布尔类型
java
boolean isPassed = true; // 只有true和false两个值
boolean hasComputer = false; - 字符串类型(注意:String是类,不是基本类型)
java
String name = “张三”;
String className = “计算机科学与技术2023级1班”;
三、声明和使用变量
变量的声明与初始化:
java
// 1. 先声明,后赋值
int age;
age = 20;
// 2. 声明的同时赋值(推荐)
String name = “李四”;
double score = 92.5;
// 3. 同时声明多个同类型变量
int x = 10, y = 20, z = 30;
变量命名规则:
必须以字母、下划线(_)或美元符号($)开头
后续可以是字母、数字、下划线或美元符号
不能使用Java关键字
区分大小写
建议使用驼峰命名法(camelCase)
好的变量名示例:
java
String studentName; // 学生姓名
int studentAge; // 学生年龄
double averageScore; // 平均分数
boolean isGraduated; // 是否毕业
不好的变量名示例:
java
String a; // 太简单,不知道什么意思
int x1; // 没有意义
double 123score; // 以数字开头(错误)
boolean class; // 使用关键字(错误)
四、创建第一个类:Student类
什么是类?
类是对现实世界事物的抽象,是对象的模板。比如"学生"这个类,可以包含学号、姓名、年龄等属性。
创建Student类的步骤:
步骤1:在IntelliJ IDEA中创建新类
打开上一篇文章创建的MyFirstProject项目
右键点击src文件夹 → New → Java Class
输入类名:Student
按Enter键创建
步骤2:编写Student类的基本结构
java
// Student.java
public class Student {
// 属性(成员变量)
private String id; // 学号
private String name; // 姓名
private int age; // 年龄
private String className; // 班级
private double score; // 成绩
// 构造方法 - 用于创建对象时初始化属性 public Student(String id, String name, int age, String className, double score) { this.id = id; this.name = name; this.age = age; this.className = className; this.score = score; } // 方法:显示学生信息 public void displayInfo() { System.out.println("===== 学生信息 ====="); System.out.println("学号:" + id); System.out.println("姓名:" + name); System.out.println("年龄:" + age); System.out.println("班级:" + className); System.out.println("成绩:" + score); System.out.println("==================="); } // Getter和Setter方法(用于访问和修改私有属性) public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 其他Getter和Setter方法类似...}
五、深入理解Student类的各个部分
- 访问修饰符
public:公开的,任何地方都可以访问
private:私有的,只能在当前类内部访问
protected:受保护的,在同一个包或子类中可以访问
默认(不写):在同一个包中可以访问
- 构造方法(Constructor)
方法名与类名相同
没有返回类型(连void都没有)
在创建对象时自动调用
可以重载(多个构造方法)
java
// 无参构造方法
public Student() {
this.id = “未知”;
this.name = “未知”;
this.age = 0;
this.className = “未知”;
this.score = 0.0;
}
// 有参构造方法
public Student(String id, String name) {
this.id = id;
this.name = name;
this.age = 18; // 默认年龄
this.className = “未分配”;
this.score = 0.0;
}
// 全参构造方法
public Student(String id, String name, int age, String className, double score) {
this.id = id;
this.name = name;
this.age = age;
this.className = className;
this.score = score;
}
3. this关键字
this表示当前对象,用于区分成员变量和局部变量:
java
public void setAge(int age) {
this.age = age; // this.age是成员变量,age是参数
}
4. Getter和Setter方法
封装是面向对象的重要特性,通过公有方法访问私有属性:
java
// Getter:获取属性值
public int getAge() {
return age;
}
// Setter:设置属性值,可以添加验证逻辑
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
} else {
System.out.println(“年龄不合法!”);
}
}
六、创建和使用Student对象
创建测试类:StudentTest
在同一个项目中创建新类:StudentTest
在main方法中测试Student类
java
// StudentTest.java
public class StudentTest {
public static void main(String[] args) {
System.out.println(“=== 学生信息管理系统测试 ===”);
// 1. 使用构造方法创建学生对象 Student student1 = new Student("2023001", "张三", 20, "计算机1班", 89.5); Student student2 = new Student("2023002", "李四", 21, "计算机2班", 92.0); Student student3 = new Student("2023003", "王五", 19, "计算机1班", 85.0); // 2. 调用方法显示学生信息 System.out.println("\n--- 学生1信息 ---"); student1.displayInfo(); System.out.println("\n--- 学生2信息 ---"); student2.displayInfo(); System.out.println("\n--- 学生3信息 ---"); student3.displayInfo(); // 3. 使用Getter方法获取学生信息 System.out.println("\n=== 使用Getter方法 ==="); System.out.println("学生1的姓名:" + student1.getName()); System.out.println("学生2的成绩:" + student2.getScore()); // 4. 使用Setter方法修改学生信息 System.out.println("\n=== 修改学生信息 ==="); student1.setScore(95.0); // 修改成绩 student2.setAge(22); // 修改年龄 System.out.println("修改后学生1的成绩:" + student1.getScore()); System.out.println("修改后学生2的年龄:" + student2.getAge()); // 5. 显示修改后的信息 System.out.println("\n--- 修改后的学生信息 ---"); student1.displayInfo(); student2.displayInfo(); }}
七、运算符的使用
- 算术运算符
java
int a = 10, b = 3;
System.out.println("a + b = " + (a + b)); // 13
System.out.println("a - b = " + (a - b)); // 7
System.out.println("a * b = " + (a * b)); // 30
System.out.println("a / b = " + (a / b)); // 3(整数除法)
System.out.println("a % b = " + (a % b)); // 1(取余数)
double x = 10.0, y = 3.0;
System.out.println("x / y = " + (x / y)); // 3.333…(浮点数除法)
2. 赋值运算符
java
int score = 85;
score += 5; // score = score + 5,现在score=90
score -= 10; // score = score - 10,现在score=80
score *= 2; // score = score * 2,现在score=160
score /= 4; // score = score / 4,现在score=40
3. 比较运算符
java
int age1 = 20, age2 = 22;
System.out.println("age1 > age2: " + (age1 > age2)); // false
System.out.println("age1 < age2: " + (age1 < age2)); // true
System.out.println("age1 == age2: " + (age1 == age2)); // false
System.out.println("age1 != age2: " + (age1 != age2)); // true
4. 逻辑运算符
java
boolean isAdult = true;
boolean hasIDCard = false;
System.out.println("isAdult && hasIDCard: " + (isAdult && hasIDCard)); // false(与)
System.out.println(“isAdult || hasIDCard: " + (isAdult || hasIDCard)); // true(或)
System.out.println(”!isAdult: " + (!isAdult)); // false(非)
八、实践项目:增强版Student类
让我们创建一个更实用的Student类,添加更多功能:
java
// EnhancedStudent.java
public class EnhancedStudent {
// 属性
private String id;
private String name;
private int age;
private String className;
private double[] scores; // 使用数组存储多门课程成绩
// 构造方法 public EnhancedStudent(String id, String name, int age, String className) { this.id = id; this.name = name; this.age = age; this.className = className; this.scores = new double[3]; // 假设有3门课程 } // 设置成绩 public void setScores(double chinese, double math, double english) { scores[0] = chinese; scores[1] = math; scores[2] = english; } // 计算平均分 public double calculateAverage() { double sum = 0; for (double score : scores) { sum += score; } return sum / scores.length; } // 判断是否及格(平均分>=60) public boolean isPassed() { return calculateAverage() >= 60; } // 获取成绩等级 public String getGrade() { double avg = calculateAverage(); if (avg >= 90) return "A"; else if (avg >= 80) return "B"; else if (avg >= 70) return "C"; else if (avg >= 60) return "D"; else return "E"; } // 显示详细信息 public void displayDetails() { System.out.println("========== 学生详情 =========="); System.out.println("学号:" + id); System.out.println("姓名:" + name); System.out.println("年龄:" + age); System.out.println("班级:" + className); System.out.println("语文成绩:" + scores[0]); System.out.println("数学成绩:" + scores[1]); System.out.println("英语成绩:" + scores[2]); System.out.println("平均成绩:" + String.format("%.2f", calculateAverage())); System.out.println("成绩等级:" + getGrade()); System.out.println("是否及格:" + (isPassed() ? "是" : "否")); System.out.println("============================="); } // 简洁信息(用于列表显示) public String getSimpleInfo() { return String.format("%s\t%s\t%d\t%s\t%.2f\t%s", id, name, age, className, calculateAverage(), getGrade()); }}
九、测试增强版Student类
java
// EnhancedStudentTest.java
public class EnhancedStudentTest {
public static void main(String[] args) {
System.out.println(“=== 增强版学生信息测试 ===\n”);
// 创建学生对象 EnhancedStudent student1 = new EnhancedStudent("2023001", "张三", 20, "计算机1班"); EnhancedStudent student2 = new EnhancedStudent("2023002", "李四", 21, "计算机2班"); // 设置成绩 student1.setScores(85.5, 92.0, 88.0); student2.setScores(75.0, 68.5, 59.0); // 显示详细信息 System.out.println("--- 学生1详细信息 ---"); student1.displayDetails(); System.out.println("\n--- 学生2详细信息 ---"); student2.displayDetails(); // 显示简洁信息 System.out.println("\n=== 学生列表 ==="); System.out.println("学号\t姓名\t年龄\t班级\t平均分\t等级"); System.out.println(student1.getSimpleInfo()); System.out.println(student2.getSimpleInfo()); // 测试其他功能 System.out.println("\n=== 功能测试 ==="); System.out.println("学生1是否及格:" + (student1.isPassed() ? "是" : "否")); System.out.println("学生2是否及格:" + (student2.isPassed() ? "是" : "否")); System.out.println("学生1成绩等级:" + student1.getGrade()); System.out.println("学生2成绩等级:" + student2.getGrade()); }}
十、常见问题与调试技巧
问题1:NullPointerException(空指针异常)
java
String name = null;
System.out.println(name.length()); // 错误!name为null
解决:确保对象在使用前已经初始化
问题2:ArrayIndexOutOfBoundsException(数组越界)
java
double[] scores = new double[3];
scores[3] = 90.0; // 错误!有效索引是0,1,2
解决:注意数组索引从0开始,最大索引是长度-1
问题3:变量作用域问题
java
public void someMethod() {
if (true) {
int x = 10;
}
System.out.println(x); // 错误!x只在if块内有效
}
解决:了解变量的作用域,在合适的位置声明变量
IntelliJ IDEA调试技巧:
设置断点:点击代码行号左侧
开始调试:点击右上角的虫子图标或按Shift+F9
单步执行:按F8逐行执行
查看变量:在调试窗口的Variables面板查看变量值
条件断点:右键断点可以设置条件
十一、作业:完善学生信息管理系统
作业要求:
创建一个StudentManagementSystem类
在main方法中实现以下功能:
创建至少3个Student对象
显示所有学生的基本信息
计算并显示所有学生的平均年龄
找出成绩最高的学生并显示其信息
统计及格和不及格的学生人数
作业示例框架:
java
public class StudentManagementSystem {
public static void main(String[] args) {
// 1. 创建学生数组
EnhancedStudent[] students = new EnhancedStudent[3];
// 2. 初始化学生信息 students[0] = new EnhancedStudent("2023001", "张三", 20, "计算机1班"); students[0].setScores(85, 90, 88); students[1] = new EnhancedStudent("2023002", "李四", 21, "计算机2班"); students[1].setScores(75, 82, 79); students[2] = new EnhancedStudent("2023003", "王五", 19, "计算机1班"); students[2].setScores(92, 95, 90); // 3. 显示所有学生信息 System.out.println("=== 所有学生信息 ==="); for (EnhancedStudent student : students) { student.displayDetails(); } // 4. 计算平均年龄 int totalAge = 0; for (EnhancedStudent student : students) { totalAge += student.getAge(); // 需要添加getAge()方法 } double averageAge = (double) totalAge / students.length; System.out.printf("平均年龄:%.2f岁\n", averageAge); // 5. 找出成绩最高的学生 // (需要先为EnhancedStudent添加getAverageScore()方法) // 6. 统计及格人数 int passCount = 0; for (EnhancedStudent student : students) { if (student.isPassed()) { passCount++; } } System.out.println("及格人数:" + passCount); System.out.println("不及格人数:" + (students.length - passCount)); }}
作业扩展挑战(可选):
添加根据成绩排序学生的功能
添加按班级筛选学生的功能
创建一个学生成绩排名表
添加输入功能,让用户从键盘输入学生信息
十二、学习总结
通过本篇文章的学习,你已经掌握了:
✓ Java的基本数据类型和变量
✓ 类的定义和对象的创建
✓ 构造方法的使用
✓ Getter和Setter方法的实现
✓ 基本的运算符使用
✓ 如何设计一个实用的Student类
核心概念回顾:
类 vs 对象:类是模板,对象是根据模板创建的实例
封装:将数据和方法包装在一起,隐藏内部实现细节
构造方法:用于初始化对象
this关键字:引用当前对象
方法重载:同一个类中,方法名相同但参数不同
十三、下一步学习预告
在下一篇文章中,我们将学习:
集合框架(ArrayList):存储多个学生对象
控制流语句(循环):遍历学生集合
实现简单的菜单系统
创建学生信息管理系统的完整框架
十四、学习资源推荐
练习平台:
LeetCode新手村:https://leetcode.cn/problemset/algorithms/
牛客网Java练习:https://www.nowcoder.com/ta/java
CodingBat Java练习:https://codingbat.com/java
参考书籍:
《Java核心技术 卷I》(适合系统学习)
《Head First Java》(适合初学者,图文并茂)
《Effective Java》(适合进阶学习)
在线工具:
Java API文档:https://docs.oracle.com/javase/8/docs/api/
在线Java编译器:https://www.jdoodle.com/online-java-compiler/
代码可视化工具:https://pythontutor.com/java.html
记住,编程是实践的艺术。不要只看不练,多动手编写代码,多思考如何改进。当你遇到问题时,学会如何查找资料和调试程序,这比记住所有语法更重要。
加油!期待看到你的作业成果!🚀