JAVA基础(十)封装

封装

面向对象共有三个特征:封装继承多态

封装

封装表现:
               1、方法就是一个最基本封装体。
               2、类其实也是一个封装体。
  从以上两点得出结论,封装的好处:
                             1、提高了代码的复用性。
                              2、隐藏了实现细节,还要对外提供可以访问的方式。

                              3. 便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。
                              4、提高了安全性。

              private 私有

 

private:是私有化;

                       被private修饰的方法和属性只能在本类中使用;其他方法(main)不能调用和访问;
                         因为被private修饰的属性和方法不能被别的类使用,则需要写方法进行:

                                                                                       赋值set和调用get;给私有属性赋值,

                                                                                        调用私有方法

 

 

代码例子


了解到封装在生活的体现之后,又要回到Java中,细说封装的在Java代码中的体现,先从描述Person说起。
描述人。Person
属性:年龄。
行为:说话:说出自己的年龄。

                  publicstaticvoid main(String[] args) {

             perso p = new perso();

                     /*Person p=new Person();

                      *p.speak()因为在Person类中写好了输入语句的方法speak();

                      * 所以这里直接调用就行了;如果没有写System输出语句*/
                      *  则需要写System.out.println(p.getName()+"..."+p.getAge()) (=p.speak);

                      *  调取private修饰的属性需要:*/

                                           //  变量名.getName();
                           // 传参
                           p.setName("速战");
                           // 传参
                           p.setAge(23);
                           perso p1 = new perso();
                           // 传参
                           p1.setName("刚切");
                           // 传参
                           p1.setAge(24);
       /*
        * p.speak(); System.out.println(p.getName()+"..."+p.getAge());
        */

}

有个严重的问题,就是Person中的属性的行为可以任意访问和使用。这明显不符合实际需求。
需要使用一个Java中的关键字也是一个修饰符 private(私有,权限修饰符)。只要将Person的属性和行为私有起来,这样就无法直接访问。

 

class Person {
    //成员变量
      private  int age;
      private String name;

      public  void speak() {

       System.out.println("我叫" + name + ",今年" + age + "岁了。");

}

 



年龄已被私有,错误的值无法赋值,可是正确的值也赋值不了,加判断。

一般对成员属性的访问动作:

                                    赋值(设置 set),

                                   取值(获取 get),

                                 因此对私有的变量访问的方式可以提供对应的 setXxx或者getXxx的方法。

 

变量名.set(值)的方法进行private修饰后的属性赋值;

class Person {
    // 私有成员变量
               // 加私有
    private String name;
    // 加私有
    privateintage;
    // 对外提供设置成员变量的方法
publicvoid setName(Sring n){
name=n;
         /*name=n:等于this.name(this.name是成员变量的name就是private String name)=n
(n是实例化对象传递过来要赋的值);
*/ }
//对外提供访问成员变量的方法
    public String getName() {
       // 调用者调用方法,方法就返回给调用者
       returnthis.name; }

 publicvoid setAge(int a) {
        // 由于是设置成员变量的值,这里可以加入数据的验证

        if (a < 0 || a > 130) {
           System.out.println(a + "不符合年龄的数据范围");
            return;
        }
          age = a; }
    // 对外提供访问成员变量的方法
    public  void getAge() {
        returnage;//// 调用者调用方法,方法就返回给调用者
    }
}

 

 


  总结:
                           类中不需要对外提供的内容都私有化,包括属性和方法。
                           以后再描述事物,属性都私有化,并提供setXxx getXxx方法对其进行访问。
              注意:私有仅仅是封装的体现形式而已。

 publicclass demo01 {
    public static void main(String[] args) {
        perso p = new perso();
        // 传参
        p.setName("速战");
        // 传参
        p.setAge(23);
        perso p1 = new perso();
        // 传参
      p1.setName("刚切");
        // 传参
        p1.setAge(24);
        /*
         * p.speak(); System.out.println(p.getName()+"..."+p.getAge());
         */
        //传参
        boolean flag = p.compare(p1);
        //返回值  打印
        System.out.println(flag);
    }

}
public boolean compare(boolean p){
return this.age=p.age;

}
1. 在main调用的方法是boolean flag=p.compare(p1);所以返回值是boolean型的所以这里compare()方法得用   
boolean接;实际上就是:在main方法里p调用了Persong类中的compare()方法;
2. 方法中return this.age=p.age;是用来比较的返回值是boolean型;

 

publicclass perso {
    // 加私有
    private String name;
    // 加私有
   privateintage;
    // 出口
    publicvoid setName(String name) {
      this.name = name;
    }
    // 返回有返回值
    public String getName() {
        // 调用者调用方法,方法就返回给调用者
        returnthis.name;
    }
    // age 赋值有返回值
    publicvoid setAge(intage) {
        this.age = age;
    }
    // 取值有返回值
    publicint getAge() {
        // 调用者调用方法,方法就返回给调用者
        returnage;}
    // 判断是否是同龄人
    publicboolean compare(perso p)

        returnthis.age == p.age;}



    this.age是指p.age;p.age就是p2.age(在main方法中定义了Person对象p2);通过compare方法把p2对象传到了Person类compare方法中进行比较;然后将结果false返回给main里 的p.compare()对象调用的方法中;返回值也是boolean;
    this.age就是调用对象的age也就是p.age;=p.age是被比较者的age;是通过compare(Person p)传过来的(整个p对象,包含age属性);=p.age的age被传过来的p对象的age赋值并比较
boolean flag=p.compare(p2);//这里是调的比较方法,返回值是boolean型的所以在Person类中compare()方法返回值用boolean接;

 

posted @ 2019-08-02 11:35  腊月出去玩  阅读(228)  评论(0编辑  收藏  举报