面向对象(Object Oriented Programming)三大特性
1.封装(Encapsulation)
2.继承(Inheritance)
3.多态(Polymorphism)
定义
Encapsulation in Java is a mechanism of wrapping the data (variables) and code acting on the data (methods) together as a single unit. In encapsulation, the variables of a class will be hidden from other classes, and can be accessed only through the methods of their current class.
Java中的封装是一种将数据(变量)和作用于数据(方法)的代码打包为一个单元的机制。在封装中,类的变量将对其他类隐藏,并且只能通过当前类的方法访问。[^1]
封装在生活中的例子
例如,将你的卧室看作一个对象,卧室内部的装饰物,家具等本应都是卧室的私有属性,但是如果没有墙壁的遮挡,别人就会对屋里的任何东西一清二楚,甚至你在卧室里的一举一动都会被别人看到。正是因为这堵墙的存在,卧室的装饰品,家具等才不被外界所看到,我们甚至在卧室任意更改家具位置,改变装修风格也不会影响到其他人。但是没有门,这个被包裹的严严实实的黑盒子又有什么用呢,卧室的门就是通往外界的主要途径。
封装在Java中的普遍形式
Class Person{
private String name;
private int age;
private float weight;
public String getName(){
return name;
}
public void setName(String name){
this.name=name; //this.name指成员变量private String name
} //等号右侧name表示传入的name,this在此为了区分两个name
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public float getWeight(){
return weight;
}
public void setWeight(float weight){
this.weight=weight;
}
public class Test{
public static void main(String[] args){
Person p1 = new Person();
p1.setName("小王"); //设置姓名
p1.setAge(18); //设置年龄
p1.setWeight(60); //设置体重
System.out.println(p1.getName()); //获取姓名
System.out.println(p1.getAge()); //获取年龄
System.out.println(p1.getWeight()); //获取体重
}
}
由上图代码可以体现,封装在Java中的普遍应用形式,为三个属性(name,age,weight)分别写了get和set方法,其中可以通过get方法获取属性的值,通过set方法设置属性。
通俗说来,get和set就如同卧室的墙壁,三个属性(name,age,weight)就是卧室里的装修,家具等,通过get,set墙壁的遮挡,使得外界无法看到卧室里的东西,也无法改变,只能通过set来改变属性,get来获取属性。
外界:指其他class
卧室:指该class
封装的优点
问题:如果我们把age设置为200或者负数,虽然不会报错,但是不符合实际要求,这个问题就可以使用封装合理的解决。
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){
if(age <= 0 || age >130){
System.out.println("This is a wrong age! default: 18)
this.age=18;
}else{
this.age=age;
}
}
}
public class Test{
public static void main(String[] args){
Person p1 = new Person();
p1.setName("小王"); //设置姓名
p1.setAge(-10); //设置年龄
System.out.println(p1.getName()); //获取姓名
System.out.println(p1.getAge()); //获取年龄
}
}
Console:
小王
This is a wrong age! default: 18
18
我们在age中加入了对年龄的判断,这样就有效的避免了不符合实际情况的发生。
由此可以看出,封装可以对类的内部进行改变而不影响整体结构,同时也保护来数据。对于外界而言,它的内部是隐藏的,暴露给外界的只是可以访问它的方法。
优点
1.类内部可以自由修改
2.可以对成员变量更准确的控制
3.隐藏信息,保护数据
4.降低耦合度
耦合度:耦合性是编程中的一个判断代码模块构成质量的属性,不影响已有功能,但影响未来拓展,与之对应的是内聚性
例如:卧室的窗户与墙壁,如果窗子是扣死在墙里的 ,那么修改窗子时,就必须修改墙,这就比较紧密了,但是如果你窗子是按照某种规格的 可以自由拆装的 那么修改的代价就小,耦合度也就低了
在程序中我们要求 高内聚,低耦合!
get和set在eclipse中的简单用法
鼠标右键->Source->Generate Getters and Setters->选择需要用getset的属性->generate
更多精彩尽在主页?
reference:
1.https://www.tutorialspoint.com/java/java_encapsulation.htm