Java基础篇:封装

简介: 面向对象最基本的特征,把真实世界的某些物体包成对象,里面的信息不对外公开,只公开某些特定方法让别人使用,内部的属性与逻辑都隐藏起来,不让人直接使用,也不需要让别人直接使用,就是所谓的`封装`

介绍

面向对象最基本的特征,把真实世界的某些物体包成对象,里面的信息不对外公开,只公开某些特定方法让别人使用,内部的属性与逻辑都隐藏起来,不让人直接使用,也不需要让别人直接使用,就是所谓的封装

设想一个例子,提款机,你不知道它里面还有多少钱,也不知道内部的运做,不知道哪家公司生产的机器,但你还是会去使用他提供的方法:查询余额提款。因为他只开放这两个方法给一般人使用,你要使用这两个方法需要带入的参数是提款卡及密码,就可以完成你的需求

class ATM {
    private BigDecimal 剩余金额;

    private boolean 身份验证(Object 提款卡, String 密码) {
        // 验证逻辑
        // 通过 返回 true
    }

    private void 吐钞() {
        // 哒哒哒哒哒哒
    }

    public void 提款(Object 提款卡, String 密码) {
        if (身份验证(提款卡, 密码) == true)
            吐钞();
    }

    public BigDecimal 查询余额(Object 提款卡, String 密码) {
        // 查询数据库余额 0
        if (身份验证(提款卡, 密码) == true)
            return 剩余金额;
        else
            return BigDecimal.ZERO;
    }
}

当然实际上更为复杂且严密(而且我对提款机不熟),但在怎么复杂,使用上一般使用者只要知道使用哪些公开的方法就好(虽然不熟但我会领钱、查余额),剩下的就是设计这个类别的设计师要负责的工作

常用修饰符 private 、 public

private 私有

private是属性隐藏会普遍使用的修修饰符,开放权限最低,只有当前类中能够存取

public 公开

private相反,public是任何人都可以调用,通常用来表示这个方法可以供大家访问,一个public的方法内可以调用多个 private 的方法来实现需要的功能

Getter 与 Setter

为了属性隐藏,我们常把重要属性设为private,要供别人(甚至自己)存取的时候,通常会利用getter()setter()这种对外公开方法间接的存取。
来看个例子,学生类的属性有姓名、年龄,提供settergetter方法

public class Student {

    private String name;
    private int age = -1;

    public void setName(String name) {
        if (name == null || name.trim().length() == 0) {
            System.out.println("ERROR: 名字不能为空!");
        } else {
            this.name = name;
        }
    }

    public void setAge(int a) {
        if (a < 0) {
            System.out.println("ERROR: 年齡不能为负数!");
        } else {
            this.age = a;
        }
    }

    public String getName() {
        return name == null ? "无名氏" : this.name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "名字:'" + this.getName() + '\'' +
                ", 年龄:" + this.getAge() +
                '}';
    }
}

这是常见的设计方法,成员属性的部份都设为 private,而公开了setName()setAge()让别人调用来设定nameage的值,这就是通过公开方法间接的设定隐藏的属性值,好处是我这样写可以在设定属性值前先做一些前处理(以上述代码来说就是检查参数的合法性)。
getter的部份,也公开了两个方法可以让别人存取到内部隐藏的属性,以getName()来说,可以在回传出去前多做一步处理(这里简单空判断) ,这样的设计方式是常见且容易维护的。

测试代码

public class TestStudent {
    public static void main(String[] args) {

        Student s1 = new Student();
        s1.setName("源十天狗");
        System.out.println("s1设置年龄为-500");
        s1.setAge(-500);
        System.out.println("打印s1:==>"+ s1.toString());

        Student s2 = new Student();
        System.out.println("s2不设置名字");
        s2.setName(null);
        s2.setAge(18);

        System.out.println("打印s2:==>"+ s2.toString());

    }
}

输出

