《疯狂java讲义2》读书笔记——面向对象的三大特性之一封装

封装java

        封装(Encapsulation)是指将对象的状态信息隐藏在对象内部,不容许外部程序直接访问对象内部信息,而是经过该类提供的方法来实现对内部信息的操做和访问。编程

        封装是面向对象编程语言对客观世界的模拟,客观世界里的Field都是杯隐藏在对象内部的,外界没法直接操做和修改。(个人我的理解就是:比如一我的,这我的具备年龄,身高,体重等属性,年龄只能随着时间流逝增长,不能你说多少岁就是多少岁。)对一个类或对象实现良好的封装,能够实现如下目的:安全

        》隐藏类的实现细节。编程语言

        》让使用者只能经过事先预约的方法来访问数据,从而能够在该方法里加入控制逻辑,限制对Field的不合理访问。this

        》可进行数据检查,从而有利于保证对象信息的完整性。code

        》便于修改,提升代码的可维护性。对象

        为了实现良好的封装,须要从两方面考虑。get

        》将对象的Field和实现细节隐藏起来,不容许外部直接访问。io

        》把方法暴露出来,让方法来控制对这些Field进行安全的访问和操做。编译

        封装实际上有两个方面的含义:把该隐藏的隐藏起来,把该暴露出来的暴露出来。这就须要经过使用java提供的访问控制符来实现。

使用访问控制符

       java提供了4种访问控制符:private,default,protected和public. 分别表明了4个访问级别。

        private(当前类访问权限) ,default(包访问权限),protected(子类访问权限),public(公共访问权限)。注:我比较懒,不想写后面的,这方面看了知道就能够了。

public class Person
{
	//将Field使用private修饰,将这些Field隐藏起来
	private String name;
	private int age;
	//提供方法来操做name Field
	public void setName(String name) 
	{
		//执行合理性校验,要求用户名必须在2~8位之间
		if (name.length()>8||name.length()<2)
		{
			System.out.println("您设置的任命不符合要求");
			return;
		}
		else 
		{
			this.name = name;
		}
	}
	public String getName() 
	{
		return this.name;
	}
	//提供方法来操做age Field
	public void setAge(int age) 
	{
		//执行合理性校验,要求用户年龄必须在0~100之间
		if (age>100||age<0)
		{
			System.out.println("您设置的年龄不合法");
			return;
		}
		else 
		{
			this.age = age;
		}
	}
	public int getAge() 
	{
		return this.age;
	}
}

 

下面程序在main方法中建立一个Person对象,并尝试操做和访问该对象的age和name两个Field。

public class PersonTest
{
	public static void main(String[]args)
	{
		Person p = new Person();
		//由于age Field已经被隐藏,因此下面的语句将出现编译错误
		//p.age = 1000;
		//下面语句编译不会出现错误,但运行时将提示“您设置的年龄不合法”
		//程序不会修改p的age Field
		p.setAge(1000);
		//访问p的age Field也必须经过其对应的getting方法
		//由于上面从未成功设置p的age Field,故此处输出0
		System.out.println("未设置age Field时:"+ p.getAge());
		//成功修改p的age Field
		p.setAge(30);
		System.out.println("成功设置age Field后:"+ p.getAge());
		//设置名字的方法和年龄类似
		p.setName("夏幸运");
		System.out.println("成功设置name Field后:"+ p.getName());
	}
}

 

关于访问控制符的使用,存在几条基本原则。

》类里的绝大部分Field都应该使用private修饰,只有一些static修饰的,相似全局变量的Field,才可能考虑使用public修饰。

》若是某个类主要是用作其余类的父类,该类里包含的大部分方法可能仅但愿被其子类重写,而不想被外界直接调用,则应该使用protected修饰这些方法。

》但愿暴露出来给其余类自由调用的方法应该使用public修饰。

相关文章
相关标签/搜索