zoukankan      html  css  js  c++  java
  • [javase学习笔记]-6.7 封装

    这一节我们学习面向对象中的第一个特性,封装(encapsulation)


    封装:是指隐藏对象的发生和实现细节,仅对外提供公共訪问方式.

    那么什么是隐藏对象的实现细节?

    我们来举例学习.

    比方我们来定义一个人的类,简单点说,人的属性有年龄,行为有说话.

    我们看以下的代码:

    class Person//定义一个人的类
    {
    	int age;
    	void speak()
    	{
    		System.out.println("age = "+age);
    	}
    }
    class PersonDemo//定义測试类
    {
    	public static void main(String[] args) 
    	{
    		Person p = new Person();
    		p.age = -20;//这时代码仍然正常执行了,这就造成了安全隐患
    		p.speak();
    	}
    }

    结果:


    我们看到存在安全隐患,当我们为人的年龄属性赋值为负数时,程序是正常执行的.


    那么如今把Person类改动一下

    <pre name="code" class="java">class Person
    {
    	private int age;
    	void speak()
    	{
    		System.out.println("age = "+age);
    	}
    }
    
    结果:
    

    我们看到报错了,由于我们对age进行了私有,在PersonDemo类中无法訪问.


    为了进一步解决这个问题,我们再对两个类进行改动:

    class Person
    {
    	private int age;//把该成员属性设置为私有
    	public void setAge(int a)
    	{
    		if(a>0 && a<130)
    		{
    			age = a;
    			speak();
    		}
    		else
    			System.out.println("错误的数据");
    	}
    	void speak()
    	{
    		System.out.println("age = "+age);
    	}
    }
    class PersonDemo
    {
    	public static void main(String[] args) 
    	{
    		Person p = new Person();
    		p.setAge(-20);//调用方法设置年龄,可是我们不知道该方法的内部实现
    	}
    }
    结果:


    我们看到当age>0 && age<130时,才合法.

    从这个过程我们看到,当我们要操作Person中的age属性时,是通过setAge方法来实现的,可是setAge方法是怎么实现的,外部类是无法知道的,这就是我们所要说的隐藏对象的属性和实现细节,也就是封装.

    事实上对于属性的封装,为了外部訪问,我们一般有规范的get和set方法,我们来看一下两个规范且经常使用的方法:

    class Person
    {
    	private int age;//把该成员属性设置为私有
    
    	public void setAge(int a)//设置年龄
    	{
    		age = a;
    	}
    	public int getAge()//获取年龄
    	{
    		return age;
    	}
    }


    以下我们再来说说封装的长处和原则:

    长处:

    1.提高代码安全性;

    2.实现对内部属性的可控性;

    3.提高代码的复用性;

    4.隔离变化;

    原则:

    1.将不须要对外提供的内容都隐藏起来;

    2.把属性都隐藏起来,提供公共方法供外部訪问(当然不是全部方法都必须是公共方法).


    最后我们再看一下刚才我们用到的一个keyword:private.

    privatekeyword:指私有,是一个权限修饰符,用于修饰成员.私有的内容仅仅在本类中有效.

    它的常见使用方法:就是将成员变量私有化,对外提供相应的set,get方法对其进行訪问.提高对数据訪问的安全性.

    注意:私有不过封装的一种体现而已.

    对于java语言来讲,最小的封装体就是函数.类也是封装体.框架本身也是封装体.这些都一个共性,就是我们能够不知道实现细节,直接拿来用就能够了.

  • 相关阅读:
    asp.net 2.0 run
    Regular Expression
    assembly
    asp.net loading..
    session
    asp.net performance
    asp.net page order
    interface
    UVA 562 Dividing coins
    UVA 10003 Cutting Sticks
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7084722.html
Copyright © 2011-2022 走看看