【Java—面向对象】:封装的艺术
Hello,大家好呀,我是Yize,今天是2月11日,农历腊月二十四,也是南方的小年,在这里祝各位南方的朋友小年快乐!
言归正传,今天我要来分享的内容是面向对象!
大家知道面向对象有三大特性:封装、继承、多态,是一个非常基础但核心的编程概念!
那么今天我们首先从封装开始,一起进入我们的快乐学习时间!
目录
什么叫类
在学习封装之前,我们首先要提出一个问题,什么叫类呢?类(Class)是构建程序的核心抽象单
元,他们是独立的、有逻辑的在代码中体现如下:

这是我在写拼图小游戏时进行的类的封装,APP的图标上有个小三角,我们称它为测试类,也叫作程序主入口,其中GameJFrame,LoginJFrame,RegisterJFrame就是我们要学习的类,其里面打包在一起的内容我们称为封装。
测试类与我们要封装数据的类具体区别在哪呢?如下:
//学生类
public class Student {
//xxx
}
//学生测试类
public class StudentDemo {
public static void main(String[] args) {
//xxx
}
}
=========================================================================
private关键字
在学习封装之前,我们要先了解一下private关键字:
private是一个修饰符,可以用来修饰成员(成员变量,成员方法)
被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
示例代码如下:
/*
学生类
*/
public class Student {
//成员变量
private String name;
private int age;
//构造方法(空参和全参)
public Student (){};
public Student (String name,int age){
this.name = name;
this.age= age;
};
//get/set方法
public void setName(String n) {name = n;}
public String getName() {return name;}
public void setAge(int a) {age = a;}
public int getAge() {return age;}
//show方法
public void show() {System.out.println(name + "," + age);}
}
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用set方法给成员变量赋值
s.setName("张三");
s.setAge(30);
s.show();
//使用get方法获取成员变量的值
System.out.println(s.getName() + "---" + s.getAge());
System.out.println(s.getName() + "," + s.getAge());
}
}
同时,这个学生类的内容也被我们称为标准JavaBean,即:
- 私有化成员变量;
- 空参构造方法--带全部参数的构造方法;
- get/set方法。
说到这里,我们不得不去提一下构造方法和set/get方法以及this关键字了。
构造方法是一种特殊的方法
作用:创建对象 Student stu = new Student();
格式:
public class 类名{
//构造方法
修饰符 类名( 参数 ) {
//xxx
}
}
功能:主要是完成对象数据的初始化
set/get方法
至于set/get方法,通过代码我们能够看出,set方法可以安全修改其值,get方法能够获取值,即:
set 方法 = 给变量“赋值”的安全通道get 方法 = 取变量值的“专用窗口”
this关键字
this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)
方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
方法的形参如果不与成员变量同名,不带this修饰的变量指的是成员变量
可以简单理解为:“this代表当前正在操作的对象”。
现在我们就已经了解了标准JavaBean的基本格式要求。
=========================================================================
封装的作用
最后,我们可以正式去探讨封装的作用了,为什么要用封装成类?
我们可以将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问;
这样有什么优点呢?通过方法不是一样可以操作吗?
我们来想一下,如果我们将所有代码写在同一个类中,仅仅去打包成不同的方法,这样会出现以下问题:
数据暴露:任何代码均可直接修改name和age,导致状态不可控(如StudentUtils.age = -100);
逻辑分散:验证逻辑(如年龄非负)与数据操作耦合在方法中,难以维护;
无法扩展:若需新增属性(如学号),需修改所有依赖该数据的方法。
但是如果我们封装成类就不一样了,如下:
数据隐藏
通过private修饰属性,强制通过公共接口(方法)访问数据,这样外部代码无法直接修改age,必须通过setAge()方法,确保数据有效性,并且验证逻辑集中在一个方法内,修改时只需调整一处。
行为抽象
类将数据和操作数据的方法绑定,形成独立的逻辑单元。
模块化与可维护性
类的内部修改(如新增属性)不影响外部代码,只要接口不变;并且相关数据和逻辑集中在一个类中,便于理解和维护。
支持继承与多态
封装是继承和多态的基础(这个我们目前不用去管)。
=========================================================================
总结
最后,我们就要去总结一下了!
1. 为什么定义成员变量要用private 修饰符?
强制通过方法控制数据访问,防止外部随意修改导致数据非法或状态混乱;
2. 构造方法以及set/get方法都有什么作用呢?
构造方法主要是用来创建对象并对对象的属性进行初始化,set方法就是安全地修改成员变量的值,get方法就是安全地获取成员变量的值
3. 封装成类有什么需要注意的点吗?
保证功能单一性:比如有个 User 类,register 方法就专心完成用户注册流程,不掺杂登录等其他功能的逻辑。
降低类与外部的耦合度:比如一个计算类,应独立于调用它的业务类,只专注于自己的计算功能,不依赖特定业务场景的代码。
数据一致性:在 set 方法里增加对数据的验证。像设置用户年龄时,若输入负数就应拒绝,保证年龄数据合理。
见名知意
我们今天的内容就此分析完毕,后面会继续向大家分享一些有趣的知识!我们下次见!!!
更多推荐



所有评论(0)