简单的认为就是:一个电视机,你不知道里面是有什么东西在运转,但是你可以通过遥控器或者电视表面的按钮来调整电视的分辨率之类的,所以封装性就是指将用户不需要了解的东西封装起来,只提供服务的接口
一、面向对象的三大特征
封装 (Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)
二、封装
1、什么是封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
2、封装的分类与好处
狭义的封装:属性的封装与方法的封装
广义的封装:包的管理、组件、框架、应用程序...
好处:
将变化隔离
便于使用
提高重用性
提高安全性
三、封装与隐藏
例如:使用者对类内部定义的属性的直接操作会导致数据的错误、混乱或安全性问题。
public class TestEncapsulation {
public static void main(String[] args) {
Account a = new Account();
/*a.balance = 1200;//随意更改不安全
a.balance = -1200;*/
boolean result = a.save(1200);
System.out.println("存钱:"+result+",现在账户余额:"+a.getBalance());
result = a.save(-1200);
System.out.println("存钱:"+result+",现在账户余额:"+a.getBalance());
result = a.withdraw(100);
System.out.println("取钱:"+result+",现在账户余额:"+a.getBalance());
result = a.withdraw(2000);
System.out.println("取钱:"+result+",现在账户余额:"+a.getBalance());
}
}
/*class Account{
double balance;
}*/
class Account{
private double balance;//封装隐藏
//提供公共的访问方式
//1、获得账户余额
public double getBalance(){
return balance;
}
//2、对余额的修改只能通过save和withdraw两个方法操作
public boolean save(double money){
if(money>0){
balance += money;
return true;
}
return false;
}
public boolean withdraw(double money){
if(money > 0 && money <= balance){
balance -= money;
return true;
}
return false;
}
}
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
属性的封装:使用者只能通过事先定制好的方法来访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作;
方法的封装:使用者按照既定的方式调用方法,不必关心方法的内部实现,便于使用;
便于修改,增强代码的可维护性;
/*
* 创建程序,在其中定义两个类:Person和TestPerson类。定义如下:
用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。
在TestPerson类中实例化Person类的对象p,调用setAge()和getAge()方法,体会Java的封装性。
*/
public class TestPerson {
public static void main(String[] args) {
Person p = new Person();
p.setAge(22);
System.out.println(p.getAge());
}
}
class Person{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>0 && age<130){
this.age = age;
}
}
}