面向对象编程三大特征
封装 继承 和 多态
面向对象编程-封装
封装介绍
封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[即方法] ,才能对数据进行操作
举例 : 就好比我们日常使用的电视机 ,电视机的遥控器有很多按钮 ,有的按钮控制开关 ,有的控制音量 ,这其实就是一种封装 ,因为开机关机的执行过程十分复杂 ,但是我们只需要一个按键就可以实现 ,这就是封装
封装的理解和好处
-
隐藏实现细节 方法 < -- 调用
例如连接数据库 ,具体实现我们不管 ,我们只需要考虑如何传入数据
-
可以对数据进行验证,保证安全合理
Person{name,age}
Person p = new Person();
p.name = "jack";
p.age = 1200;
//实际上没有人能够活到1200岁,但是这样做程序也会允许
//因为这个过程中我们没有对数据进行验证合理性
//因此接下来就可以使用封装来实现对数据进行验证
封装的实现步骤
-
将属性进行私有化private 【不能直接修改属性】
-
提供一个公共(public)的set方法,用于对属性判断并赋值
public void setXxx(类型 参数名){//这里的Xxx表示某个属性
//加入数据验证的业务逻辑
属性 = 参数名;
}
-
提供一个公共(public)的get方法,用于获取属性的值
public 数据类型 getXxx(){ //权限判断,调用者是否有权限返回
return XX;
}
● 快速入门案例
看一个案例
那么在java中如何实现这种类似的控制呢?
-
请大家看一个小程序(Encapsulation01.java), 不能随便查看人的年龄, 工资等隐私 ,并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认的值
-
年龄必须在1-120 , 工资不能直接查看 , name的长度在 2-6 字符 之间
package com.edu.encap;
import com.sun.xml.internal.ws.api.ha.StickyFeature;
import java.util.Scanner;
public class Encapsulation01 {
public static void main(String[] args) {
//如果要使用快捷键alt + r需要先配置主类
//先用右键run一次,之后就可以使用快捷键了
Person person = new Person();
person.setName("jackxxxxxxxx");
person.setAge(130);
person.setSalary(30000);
System.out.println(person.info());
System.out.println(person.getSalary());
}
}
//- 请大家看一个小程序(Encapsulation01.java), 不能随便查看人的年龄, 工资等隐私 ,
// 并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认的值
//- 年龄必须在1-120 , 工资不能直接查看 , name的长度在 2-6 字符 之间
class Person{
public String name;//名字公开
private int age;//年龄私有
private double salary;//工资私有
//手写set 和 get太慢了 ,可以使用快捷键来解决
//alt+insert
//之后根据要求完善代码
public String getName() {
return name;
}
public void setName(String name) {
//加入对数据的校验
if (name.length() >= 2 && name.length()<=6){
this.name = name;
}else {
System.out.println("名字的长度不对,需要2-6个字符,赋予默认名字");
this.name = "noname";
}
}
public int getAge() {
return age;
}
public double getSalary() {
Scanner sc = new Scanner(System.in);
System.out.println("查看工资需要输入密码:");
String input = sc.nextLine();
if (input.equals("111") ){
return salary;
}else {
return -1;
}
}
public void setSalary(double salary) {
this.salary = salary;
}
public void setAge(int age) {
//判断
if (age>=1&&age <=120){
this.age = age;
}else {
System.out.println("你设置的年龄不合规范,需要在1-120之间,因此给默认年龄18");
this.age = 18;
//如果年龄不符合规范就给默认年龄,也就是18
}
}
//写一个方法,返回属性信息
public String info(){
return "信息为 name= "+name+" age="+age+" 薪水"+salary;
}
}
将构造器和setXXX结合
public Person(String name, int age, double salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//可以将set方法写入到构造器中,这样就可以验证
setName(name);//这里没有写this,因为set和this是等价的
setAge(age);
setSalary(salary);
}
去除函数传参提示 : settings -> editor -> inlay hints -> java - > parameter hints - >取消勾选 show parameter hints for
练习
com.edu.encap包: AccountTest.java和Account.java
创建程序, 在其中定义两个类:Account和AccountTest类体会Java的封装性。
-
Account类要求具有属性:姓名(长度为2位3位或4位)、余额(必须>20)、 密码(必须是六位),如果不满足,则给出提示信息,并给默认值
-
通过setXxx的方法给Account的属性赋值。
-
在AccountTest中测试
-
提示知识点:
String name = "";
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用