s1设置年龄为-500
ERROR: 年齡不能为负数!
打印s1:==>Student{名字:'源氏舔狗', 年龄:-1}
s2不设置名字
ERROR: 名字不能为空!
打印s2:==>Student{名字:'无名氏', 年龄:18}

可以看到对象 s1 因为乱传参数,所以在setter被设定前被先检查出来,可以进一步增加程序的稳定性

相关文章
|
10天前
|
Java 机器人 程序员
深入理解Java中的类与对象:封装、继承与多态
深入理解Java中的类与对象:封装、继承与多态
|
4天前
|
Java 编译器
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
|
9天前
|
安全 Java
|
19天前
|
Java 数据安全/隐私保护
Java 封装:打破传统,创新你的编程思维!
【6月更文挑战第16天】Java中的封装是将数据和操作数据的方法封装在类中,隐藏内部细节,通过公共接口交互。这样保证了数据安全,降低了耦合度,便于验证(如`Shape`类中构造函数的类型检查)和控制(如`setType`方法中添加额外操作)。封装使代码更清晰、可维护,鼓励创新编程思维。
|
19天前
|
安全 Java 数据安全/隐私保护
一探 Java 封装究竟:为何它让代码更加“高大上”?
【6月更文挑战第16天】Java中的封装如城堡般迷人,它确保数据安全(如`UserInfo`类的私有属性),增强代码结构(如`Order`类的操作封装),并提升复用性与扩展性(如`Shape`类的抽象设计)。封装是打造高质量、易维护代码的关键,让代码既安全又高效。
|
19天前
|
存储 安全 Java
深入探讨 Java 封装机制:为何它是面向对象编程的核心?
【6月更文挑战第16天】Java的封装是OOP核心,它将数据和操作数据的方法打包在类中,隐藏实现细节并提供公共接口。例如,`Student`类封装了私有属性`name`和`age`,通过`get/set`方法安全访问。封装提升代码稳定性、可维护性和复用性,防止外部直接修改导致的错误,确保数据安全。它是面向对象编程优于传统编程的关键,促进高效、可靠的开发。
|
19天前
|
Java 开发者
那些年,我们追过的 Java 封装:从新手到专家的必经之路
【6月更文挑战第16天】Java初学者到专家的旅程中,封装是关键一环。封装隐藏实现细节,提供简洁接口,保护数据并确保代码整洁、可维护。以`Person`类为例,私有变量与公共方法展示了封装原则,助力团队协作和问题解决,成为编程路上的宝贵经验。封装,从新手到高手的不解之缘,持续塑造更高效、可靠的软件。
|
16天前
|
Java 数据安全/隐私保护
Java基础之类封装、继承、多态
Java基础之类封装、继承、多态
12 2
|
17天前
|
Java 数据安全/隐私保护 开发者
Java是一种完全支持面向对象编程的语言,其面向对象特性包括封装、继承、多态和抽象等
【6月更文挑战第18天】**面向对象编程(OOP)通过对象封装状态和行为,实现问题域的抽象。Java全面支持OOP,核心特性包括**: - **封装**:保护数据安全,隐藏内部细节。 - **继承**:子类继承父类属性和行为,促进代码重用。 - **多态**:一个接口多种实现,增强灵活性和扩展性。 - **抽象**:通过接口和抽象类抽离共性,简化复杂性。 **Java的OOP便于理解和解决复杂系统问题。**
28 3
|
16天前
|
安全 Java 数据安全/隐私保护
Java基础之类封装、继承、多态
Java基础的封装、继承和多态是OOP的核心。封装通过访问控制(如private)隐藏类的内部细节,提供公共接口供外部交互。例如,`Person`类封装`name`和`age`,通过`getName()`和`setAge()`方法访问。继承允许子类(如`Dog`)继承父类(如`Animal`)的属性和方法,并可扩展或覆盖。多态使得父类引用可指向子类对象,调用方法时根据实际对象类型执行,如不同动物的`makeSound()`。接口实现多态提供了一种定义行为而不必关心实现的方式。向上转型(子类→父类)安全且默认,而向下转型(父类→子类)需类型检查以避免异常。
13 1