封装
为什么要封装
- 现阶段我们定义的属性,对象可以随便的访问,随意的修改不受控制,封装的思想就是吧成员变量隐藏起来。
封装是什么 - 封装是“合理隐藏,合理暴露”。
- 基本实现规范: 封装一般是把成员变量(属性)隐藏起来,提供方法进行合理的暴露访问。
封装的步骤
- 需要使用private关键字修饰属性。
- private:私有,隐藏的含义。修饰的成员只能在当前类中被直接访问。否则报错!
- 需要提供成套的公开的getter和setter方法暴露成员变量的取值和赋值。
- getter方法:get+成员变量首字母大写的方法返回该成员变量的值。
- setter方法:set+成员变量首字母大写的方法对成员变量赋值。
封装的作用
可以提高代码的安全性,组件化和复用性。
封装是面向对象的特征和规范
即使代码毫无意义我们以后的代码风格还是要这样写(成员变量私,方法暴露出来!)
public class PackageDemo {
public static void main(String[] args) {
Student boNiu = new Student();
boNiu.setAge(21); // 赋值,这里的数据必须满足0 - 200之间,否则赋值会失败!
boNiu.setName("赵丽颖");
System.out.println(boNiu.getAge()); // 取值
System.out.println(boNiu.getName()); // 取值
boNiu.study();
}
}
class Student{
private String name ; // 只能在本类中访问
private int age ; // 只能在本类中访问
public void setAge(int a){
if(a > 0 && a < 200){
age = a;
}else{
System.out.println("您的年龄输入有误,请确认!");
}
}
public int getAge(){
return age;
}
public void setName(String n){
name = n ;
}
public String getName(){
return name;
}
public void study(){
System.out.println("好好学习,认真听课~~~~");
}
}
this关键字
我们之前定义的set方法的入参的名称没有做到“见名知意”,参数名称没有实际含义。但是参数名称写的有意义的时候又与成员变量名称冲突了,导致数据赋值失败。
例如:这个定义的n没有见名知意,但是如果把 n 换成name那么就重复了
public void setName(String n){
name = n ;
}
解决的方法 this关键字
- this代表了当前对象的地址引用。
- this在方法中,谁调用这个方法,this就代表了谁。
- this用在方法中可以区分变量是访问局部变量还是访问成员变量:从而实现局部变量的见名知意,又不会冲突!
public class PackageDemo {
public static void main(String[] args) {
// 1.创建对象
Student wangLe = new Student();
wangLe.setName("王乐"); // 赋值
wangLe.setAge(19); // 赋值
System.out.println(wangLe.getName()); // 取值
System.out.println(wangLe.getAge()); // 取值
wangLe.study();
}
}
class Student{
private String name ; // 只能在本类中访问
private int age ; // 只能在本类中访问
// public 是公开的含义,可以直接暴露出去被访问的。
// this在Java中代表了当前对象的地址引用。
// this在方法中,谁调用这个方法,this就代表了谁。
// this用在方法中可以区分变量是访问局部变量还是访问成员变量。
public void setAge(int age){
this.age = age; // this.age = 19 wangLe.age = 19
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name ; // this.name = 王乐 wangLe.name = 王乐
}
public String getName(){
return name;
}
public void study(){
System.out.println("好好学习,认真听课~~~~");
}
}
注意:
setter和getter方法可以编译器直接生成
鼠标右击—>选中Generate—>选中Setter and Gertter—>按住Shift键然后直接点击最后一个则直接全部选中。