什么是封装呢?
如果我们想给别人发一个快递,快递小哥需要把我们需要寄的物品,封装进一个快递盒。这样既能保证我们寄的物品完好无损,又能防止他人偷看我们寄出的物品,保证隐私安全。
同理,我们类的封装也有着同样的目的。类的封装,是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息。
下面是一个没有经过封装的类。
public class Person {
String name; //姓名
int age; //年龄
public void eat() {
System.out.println("人会吃饭");
}
public void sleep(){
System.out.println("人会睡觉");
}
}
封装一个类
那么我们如何来封装一个类呢?
这里要用到一个关键字——private
private(当前类访问级别)
如果类的成员被private修饰,那么这个成员只能在本类中被访问,其他的类则无法访问。
private可修饰成员变量,也可修饰成员方法。
下面是被修饰后的Person类
public class Person {
private String name; //姓名
private int age; //年龄
public void eat() {
System.out.println("人会吃饭");
}
public void sleep(){
System.out.println("人会睡觉");
}
}
方法也可以封装,但不一定要封装,这是根据具体的业务需要来决定的,所谓封装即控制访问的权限。这里为了方便演示,只对成员变量进行封装。
当我们在Text类中去调用被private修饰的成员变量时,编译器就会报错 ,达到了封装的目的。
get set方法
那么我们在其他的类中,如何才能访问到被封装的数据呢?
既然无法直接调用,那么我们可以通过创建成员方法来访问到类中的数据。
我们用set方法来为成员变量赋值,用get方法来访问被封装的成员方法。
注:get set只是一个名字,也可以使用其他的命名,不过为了规范起见,不要起其他的名字。get/set后面跟上变量名,变量名首字母大写,如getName setName。
public class Person {
private String name; //姓名
private int age; //年龄
public String getName() {
return name; //将name作为返回值,返回给其他类
}
public void setName(String name1) {
name = name1; //把其他类中传进来的值name1,赋值给本类的name
}
public int getAge() {
return age; //将age作为返回值,返回给其他类
}
public void setAge(int age1) {
age = age1; //把其他类传进来的值age1,赋值给本类的age
}
public void eat() {
System.out.println("人会吃饭");
}
public void sleep(){
System.out.println("人会睡觉");
}
}
在Text类中直接调用get set方法即可实现成员变量的赋值和访问
this关键字
在上面的get set方法的设计中,虽然完成了成员变量的赋值和访问,还存在着一些不足。作为追求完美的程序员,像name1,age1这样的变量名,都是不够完美的。那么,我们就可以用this关键字来使我们的get set方法变完美。
this关键字
1.调用本类的成员变量
2.调用本类的成员方法
3.调用本类的构造方法,但调用构造方法时要注意,只能在构造方法中使用this调用构造方法,不可在成员方法中调用,且this调用构造方法必须是该方法的第一条执行,并且只能出现一次。
下面就用代码来解释一下这三条。
1.调用本类的成员变量
class Person{
int age;
public Person(int age) { //带参构造法
this.age = age; //将传进来的数值赋值给本类的age
}
}
2.调用本类的成员方法
class Person{
public void eat() {
}
public void sleep() {
this.eat(); //在sleep方法中调用本类的eat方法
}
}
3.调用本类的构造方法
class Person{
public Person(){ //无参构造法
}
public Person(int age){
this(); //在带参构造法中,调用了无参构造法
}
}
完美版get set方法
知道了 this 关键字的基本使用方法后,我们就来完善一下 get set 方法:
将我们之前的 name1 和 age1,直接改为 name 和 age ,但是为了防止成员方法中的局部变量和成员变量混淆,我们就要用到 this.name 和 this.age 来区分成员变量和局部变量。
public class Person {
private String name; //姓名
private int age; //年龄
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat() {
System.out.println("人会吃饭");
}
public void sleep(){
System.out.println("人会睡觉");
}
}
自动生成get set方法
在实际的开发中,get set方法是不需要程序员自己敲出来的,无论是idea还是eclipse都可以自动生成get set方法。
eclipse自动生成get set方法:
点击Source —— Generate Getters and Setters……
选中所有成员变量,点击ok即可
idea自动生成get set方法:
点击 代码 —— 生成
点击 Getter 和Setter
选中两个变量,点击确定即可