面向对象----信息的封装和隐藏

信息的封装和隐藏

信息封装和隐藏的必要性

使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。(version1)

 1 public class Animal {
 2     public int legs;
 3     public void eat(){
 4         System.out.println(“Eating.”);
 5     }
 6     public void move(){
 7         System.out.println(“Moving.”);
 8     }
 9 }
10
11 public class Zoo{
12     public static void main(String args[]){
13         Animal xb=new Animal();
14         xb.legs=4;
15         System.out.println(xb.legs);
16         xb.eat();xb.move();
17     }
18 }

应该将legs属性保护起来,防止乱用。
保护的方式:信息隐藏

Java中通过将数据声明为私有的(private),再提供公开的(public)方法:getXXX和setXXX实现对该属性的操作,以实现下述目的:
  隐藏一个类的实现细节;
  使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
  便于修改,增强代码的可维护性;(version2)

 1 public class Animal {
 2     private int legs;    //将属性legs定义为private,只能被Animal类内部访问
 3     public void setLegs(int i) { //在这里定义方法 eat() 和 move()
 4         if (i != 0 && i != 2 && i != 4) {
 5             System.out.println("Wrong number of legs!");
 6                 return;
 7         }
 8         legs=i;
 9     }
10     public int getLegs() {
11         return legs;
12     }
13 }
14 public class Zoo {
15     public static void main(String args[]) {
16         Animal xb=new Animal();
17         xb.setLegs(4);    //xb.setLegs(-1000);
18         xb.legs=-1000;    //非法
19         System.out.println(xb.getLegs());
20     }
21 }

练习
1、创建程序,在其中定义两个类,Person和TestPerson类的定义如下。用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。在Test类中实例化Person类的对象b,调用setAge()和getAge()方法,体会Java的封装性。

 1 public class  Person{
 2     public static void main(String[] args) {
 3         private int age;
 4
 5         public int getAge(){
 6             return age;
 7         }
 8         //为属性赋值的 set 方法
 9         public void setAge(int age) {
10             if(age >130 & age<0){
11                 System.out.println("age 赋值不合法: " + age);
12                 return;
13             }
14             this.age = age;
15         }
16     }
17 }
public class TextPerson{
    public static void main(String[] args) {
        Person p = new Person;
        p.setAge(22);
        p.getAge();
        System.out.println("年龄为:" + getAge);
    }
}

2、求圆的面积

 1 /**
 2  * 什么是信息的封装和隐藏?
 3  *
 4  * 1. 把属性隐藏起来: 使用 private 关键字来修饰
 5  * 2. 提供 public 的 set, get 方法来访问属性.  7  */
 8 public class Circle {
 9
10     //构造器于类同名, 且没有返回值(连 void 都没有).
11     //JVM 会为每一个类提供一个默认的无参数的构造器: public Circle(){}
12     //构造器的作用: 对类的属性进行初始化.
13     public Circle(){
14         radius = 10;
15     }
16
17     //半径
18     //private 关键字: 可以修饰类的成员, 一经使用 private 修饰, 该属性将不能在外部被直接访问.
19     //可以提供 public 方法来操作属性: getXxx() 返回属性值, setXxx() 为属性赋值。
20     private int radius;
21
22     //读取属性值的方法
23     public int getRedius(){
24         return radius;
25     }
26
27     //为属性赋值的 set 方法
28     public void setRedius(int r) {
29         if(r <= 0){
30             System.out.println("redius 赋值不合法: " + r + ", " +
31                     "redius 取默认的初始值 0");
32             return;
33         }
34
35         radius = r;
36     }
37
38     //返回圆的面积
39     public double findArea(){
40         return 3.14 * radius * radius;
41     }
42 }
 1 public class TestCircle {
 2     public static void main(String[] args) {
 3
 4         //创建对象一定是调用了类的某一个构造器.
 5         //如果在类中没有显式的定义构造器, 则将调用默认的那个构造器.
 6         Circle c = new Circle();
 7
 8         //c.redius = -2;
 9         //通过方法为 Circle 对象的 redius 属性赋值
10 //        c.setRedius(3);
11
12         System.out.println(c.findArea());
13         System.out.println("redius: " + c.getRedius());
14     }
15 }
时间: 2024-10-17 09:36:21

面向对象----信息的封装和隐藏的相关文章

【宋红康学习日记8】面向对象特征之一--封装与隐藏

