封装(Encapsulation)是面向对象三大特征之一(封装、继承、多态),它指的是将对象的状态信息隐藏在内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
对一个类或对象实现良好的封装,可以实现以下目的:
隐藏类的实现细节。
让使用者只能通过事先预定的方法访问数据,从而可以在该方法里加入控制逻辑,限制对属性不合理访问。
可进行数据检查,从而有利于保证对象信息的完整性。
便于修改,提高代码的可维护性。
为了实现良好的封装,需要从两个方面考虑:
1. 将对象的属性和实现细节隐藏起来,不允许外部直接访问。2. 把方法暴露出来,让方法来操作或访问这些属性。
访问控制符的使用总结:
类中绝大部分属性应该使用private修饰,除了一些static修饰的、类似全局变量的属性,才考虑使用public修饰。 有些方法只是用于辅助实现该类的其他方法,这些方法被称为工具方法,也应用private修饰。
如果某个类主要用作其他类的父类,该类里包含的大部分方法可能仅希望被其子类重写,而不想被外界直接调用,则应该使用protected修饰这些方法。
希望暴露出来给其他类自由调用的方法使用public修饰。
顶级类通常都希望被其他类自由使用,所以大部分顶级类都使用public修饰。
Person类的封装案例
package day05;
public class Person{
public String name;
protected String sex;
int age;
public String cardId;
//Object(){}
public Person(){
System.out.println("---Person的构造器------");
}
public void study(String name){
}
/**
* 与父类中方法 完全一致(指的什么一致)
*/
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age
+ ", cardId=" + cardId + "]";
}
}
/**
* 非私有的属性
*/
2.Student继承Person类的实现
package day05;
/**
* student 子类
* Person 父类
* @author yaohongbo
*
*/
public class Student extends Person{
public String cardId;
private String school;
public Student() {
//card赋值
//super.cardId="0x111111";
this.cardId="0xxxxxx111";
System.out.println("----Student构造器-----");
}
public String getCardId(){
return cardId;
}
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu.cardId);
}
@Override
public String toString() {
return "Student [cardId=" + cardId + "]";
}
}
//学生 和 人 是什么关系 现实中 //查证 is kind of
//is a
//学生 是人的一种表现形式
//汽车Car 宝马汽车
2.创建测试类
package day05;
public class Test {
public static void main(String[] args) {
Student stu = new Student();
/*stu.name="陈红军";
stu.age=28;
stu.sex="女";*/
//System.out.println(stu.getCardId());
//理解修饰符的访问权限
//理解变量隐藏
//理解内存分配的过程
String temp = stu.getCardId();
System.out.println(temp);
}
}
对于class的权限修饰只可以用public和default(缺省);
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
1.隐藏一个类中不需要对外提供的实现细节;
2.使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
3.便于修改,增强代码的可维护性;