Java-面向对象(基础篇)--封装性

原创 2016年08月28日 22:03:00

封装性
封装性是面向对象的第一大特性,所谓的封装性就是指对外部的不可见性。问题如下:

class Person{
    String name ;           // 声明姓名属性
    int age ;               // 声明年龄属性
    public void tell(){
        System.out.println("姓名:" + name + ",年龄:" + age) ;
    }
};
public class EncDemo01{
    public static void main(String arsgh[]){
        Person per = new Person() ; // 声明并实例化对象
        per.name = "张三" ;           // 为name属性赋值
        per.age = -30 ;             // 为age属性赋值
        per.tell() ;
    }
};

程序运行的结果如下:

姓名:张三,年龄:-30

由上面程序可以发现,年龄(age)赋值为-30岁,这在程序中没有任何问题,但是在实际生活中这显然是不合法的数据,因为人的年龄不可能是-30岁。所以为了避免程序中发生这样的错误,在一般的开发中往往将类中的属性封装(private),封装的格式如下:
【封装格式】

属性封装:private 属性类型 属性名称
方法封装:private 方法返回值 方法名称(参数列表){}

【为程序增加封装属性】

class Person{
    private String name ;           // 声明姓名属性
    private int age ;               // 声明年龄属性
    public void tell(){
        System.out.println("姓名:" + name + ",年龄:" + age) ;
    }
};
public class EncDemo02{
    public static void main(String arsgh[]){
        Person per = new Person() ; // 声明并实例化对象
        per.name = "张三" ;           // 为name属性赋值
        per.age = -30 ;             // 为age属性赋值
        per.tell() ;
    }
};

程序运行结果为:

EncDemo02.java:11: 错误: name可以在Person中访问private
                per.name = "张三" ;                     // 为name属性赋值
                   ^
EncDemo02.java:12: 错误: age可以在Person中访问private
                per.age = -30 ;                         // 为age属性赋值
                   ^
2 个错误

本程序在属性前面加了private,进行了封装,所以不能由对象直接进行访问,这样就可以保证对象无法直接去访问类的属性,从而保证对入口处有所控制。需要进行访问时,在Java开发中对于私有属性的访问有了明确的规定:只要是封装的属性,则必须通过setter和getter方法设置和取得。
在程序中可以通过setter和getter方法进行设置和取得属性,如果想对设置的值进行检查,则只需要在setter()方法中加入检查的代码即可。
【加入检查代码】

class Person{
    private String name ;           // 声明姓名属性
    private int age ;               // 声明年龄属性
    public void setName(String n){  // 设置姓名
        name = n ;
    }
    public void setAge(int a){      // 设置年龄
        if(a>=0&&a<=150){           // 加入验证
            age = a ;
        }
    }
    public String getName(){        // 取得姓名
        return name ;
    }
    public int getAge(){            // 取得年龄
        return age ;
    }
    public void tell(){
        System.out.println("姓名:" + name + ",年龄:" + age) ;
    }
};
public class EncDemo04{
    public static void main(String arsgh[]){
        Person per = new Person() ; // 声明并实例化对象
        per.setName("张三") ;     // 调用setter设置姓名
        per.setAge(-30) ;           // 调用setter设置年龄
        per.tell() ;                // 输出信息
    }
};

程序运行结果:

姓名:张三,年龄:0

.因为设置了检查代码,所以年龄设置不正确,则不会把值赋给age属性的,所以运行结果为默认属性值0.
关于private的补充说明
(1) 在以后的开发中,类中的属性都必须封装,封装之后的属性值必须通过setter和getter方法访问。
(2) 面向对象的封装性本身并不是单单指private关键字。
(3) 正常情况下,类中的方法直接写上方法名就可以进行调用,但是如果要强调是本类中的方法,可以在调用时按“this.方法名称”的形式调用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

java提高篇(一)-----理解java的三大特性之封装

从大二接触java开始,到现在也差不多三个年头了。从最基础的HTML、CSS到最后的SSH自己都是一步一个脚印走出来的,其中开心过、失落过、寂寞过。虽然是半道出家但是经过自己的努力也算是完成了“学业”...
  • chenssy
  • chenssy
  • 2013年10月15日 22:25
  • 78300

java-三大特性之一封装性

封装性是java面向对象的特征之一; 三大特性之一,封装性; 封装是一个面向对象的术语,其含义其实很简单,就是吧东西包装起来。等下就用这种思维来解释封装性以及他带来的好处; 其实;成员变量和成...
  • zw1996
  • zw1996
  • 2016年12月07日 19:29
  • 545

Java 进阶面试问题列表

作者:王下邀月熊 链接:https://zhuanlan.zhihu.com/p/24910702 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 J...
  • MarkArch
  • MarkArch
  • 2017年01月18日 11:21
  • 406

《编程导论(Java)·6.1封装性》-什么是封装

Parnas原则-类的接口-封装
  • yqj2065
  • yqj2065
  • 2015年09月05日 09:46
  • 904

面向对象三大特性---封装性

思路:1,封装是什么?-->为什么要封装(即封装的好处)--
  • u014167212
  • u014167212
  • 2014年04月22日 16:36
  • 2221

Java Web开发实战经典(基础篇)

Applet Applet是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同标题 MVC全名是Model ...
  • u010504185
  • u010504185
  • 2017年02月08日 15:02
  • 1249

Java语言程序设计(基础篇)原书第十版 课后习题 第五章

import java.util.Scanner; public class Code_Practice_5 { public static void main(String[] args) {...
  • zjjoebloggs
  • zjjoebloggs
  • 2015年10月21日 20:27
  • 9942

Java语言程序设计(基础篇)原书第十版 课后习题 第三章

// 3.11 Scanner input = new Scanner(System.in); System.out.print("Enter a month and a year:");...
  • zjjoebloggs
  • zjjoebloggs
  • 2015年10月06日 21:58
  • 7484

初识OpenCV(基础篇)

OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。例如C接口函数cvCanny()实现了Canny边缘提取算法。可以直接将这些源代码添加到我们自己的软...
  • songkai320
  • songkai320
  • 2016年07月13日 17:59
  • 2160

Java语言程序设计基础篇原书第十版第五章综合题答案

循环的综合题。需要其它讲解的话,评论中留下题号。
  • Tanganling
  • Tanganling
  • 2016年11月13日 13:01
  • 3724
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java-面向对象(基础篇)--封装性
举报原因:
原因补充:

(最多只允许输入30个字)