一 封装 1 创建对象时,调用属性值时,不应该“对象.属性”,应该尽量将类中属性设置为隐私,通过“对象.方法”来调用属性,这就是封装性与隐藏性的思想. 2 封装的思想:将类的属性私有化,提供方法(setter&getter方法)调用. 二 权限修饰符 public private protected  缺省(default) 1 权限大小 public<protected<defaule<private 2 class 只能由public default修饰 三 构造器 1 作用

封装和隐藏

有时候会遇到这种情况,某些属性指向限制在特定范围内,当别人调用的时候,只能赋值在这特定范围内的值.这样的情况有哪些呢?比如有一个属性是用来放年龄的,那么这个年龄就不能被设置为负数.还有人的性别只有男跟女两种选择,别来一个雌雄同体.在这样的情况下,就会用到封装跟隐藏. 信息的封装和隐藏 Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXXX()和setXXX()实现对该属性的操作. 以实现下述为目的: 隐藏一个类中不需要对外提供的实现细节: 使用者只能通

面向对象的特征一:封装与隐藏

* 面向对象的特征一:封装与隐藏 3w: what? why? how? * * 1.问题的引入? * 我们在创建了一个类的对象以后,通过"对象.属性"的方式,可以给对象的属性赋值.对此属性的赋值,是限制的,比如:数据类型和 * 数据类型储值范围的限制.但是,在实际问题中,还通过需要额外的限制.同时这些额外的限制,不可能在属性的声明中加上限制逻辑. * 那么,我们只能考虑通过方法,对属性的赋值进行额外的限制.同时,我们必须禁止再直接通过"对象.属性"的方式,对属性进

面向对象的JavaScript --- 封装

面向对象的JavaScript --- 封装 封装 封装的目的是将信息隐藏.一般而言,我们讨论的封装是封装数据和封装实现.真正的封装为更广义的封装,不仅包括封装数据和封装实现,还包括封装类型和封装变化. 封装数据 封装实现 封装类型 封装变化 封装数据 在许多语言的对象系统中,封装数据是由语法解析来实现的,这些语言也许提供了 private.public.protected 等关键字来提供不同的访问权限.但JavaScript并没有提供对这些关键字的支持,我们只能依赖变量的作用域来实现封装特性,

(一)Python入门-6面向对象编程:07面向对象三大特征(封装、继承、多态)-继承

一:面向对象三大特征介绍 Python是面向对象的语言,也支持面向对象编程的三大特性:继承.封装(隐藏).多态. 封装(隐藏) 隐藏对象的属性和实现细节,只对外提供必要的方法.相当于将“细节封装起来”,只 对外暴露“相关调用方法”. 通过前面学习的“私有属性.私有方法”的方式,实现“封装”.Python 追求简洁的语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现. 继承 继承可以让子类具有父类的特性,提高了代码的重用性. 从设计上是一种增量进化,原有父类设计不变的情况下,可以

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

python开发面向对象基础:封装

一,封装 [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性: [封装原则] 1. 将不需要对外提供的内容都隐藏起来: 2. 把属性都隐藏,提供公共方法对其访问. 私有变量和私有方法 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) 私有变量 #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A: __N=0 #类的数

[.net 面向对象编程基础] (11) 面向对象三大特性——封装

[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承.多态. 1.封装概念 封装:每个对象都包含有它能进行操作的所有信息,这个特性称为封装.这样的方法包含在类中,通过类的实例来实现. 2.封装的优点 A.良好的封装能够减少耦合(比如实现界面和逻辑分离) B.可以让类对外接口不变,内部可以实现自由的修改 C.类具有清晰的对外接口,使用者只需调用,无需关心

面向对象实战之封装拖拽对象

面向对象实战之封装拖拽对象 利用前面几章的所涉及到的知识,封装一个拖拽对象.为了能够帮助大家了解更多的方式与进行对比,我会使用三种不同的方式来实现拖拽. 不封装对象直接实现: 利用原生JavaScript封装拖拽对象: 通过扩展jQuery来实现拖拽对象. 本文的例子会放置于codepen.io中,供大家在阅读时直接查看.如果对于codepen不了解的同学,可以花点时间稍微了解一下. 拖拽的实现过程会涉及到非常多的实用小知识,因此为了巩固我自己的知识积累,也为了大家能够学到更多的知识,我会尽量详