Java——OOP三大特性之封装性(Encapsulation)通俗详细

面向对象(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

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值