6.4、面向对象的封装

封装是面向对象编程的一个重要特征,它将对象的内部信息隐藏,只通过特定接口与外界交互。通过private修饰成员变量,提供get和set方法实现属性的访问控制,确保代码的高内聚和低耦合。文章通过多个示例展示了如何在Java中实现数据封装以及其重要性。
摘要由CSDN通过智能技术生成

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

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

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

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

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

为什么需要封装?

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

内聚,指一个模块内各个元素彼此结合的紧密程度;
耦合指一个软件结构内不同模块之间互连程度的度量。耦合意味着牵一发动全身。
内聚意味着重用和独立,耦合意味着牵一发动全身

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

封装性的体现

成员变量/属性私有化
概述:私有化类的成员变量,提供公共的 get 和 set 方法,对外暴露获取和修
改属性的功能。
实现步骤:
① 使用 private 修饰成员变量:private 数据类型 变量名 ;

public class Person {

 private String name;
 private int age;
 private boolean marry; 

}

② 提供 getXxx 方法 / setXxx 方法,可以访问成员变量,代码如下:

我们通过使用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);
        */
        //在这里是通过set设置值
        anamail.setAge(2);
        
       // 在这里是通过get获取值
        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;
}
}

封装案例的优化(选讲)

练习:封装的必要性
创建包: cn.tedu.oop
创建类: TestPrivate1.java

package cn.tedu.oop;
/*本类用于测试封装的必要性*/
public class TestPrivate1 {
    public static void main(String[] args) {
        //3.创建用户类的对象
        User u = new User();
        //4.修改对象的属性值
        u.name = "李逵";
        /*需要封装属性,如果不封装的话,就可以直接修改属性的值,不安全*/
        //u.money = 999999999;
        //5.查看修改后的属性值
        System.out.println(u.name);
        //System.out.println(u.money);
        //6.4调用两个方法修改和查看属性值
        u.setMoney(8888888.88);
        System.out.println(u.queryMoney());
    }
}

//1.创建一个用户类User
class User{
    //2.定义用户类的属性
    String name;
    //6.1封装属性--通过private关键字封装属性
    private double money = 10000;
    //6.2提供方法1:查询当前账户的余额
    public double queryMoney(){
        /*后续可以添加权限校验的操作*/
        return money;
    }
    //6.3提供方法2:修改当前账户的余额
    public void setMoney(double money){
        /*后续可以添加权限校验的操作*/
        /*当本类的成员变量与局部变量同名时
        可以使用this关键字指定本类的成员变量*/
        this.money = money;
    }
}

Java 如何实现数据封装

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

在这里插入图片描述

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("汽车停止了~");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值