面向对象的封装

9. 面向对象特征一:封装性(encapsulation)

什么是封装
就像快递一样我们在网上买的物品,快递都会给我们添加外包装,给我们封装起来,这就是封装

客观世界里每一个事物的内部信息都隐藏在其内部,外界无法直接操作和修改,只能通过指定的方式进行访问和修改。

9.1 为什么需要封装?

随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”。

高内聚、低耦合是软件工程中的概念,也是 UNIX 操作系统设计的经典原则。
内聚,指一个模块内各个元素彼此结合的紧密程度;
耦合指一个软件结构内不同模块之间互连程度的度量。耦合意味着牵一发动全身。
内聚意味着重用和独立,耦合意味着牵一发动全身

而“高内聚,低耦合”的体现之一:
• 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
• 低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用。

“高内聚、低耦合”:其实就是代码之间的相互影响降到最低;

9.2 何为封装性?
所谓封装,就是把客观事物封装到一个类里,并且类可以把自己的数据和方法指定可信的类或者对象开放,向没必要开放的类或者对象隐藏信息。

**通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。**

我们通过使用private修饰封装了属性值那么我们如何获取呢通过get set方法

package com.tedu;

public class Test1 {

    public static void main(String[] args) {
Anamail anamail=new Anamail();
//当我添加private修饰符的时候这个地方会报错
//        anamail.name="姚明";
//        anamail.age=33;


        /*
        System.out.println(anamail.name);
        System.out.println(anamail.age);
        */

        anamail.setAge(2);
        System.out.println(anamail.getAge());

        anamail.eat();
    }

}

class  Anamail{

    String name;

    //如果我们在这里不添加private修饰符可以直接调用
    private int age;

public  void eat(){

    System.out.println("今天吃的啥");
}


//set方法是专门用来给属性设置值
    public void setAge(int a){
    //大于等于0的偶数
    if (age>=0 && age % 2==0){
        age=a;
    }else {
        System.out.println("你打印的值是非法的");
    }

    }

    //get方法是用来给属性获取值
public  int getAge(){

     return age;
}

}


面向对象的封装_第1张图片

9.3 Java 如何实现数据封装
• 实现封装就是控制类或成员的可见性范围。这就需要依赖访问控制修饰符,也称为权
限修饰符来控制。
• 权限修饰符:public、protected、默认(default)、private。具体访问范围如下

面向对象的封装_第2张图片

TIPS:default是表示不写修饰符,默认,如果写default单词来修饰会报错

注意:类只能使用public 、默认(default)修饰,
类的成员这几种修饰符都可以使用

4.3.2 练习:封装学生案例

创建包: cn.tedu.oop
创建类: TestPrivate2.java

package cn.tedu.oop;

/*本类用于练习OOP的第一大特性:封装*/
public class TestPrivate2 {
    public static void main(String[] args) {
        //4.创建学生类对象s
        Student s = new Student();
        //5.通过对象修改并查看属性值
        s.sno = 1;
        //s.name = "黄飞鸿";
        //s.subject = "Java培优";
        System.out.println(s.sno);
        //System.out.println(s.name);
        //System.out.println(s.subject);
        //6.通过对象调用方法
        s.study();
        s.eat();
        s.sleep();
        //7.3使用刚刚生成的set()设置值方法与get()获取值方法
        s.setName("十三姨");
        s.setSubject("美容美发");
        System.out.println(s.getName());
        System.out.println(s.getSubject());
    }
}

//1.定义类描述学生这一类型Student
class Student {
    //2.特征:学号sno 姓名name 科目subject
    //7.1 封装属性--用private修饰属性
    int sno;
    private String name;
    private String subject;

    //7.2提供被封装属性的get与set方法
    //右键->Generate->Getter and Setter->Shift选择属性->OK
    public String getName() {
        return name;
    }

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

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    //3.定义学生的功能:学习 吃饭 睡觉
    public void study() {
        System.out.println("正在学习中...");
    }

    public void eat() {
        System.out.println("吃饭ing...");
    }

    public void sleep() {
        System.out.println("我一点也不想睡觉,就想学Java!");
    }
}

4.3.3 练习:封装方法测试

创建包: cn.tedu.oop
创建类: TestPrivate3.java

package cn.tedu.oop;
/*本类用于测试方法的封装*/
public class TestPrivate3 {
    public static void main(String[] args) {
        //4.创建对象测试
        Apple a = new Apple();
        //5.没有封装方法时,调用没有限制
        //a.eat();//封装eat(),此处调用报错
        a.clean();
    }
}
//1.创建苹果类
class Apple{
    //2.定义方法1
    public void clean(){
        System.out.println("苹果还是要洗洗的~");
        //6.在已有的公共方法clean()中调用被封装eat()方法的功能
        eat();
    }
    //3.定义方法2
    private void eat(){
        System.out.println("要吃苹果啦~");
    }
}

5 拓展:OOP综合练习

创建包:cn.tedu.oop
创建类:TestCar

package cn.tedu.oop;
/*本类用于面向对象的巩固练习*/
public class TestCar {
    //创建程序的入口函数main()
    public static void main(String[] args) {
        //3.创建汽车类对象c
        Car c = new Car();
        //4.通过汽车类对象c设置属性值
//        c.color = "暗夜紫";
//        c.brand = "BMW";
//        c.price = 200;
//        c.length = 0.2;
        //5.查看刚刚设置好的属性值
//        System.out.println(c.brand);
//        System.out.println(c.price);
//        System.out.println(c.color);
//        System.out.println(c.length);
        //6.通过c对象调用汽车类的方法
        c.start();
        //c.stop();
        //7.3调用提供的set与get方法,设置并获取对应属性的值
        c.setBrand("特斯拉");
        c.setColor("black");
        c.setPrice(200.02);
        c.setLength(3);
        System.out.println(c.getBrand());
        System.out.println(c.getColor());
        System.out.println(c.getLength());
        System.out.println(c.getPrice());
        //8.3 调用公共方法来实现私有方法功能的使用
        c.start();
    }
}
//1.抽象汽车这一类事物的属性与行为,封装成一个类组件
class Car{
    //2.属性--用成员变量来描述
    //7.1封装所有的属性值--使用private修饰
    private String color;
    private String brand;
    private double price;
    private double length;
    //7.2 生成所有属性的get与set方法
    /*右键空白处->Generate->Getter and Setter->按住Shift全选所有属性生成即可*/
    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    //3.行为--用方法来描述
    //8.2 可以在本类公共的方法里,调用私有方法
    public void start(){
        System.out.println("汽车开动了~");
        stop();//我们通过方法名+参数列表确定要调用哪个方法
    }
    //8.1封装方法,通过private修饰符
    private void stop(){
        System.out.println("汽车停止了~");
    }
}

你可能感兴趣的:(java,开发语言)