目录
面向对象开发的三大特性:封装,继承,多态
一、封装
封装 : 可见范围的问题,体现的就是易用性与保护性。
1. private关键字实现属性的封装
看见private关键字:只在当前类的内部可见,出了类的{ },对外部完全隐藏。
public关键字:被public修饰的内容,在当前项目中都可见,描述公共的,公开的内容
public和private都称为访问修饰符,描述属性或方法的可见性
在我们现实生活中,将汽车比作一个类,对于汽车这个类来说,不同属性的可见性是不同的
发动机这个属性: 只在汽车引擎盖的内部可见
汽车座椅这个属性:在汽车内部可见
倒车镜这个属性:在汽车的内外部都可见
在下列代码中,CPU和memory这两个属性用privative修饰,只在当前类Computer中可见,外界是无法访问这俩个属性的。screen这个属性用public修饰,在当前项目都可见。
class Computer {
// 这个属性的可见性只在Computer类的内部可见,对类的外部完全隐藏!
private String cpu;//CPU
private String memory; // 内存
public String screen; // 显示器
}
2. getter与setter
当属性被private封装(隐藏)之后,在类的外部要想使用这些属性,必须通过类对外提供的方法来使用
getter:在类的外部获取某些private属性值
setter: 在类的外部设置某些private属性值
2.1 封装体现出来的保护性:
银行卡账户的卡号、密码、余额
将银行卡比作一个类,产生一个银行卡对象,如果卡号、密码、余额这三个属性不隐藏,则只要能拿到银行卡对象(现实生活中的银行卡卡片),都可以随意修改这三个属性值,随意修改密码,随意修改余额。有了private之后,就算拿到银行卡的卡片,也不能随意取得以及修改这三个属性值。银行卡对象一旦产生,卡号不能修改,因此只需要对外提供getter即可;密码、余额既可以修改也要获得,因此需要对外提供getter与setter方法。(没有写余额的getter和setter方法)
BankCard类:
public class BankCard {
// 卡号
private String cardNum;
// 密码
private String password;
// 余额
private double balance;
private Scanner scanner = new Scanner(System.in);
public BankCard(String cardNum, String password) {
this.cardNum = cardNum;
this.password = password;
}
// 对于卡号来说,只需要取得值
public String getCardNum() {
System.out.println("请输入您的密码 : ");
String pass = scanner.nextLine();
if (this.password.equals(pass)) {
System.out.println("密码正确,正在为您查询卡号");
return this.cardNum;
}
return "密码错误,请查证后重新输入";
}
public String getPassword() {
System.out.println("发送手机验证码 ....");
// 匹配验证码
return this.password;
}
public void setPassword() {
System.out.println("请输入您之前的密码 : ");
String pass = scanner.nextLine();
if (this.password.equals(pass)) {
System.out.println("请输入新密码 : ");
pass = scanner.nextLine();
this.password = pass;
System.out.println("密码修改成功,请通过新密码登录");
}else {
System.out.println("密码错误,请查证后再输入");
}
}
}
Test类:
public class Test {
public static void main(String[] args) {
BankCard bankCard = new BankCard("13467","123456");
String num = bankCard.getCardNum();
System.out.println(num);
String pass = bankCard.getPassword();
System.out.println(pass);
// 设置新密码
bankCard.setPassword();
System.out.println("获取银行卡号 : " + bankCard.getCardNum());
}
}
类的外部要操作这些属性,必须使用类提供的方法来操作,就可以对使用者使用属性做一些规则和要求。若不使用private封装,则使用者就可以随心所欲的操作属性,无法管控 !
2.2 封装体现出来的易用性:
汽车的一键启动
汽车内部有许多复杂的工作步骤,然而我们并不需要懂汽车内部是如何工作的,如何工作只需要交给设计者来设计,我们只需要一个按钮(方法)一键启动就好了。用户只需要使用这个方法就可以将汽车成功启动,不关心有哪些具体属性,以及这些属性内部咋工作。
Car类:
public class Car {
// 汽车发动机
private String engine;
// 变速箱
private String biansu;
// 火花塞
private String huoHua;
// 轮子
private String wheel;
// 一键启动按钮
public void startUp() {
engine = "点火";
biansu = "工作";
wheel = "轮子转动";
System.out.println("汽车已经成功启动 ~~");
}
}
Car car = new Car();
car.startUp();//一键启动汽车
思考: private能否直接修饰一个类?
答:类定义出来为了创建对象,private修饰的内容只在当前类中可见。
假设 : private可以修饰类 这个类定义之后不见了(有矛盾!)
3. 关于封装的总结:
1.封装:使用private进行属性和方法的封装 保护性与易用性
private Java的访问修饰符,表示属性或方法的可见性
2.被private修饰的属性或方法只在当前类的内部可见,出了当前类{ }对外部完全隐藏
在类的外部操作这些私有属性,需要类提供getter(在外部获取私有属性方法)与setter(在类的外部设置私有属性)方法
到底哪些属性且备getter与setter要看实际情况来定3.IDEA 快捷生成getter与setter快捷键:alt + insert(智能添加方法快捷键)