封装
概述
封装是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,比如类和方法
封装的两层含义:
1.对功能的封装,比如一个方法,方法就是对功能的实现
2.对数据的封装,即把对象的属性进行封装
封装的表现:
- 方法就是一个最基本的封装
- 类其实就是一个封装体
private关键字:
是一个权限修饰符,可以用来修饰成员变量和成员方法,被私有化的成员只能在本类中被访问。
注: 私有只是封装的一种体现
封装的好处:
- 提高代码的复用性
- 隐藏实现细节,对外提供可以访问的方法,便于使用者去使用,这是核心之一
- 提高了安全性
封装的原则:
将不需要对外提供的内容都隐藏起来,包括属性和方法,并提供setXxx getXxx 方法对其进行访问
代码练习
代码练习1:封装的必要性
package cn.tedu.oop;
/*本类用来测试封装的必要性*/
public class TestPrivate111 {
public static void main(String[] args) {
Hero h = new Hero();
//修改普通属性的值
h.name = "宋江";
/*需要隐藏的内容需要进行封装,不然能够直接修改值,不安全*/
//h.force = 60; //该属性用private进行封装,不能直接修改值
//打印修改后的属性值
System.out.println(h.name);
//使用提供的方法对封装的属性进行修改和打印
h.setForce_value(60);
System.out.println(h.queryForce_value());
}
}
class Hero{
//定义该类的普通属性
String name = "晁盖";
//封装需要隐藏的内容:武力值
private double force_value = 80;
//提供方法1:对武力值进行查询
public double queryForce_value(){
return force_value;
}
//提供方法2:对武力值进行设置
public void setForce_value(double force_value) {
this.force_value = force_value;
}
}
代码练习:封装属性
package cn.tedu.oop;
/*本类用来练习封装属性*/
public class TestPrivate21 {
public static void main(String[] args) {
Friends f = new Friends();
f.sno = 18;
//f.name = "孟亚军";
//f.subject = "数学分析";
System.out.println(f.sno); //输出结果:18
f.eat();//输出结果:周末一起下馆子
f.play();//输出结果: 一起玩王者荣耀
f.setName("孟亚军");
System.out.println(f.getName());//输出结果: 孟亚军
}
}
class Friends{
//定义普通属性:学号
int sno = 24;
//定义需要隐藏的属性:姓名 , 科目
private String name = "王浩江";
private String subject = "高等代数";
//提供被封装属性的get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
//定义普通方法
public void play(){
System.out.println("一起玩王者荣耀");
}
public void eat(){
System.out.println("周末一起下馆子");
}
}
代码练习:封装方法
package cn.tedu.oop;
/*本类用来测试方法的封装*/
public class TestPrivate3 {
public static void main(String[] args) {
Apple a = new Apple();
//没有封装的方法,调用没有限制
a.clean();
//a.eat(); //由于eat()被封装,所以再此处直接调用会显示报错
}
}
class Apple{
public void clean(){
System.out.println("苹果是洗洗才能吃的");
//再已有的公共方法clean()中调用被封装的私有方法eat()
eat();
}
private void eat(){
System.out.println("我要吃洗过的苹果了");
}
}