封装
0. 背景
- 面向对象编程 是 对客观世界的模拟
- 成员变量隐藏在对象内部,外界无法直接触碰
比如 人有一副皮囊,里面包裹各种器官,外界无法接触。 - 这样就很好理解封装的保护作用:防止该类的代码被其他类随便访问
封装的原则
:将属性隐藏,提供公共方法给外界访问的窗口
比如 人的嘴唇、耳朵等 可以大概理解为公共方法
1. 封装的步骤
- 使用
**private**
关键字修饰 成员变量 - 给其他类提供公共方法:给外界需要访问的成员变量,提供一对方法:
getXxx
方法、setXxx
方法
2. private关键字的使用方法(即封装操作)
2.1 private的含义
private
是权限修饰符,是最小的权限- 修饰对象 : 成员变量 、 成员方法
- 被修饰的成员变量和成员方法,仅能在本类中访问,即类自身访问
2.2 private的使用方法
private 数据类型 变量名
修饰成员变量:
public class Student{
private String name;
private int age;
public void setName(string n){
name = n;
}
public String getName(){
return name;
}
public void setAge(int a ){
age = a;
}
public int getAge(){
return age;
}
}
如果改成:
public void setName(string name){
name = name;
}
public void setAge(int age){
age = age;
}
会导致成员变量赋值失败
原因:形参变量名和成员变量名重名,导致成员变量名被隐藏
成员变量无法被访问,导致赋值失败
3. 优化1—this关键字
3.1 this的含义
this
:所在类的当前对象的引用(地址值),就是对象自己的引用- 方法被对象调用,方法中的this就代表那个对象
谁在调用,this就代表谁
3.2 this使用方法
this.成员变量名
使用this
修饰方法中的变量,就可以解决成员变量被隐藏的问题
public class Student{
private String name;
private int age;
public void setName(string name){
//
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
//
this.age = age;
}
public int getAge(){
return age;
}
}
4. 优化2—构造方法
- Java自动提供无参数构造方法
- 创建Java对象的时候,构造方法被用来初始化对象,给对象的成员变量赋初值
- 自己定义构造方法,则原始无参数构造方法失效
4.1 构造方法的定义格式
修饰符 构造方法名(参数列表){
//方法体
}
注意点:⭐
- 构造方法名必须和其所在类名相同
- 没有返回值,所以不需要定义返回值类型,void也不用写
public class Student{
private String name;
private int age;
//无参数构造方法
public Student{
}
//有参数的构造方法
pubilc Student(String name,int age){
this.name = name;
this.age = age;
}
}
构造方法的注意点:
5. JavaBean
JavaBean
是Java语言编写类的标准规范,要求:
1. 类是具体且公开的
2. 有无参数的构造方法
3. 提供用来操作成员变量的set
和get
方法
public class ClassName{
//成员变量
//构造方法
//无参构造方法【必须】
//有参构造方法【建议】
//成员方法
//getXxx()
//setXxx()
}
举例代码:
public class Student{
//成员变量
private String name;
private int age;
//构造方法
//无参数构造方法
public Student{
}
//有参数的构造方法
pubilc Student(String name,int age){
this.name = name;
this.age = age;
}
//成员方法
public void setName(string name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
测试类:
public class TestStudent{
public static void main(String[] args) {
//无参构造函数的使用
Student s = new Student();
s.setName("小猪");
s.setAge(18)
System.out.println(s.getName()+"..."+s.getAge());
//有参构造函数的使用
Student s1 = new Student("小猪",18);
System.out.println(s1.getName()+"..."+s1.getAge());
}
}