Java基础知识学习:面向对象--封装

目录,更新ing,学习Java的点滴记录

  目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

封装_含义和作用

  1. 封装是面向对象三大特征之一。对于程序合理的封装让外部调用更加方便,更加利于写作。同时,对于实现者来说也更加容易修正和改版代码。
  2. 看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有 必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只 给我们暴露简单的接口,比如:电源开关。具体内部是怎么实现的,我们不需要操心。
  3. 需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装。说的 专业一点,封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节
  4. 我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成, 不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。
  5. 封装的优点:
     提高代码的安全性。
     提高代码的复用性。
     “高内聚”:封装细节,便于修改内部代码,提高可维护性。
     “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。
  6. 未进行封装的示例
    在这里插入图片描述 如果没有使用封装的话,便可以给年龄赋值成任意的整数,这显然不符合我们的正常逻辑思维。如果使用封装,我们只需要稍微修改下 Person 类的 setAge()方法即可,而无需修改使用了该类的客户代码。后面会使用setter和getter实现对成员变量的封装效果.

封装的实现_四个访问控制符

  1. public,protected,包访问权限(default,没有关键字),private这几个Java访问权限修饰符在使用时,是置于类中每个成员的定义之前的—它是一个字段还是一个方法.每个访问权限修饰符仅控制它所修饰的特定定义的访问权.
  2. 各类修饰符访问范围
    在这里插入图片描述
     1.private 表示私有,只有自己类能访问
     2.default 表示没有修饰符修饰,只有同一个包的类能访问
     3.protected 表示可以被同一个包的类以及其他包中的子类访问
     4.public 表示可以被该项目的所有包中的所有类访问
  3. 下面给出一个示例
     首先我们创建 4 个类:Person 类、Student 类、Animal 类和 Computer 类,分别比较本类、本包、子类、其他包的区别。
     1)public访问权限修饰符
      在这里插入图片描述  在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
     2)protected访问权限修饰符:将 Person 类中属性改为 protected,其他类不修改。
      在这里插入图片描述
      在这里插入图片描述
     3)默认访问权限修饰符:将Person类中的属性改为默认的,其他类不改变
      在这里插入图片描述
     4)private访问权限修饰符:将Person类中属性改为private,其他类不修改
      在这里插入图片描述
  4. 关于protected的细节
     1.若父类和子类在同一个包中,子类可访问父类的 protected 成员,也可访问父类对象的 protected 成员。
      在这里插入图片描述
      在这里插入图片描述
     2.若子类和父类不在同一个包中,子类可访问父类的 protected 成员,不能访问父类对象的 protected 成员。
      在这里插入图片描述
      在这里插入图片描述

封装_get和set方法

  1. 封装的简单规则:
     属性一般使用 private 访问权限
      属性私有后, 提供相应的 get/set 方法来访问相关属性,这些方法通常是public 修饰的,以提供对属性的赋值与读取操作(注意:boolean 变量的 get 方法是 is 开头!)。
     方法:一些只用于本类的辅助性方法可以用 private 修饰,希望其他类调用的方法用 public 修饰。
  2. 一个Person类的封装
package com.m1;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        //不在构造器中直接赋值,而是调用对应setter方法
//        this.name = name;
//        this.age = age;
        setName(name);
        setAge(age);
    }

    //setter和getter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //赋值之前进行合法性判断
        if (age >130 || age<0){
            System.out.println("输入年龄不合法!");
        }else {
            this.age = age;
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

  1. 封装优点:
      1)提供属性对应的setter和getter方法,使得属性不会受到外界的直接影响
      2)可以改变内部实现,除了该类的方法之外,不会影响其他代码
       在这里插入图片描述
      3)setter方法可以为我们执行错误检查,然而直接对域进行赋值将不会做这些处理
       在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41649001/article/details/106609304