目前, 面向对象的思想被软件开发界广为追捧,其实,面向对象思想不是高深的理论, 而是根据前人大量编程项目总结出来的一套分析和解决编程方面问题的方法。以面向对象思想为指导, 可以优化java 代码的结构, 更可以让数据库访问模块变得富有弹性—即让代码和模块能更好地适应项目需求的频繁变化。面向对象编程(object oriented programming, 简称oop)描述的是对象之间的相互作用。oop 编程主要有三大思想,分别是封装、继承、多态。在面向对象编程中, 类作为最小程序单元,就像以往面向过程编程中函数作为最小程序单元一样。封装性是面向对象程序设计的原则之一。它规定对象应对外部环境隐藏它们的内部工作方式。良好的封装提高了代码的模块性,它防止了对象之间不良的相互影响, 这样就使得未来的开发工作变得容易。
封装定义:是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
封装好处:将变化隔离。便于使用。提高重用性。提高安全性。
封装原则:将不需要对外提供的内容都隐藏起来。把属性都隐藏,提供公共方法对其访问。
例:
class Person
{
private int age;//只在本类中有效,不能被其他对象直接访问了
public void setAge(int age)//提供了对外的公共方法
{
this.age=age;
System.out.println(this.age);
}
}
class Demo
{
public static void main(String[] args)
{
Person p=new Person();
p.setAge(12);
}
}
通常情况下,会将类中的成员变量私有化,为了避免属性直接被访问导致数据错误,对外提供了公共的访问方式,对该属性进行访问。
对属性访问的公共方法名称定义格式:set属性()、get属性()。若对象中有10个属性,一般则至少有20个方法,因为每个属性通常都对应两个方法:set属性();get属性()
注意:私有仅仅是封装的一种体现形式之一。函数就是一个最小的封装体。类本身也是一种封装。
通过上例我们可以看出: 建构具有良好封装性能的对象的第一个步骤就是getter/setter 对访问私有数据域。通过一个控制的机制来要求那些要对对象的域进行读和写的其他对象这样去做, 可以加强法定值和内部数据的连贯性。如果有一个域名为duration, 它应该保存一个正整数, 当另一个对象试图进行setduration(-4) 时,就可以给出一个illegalargumentexception。如果将duration 成员设置为公有,就不能防止某人调用yourobject.duration=-4并搞乱数据的内部连贯性。通过一个例子来理解这个问题: 编写一个教师类, 要求:
(1) 具有属性:姓名、年龄
(2) 具有行为:自我介绍
(3) 教师的最小年龄要求: 22 岁
public class teacher
{
public string name; // 教员姓名
public int age; //年龄
/**
* 返回自我介绍的内容
*/
public string introduction () {
return “ 大家好!我是” + name + “,我今年” + age+”“ ;
}
}
编写一个测试类, 要求: 实例化一个教员对象, 并对其初始化, 并在控制台输出该教员的自我介绍。
public class teachertest {
public static void main (string [ ] args) {
teacher teacher = new teacher () ;
teacher.name = “ 张三” ;
teacher.age =9;
system.out.println (teacher.introduction ()) ;
}
}
运行结果为: 大家好! 我是张三, 我今年9 岁
因为没对属性进行封装, 所以运行结果不满足教员的最小年龄要求, 要满足此要求, 就需要通过对属性的封装来实现,修改teacher 类如下:
public class teacher {
private string name; // 教员姓名
private int age; //年龄
public int getage () {
return age;
}
public void setage (int age) {
if (age<22) {
system.out.println (“ 错误!最小年龄应为22 岁!”) ;
this.age = 22; //如果不符合年龄要求,则赋予默认值
}
else {
this.age = age;
}
}
public string getname () {
return name; // 返回教员姓名
}
public void setname (string name) {
this.name = name; // 设定教员姓名
}
public string introduction () {
return “ 大家好!我是” + name + “,我今年” + age+”岁” ;
}
}
现在同样执行以上测试类teachertest, 运行结果为:错误! 最小年龄应为22 岁!
大家好! 我是张三, 我今年22 岁
从以上事例可得出: 使用封装, 增加了数据访问限制,增强了程序的可维护性, 其封装步骤为:
(1) 修改name、age 属性的可见性为private 来限制直接对属性的访问。
(2) 为每个属性创建一对赋值(setter) 方法和取(getter)方法, 用于间接对这些属性的访问。
(3) 在setter 和getter 方法中, 加入对属性的存取限制。