23--面向对象特征之一封装

封装性概述

所谓的封装就是对外部不可见,将类的状态信息隐藏在类的内部,不允许外部程序直接访问,要访问此类需要通过该类提供的方法来实现对隐藏信息的操作和访问。
封装反映了事物的相对独立性,避免外部错误对此对象的影响,并能对对象的使用者减少错误操作的几率。
封装做到了类的实现细节的影藏,让使用者只能通过程序规定的方法来进行数据访问,可以方便加入控制语句,限制不合理的操作。

对象封装有两层含义:

  1. 把对象的属性和行为看成一个不可分割的一个整体,把属性和行为“封装”在一个不可分割的独立单位中(对象中)。
  2. “信息的隐藏”,把不要让外界知道的信息隐藏起来,有些对象的属性和行为允许外界用户知道和使用,但不允许修改,有些属性和行为,则不允许外界知道,或只允许使用对象的功能,而把对象的功能实现细节隐藏起来
    使用封装的步骤:
    1. 修改属性的可见性:将类中的属性私有化(public>>>private)
    2. 设置setter/getter方法:属性私有化之后,外界将不能直接访问,此时我们要提供外界访问的入口。此时必须通过setter和getter方法设置和取得,我们程序设计追求“高内聚,低耦合”。 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉; 低耦合 :仅对外暴露少量的方法用于使用。
    3. 设置属性的存取限制
    没有封装带来的问题:
    实例:
package com.qwy.demo;

public class TestDemo {
    
    
	public static void main(String[] args) {
    
    
		Person person = new Person();
		person.name="张三";
		person.age=-20;
		person.sex="不知道";
		person.tell();
	}
}
class Person{
    
    
	String name;
	int age;
	String sex;
	public void tell(){
    
    
		System.out.println("姓名:"+name+"\t年龄:"+age+"\t性别:"+sex);
	}
}

运行结果:
姓名:张三 年龄:-20 性别:不知道

从结果来看,程序本身没有什么语法错误,但是从现实生活中试想一下,一个人的年龄怎么会是-20呢。为了避免这种错误的发生,往往就使用了封装进行操作。

进行封装并在setter方法出加上检测功能:
实例:

package com.bdqn.demo;

public class TestDemo {
    
    
	public static void main(String[] args) {
    
    
		Person person = new Person();
		person.setName("张三");
		person.setAge(-20);
		person.setSex("男");
		person.tell();
	}
}
class Person{
    
    
	private String name;
	private int age;
	private String sex;
	public void tell(){
    
    
		System.out.println("姓名:"+name+"\t年龄:"+age+"\t性别:"+sex);
	}
	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< 150){
    
    
			this.age = age;
		}
	}
	public String getSex() {
    
    
		return sex;
	}
	public void setSex(String sex) {
    
    
		this.sex = sex;
	}
	
}

运行结果:
运行结果:姓名:张三 年龄:0 性别:男

从程序的结果可以发现,在程序中的setter方法处加入了验证代码,所以如果年龄数值不正确,则会不会把值赋值给age属性,所以出现了年龄为0的结果。

总结:
Java中通过将数据声明为私有的(private),再提供公共的(public) 方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:

  1. 隐藏一个类中不需要对外提供的实现细节;
  2. 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑, 限制对属性的不合理操作;
  3. 便于修改,增强代码的可维护性。

private补充

  1. 在以后的开发中,类中的全部属性都必须封装,封装之后的属性必须通过setter和getter进行访问
  2. 面向对象的封装性本身并不是单单指private关键字,使用private关键字声明的属性和方法只能在类的内部被调用,外部类没法调用

包的使用其实也是封装。其实类本身也可以看做一种封装(将对应的属性和方法封装在同一个类中,这个要看大家怎么去理解了)
不积跬步无以至千里
====================================================================================================
  自己也是最近才开始写文章,看到大家都分享自己的经验给别人。我也是受益者之一,做人不能只懂的索取而不去回馈,所以也将自己学习的知识分享给大家。我不能保证每个问题都讲的是对的,毕竟我也是个学习者。如果有地方写得不对或理解有误的,也希望大家给指出,我当非常感谢。编写过程也不易,也希望大家给个赞,关注下本人。这也能激励我继续分享。
  ====================================================================================================

猜你喜欢

转载自blog.csdn.net/qwy715229258163/article/details/114400560