Java基础重新学习记录(二):从类、对象到封装,我开始理解Java面向对象思想
前言
这是我重新学习 Java 后的第三篇学习记录。
上一篇主要记录了 Java 基础部分的学习过程,包括:
- 变量
- 条件判断
- 循环
- 数组
- String
- Scanner
- 方法
- 参数
- 返回值
这一阶段最大的收获是:
我开始从“看懂代码”慢慢转变成“尝试自己写代码”。
但是继续学习之后,我发现:
前面的知识更多是在解决:
如何让程序完成某个功能。
例如:
计算两个数字的结果:
public static int multiply(int a,int b){
return a*b;
}
它关注的是:
“这个功能应该怎么实现?”
但是当程序越来越复杂之后,就会出现新的问题:
如果我要表示一个学生、一件商品、一本书,应该如何组织这些数据?
如果所有东西都写在一个 main 方法里面,代码会越来越混乱。
所以这一阶段,我开始学习 Java 面向对象基础:
- 类(class)
- 对象(object)
- 构造方法
- this
- private
- getter/setter
- 封装
同时继续保持之前的学习方式:
自己尝试 → 出现问题 → 分析原因 → 修改代码 → 重新理解。
一、从方法到类:开始思考代码结构
学习方法的时候,我更多关注:
“一个功能应该怎么写?”
例如:
public static int multiply(int a,int b){
return a*b;
}
这个方法可以完成两个数字相乘。
但是如果现在需要表示一个学生:
例如:
- 姓名
- 年龄
- 成绩
如果直接写:
String name = "小明";
int age = 20;
double score = 90;
当学生数量增加的时候,就会变得越来越混乱。
例如:
String name1;
int age1;
String name2;
int age2;
String name3;
int age3;
这种方式很明显不方便。
所以我开始理解:
类的作用,就是把一类事物的数据和行为组织到一起。
例如:
学生可以抽象成:
Student
这个类。
二、第一次创建自己的类:Student
学习类的时候,我首先练习了 Student。
例如:
public class Student {
String name;
int age;
}
这里:
Student
就是一个类。
它描述了学生应该具有哪些属性。
例如:
Student
属性:
- name
- age
但是这个时候的 Student 只是一个模板。
它还不是现实中的某一个学生。
如果想真正拥有一个学生,需要创建对象。
三、类和对象:理解 new 到底做了什么
之后开始学习对象。
例如:
Student student1 = new Student();
Student student2 = new Student();
刚开始看到这段代码的时候,我知道:
new 是创建对象。
但是之前并没有真正理解为什么需要对象。
后来通过练习,我慢慢理解:
类更像是一张设计图。
例如:
Student类
规定:
学生应该有什么属性
而:
student1
student2
才是真正创建出来的学生对象。
虽然它们都是 Student 类型,但是保存的数据可以不同。
例如:
student1.name = "小明";
student2.name = "小红";
两个对象都是学生,但是它们的数据不同。
所以:
类是模板,对象是根据模板创建出来的具体实例。
这是我对面向对象理解的第一个重要变化。
四、构造方法:让对象创建时拥有数据
继续学习对象的时候,我发现:
如果每次创建对象之后,都需要:
student.name = "小明";
student.age = 20;
会比较麻烦。
所以开始学习构造方法。
例如:
public class Student {
String name;
int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
}
创建对象:
Student student = new Student("小明",20);
这样对象创建的时候,就可以直接完成初始化。
相比之前:
new Student();
student.name = "小明";
student.age = 20;
更加方便。
这让我开始理解:
构造方法的作用,就是在创建对象的时候完成初始化。
五、this:第一次真正理解它的作用
在学习构造方法的时候,this 是让我比较困惑的一个知识点。
例如:
public Student(String name,int age){
this.name = name;
this.age = age;
}
刚开始我会疑惑:
为什么不能直接写:
name = name;
后来理解:
这里其实存在两个同名变量。
一个是成员变量:
this.name
代表当前对象自己的属性。
另一个是参数:
name
代表传入构造方法的数据。
所以:
this.name = name;
表示:
当前对象的 name 属性,等于传入进来的 name 参数。
this 的作用,就是帮助 Java 区分:
对象自己的属性。
和:
方法里面传入的参数。
六、封装:为什么需要 private?
继续学习面向对象时,我开始接触封装。
刚开始我的理解比较简单:
把变量改成 private,然后生成 getter/setter。
但是后面练习之后,我发现:
封装真正解决的问题不是代码格式。
而是:
限制外部随意修改对象内部的数据。
例如:
如果属性直接公开:
student.age = -100;
这种明显不合理的数据也可以被修改。
所以:
private int age;
表示:
这个属性不能被外部直接访问。
需要通过方法控制访问。
七、Book 练习:第一次使用 getter/setter
之后进行了 Book 类练习。
例如:
public class Book {
private String title;
private double price;
}
因为属性变成了 private:
private String title;
外部不能直接:
book.title;
所以需要提供:
getter:
public String getTitle(){
return title;
}
setter:
public void setTitle(String title){
this.title = title;
}
价格也是同样的方式。
刚开始学习 getter/setter 时,我觉得:
为什么不能直接修改?
例如:
book.price = 50;
为什么还需要:
book.setPrice(50);
后来理解:
因为方法可以增加控制。
例如:
如果以后要求价格不能小于 0:
public void setPrice(double price){
if(price >= 0){
this.price = price;
}
}
这样就可以避免错误数据进入对象。
这也是封装真正的意义。
八、Product 练习:继续理解对象设计
之后又练习了 Product 类。
例如:
public class Product {
private String name;
private double price;
private int stock;
}
分别表示:
- 商品名称
- 商品价格
- 商品库存
然后为它们添加:
getName()
setName()
getPrice()
setPrice()
getStock()
setStock()
通过这个练习,我开始更加熟悉:
一个类通常包含:
类
├── 属性
└── 方法
属性表示:
对象有什么。
方法表示:
对象可以做什么。
九、这一阶段最大的变化:从写功能到设计结构
学习 Java 基础的时候,我更多考虑:
“我要输出什么?”
“我要计算什么?”
但是学习面向对象之后,我开始思考:
如果以后开发真实项目:
用户信息应该如何表示?
商品信息应该如何保存?
不同的数据之间有什么关系?
这也是为什么后端开发中大量使用面向对象思想。
因为真实项目不是几个变量和几个方法组成的。
而是很多对象之间相互协作。
十、目前对 class、object、new 的理解
经过这一阶段练习,我现在对几个概念的理解:
class
类,是一种模板。
例如:
Student
描述学生应该有什么。
object
对象,是根据类创建出来的具体实例。
例如:
Student student = new Student();
创建了一个学生对象。
new
new 用来创建对象。
例如:
new Student();
表示创建一个新的 Student 对象。
十一、重新学习 Java 后的变化
重新学习 Java 的过程中,我越来越发现:
真正困难的不是记住某个语法。
而是理解:
为什么需要它,以及它解决了什么问题。
以前看到:
Student student = new Student();
可能只是知道:
“这是创建对象。”
但是现在开始理解:
它代表:
- 根据 Student 类创建对象
- 调用构造方法初始化数据
- 将创建出来的对象交给 student 保存
虽然现在还没有深入学习 JVM 原理,但是已经开始建立面向对象思维。
十二、目前 Java 学习进度
目前已经重新学习并练习:
- Java 基础语法
- 变量
- 条件判断
- 循环
- 数组
- String
- Scanner
- 方法
- 参数
- 返回值
- boolean
- 类
- 对象
- 构造方法
- this
- private
- getter/setter
- 封装
接下来还需要继续补充:
- 继承
- super
- 方法重写
- 多态
- ArrayList
- HashMap
- 异常处理
然后进行一次 Java 综合练习,把之前学习的内容真正串起来。
总结
重新学习 Java 到现在,我最大的变化是:
从以前:
“这个代码为什么这样写?”
慢慢变成:
“这个对象应该保存什么数据?应该提供什么方法?”
这也是面向对象思想带给我的最大改变。
后续我会继续完成 Java 基础补充,并通过综合练习检验自己是否真正掌握。
代码仓库
本文学习过程中的相关代码已经同步上传到 GitHub:
GitHub:
https://github.com/jiayi-dev/java-learning
欢迎交流学习,也欢迎参考代码。
本文使用 AI 工具辅助整理文章结构,内容基于本人实际学习过程、代码实践以及学习记录整理。
浙公网安备 33010602011771号