关于java的封装

news2024/11/15 13:43:39

关于java的封装

我们在前面的文章中,了解到了类和对象的知识,以及做了创建对象的时候对内存的分析,我们本篇文章来了解一下面向对象的三大基本特征之一,封装😀。

一、初识封装

封装就好比,我们把一些物品放在一个箱子里面,然后给箱子留一个缺口也可以把物品拿出来🤔。

结合现实生活中的方式也可以理解,最常见的就是我们敲代码的电脑,我们买来一个笔记本电脑,不需要自己去组装,厂家都已经把笔记本内部的一些复杂构造都封装好了,我们买回来开机就可以使用了,这个电脑也给外部留了一些接口,比如电源,usb插口等。

  • 该漏的漏,该藏的藏!

  • 我们程序的设计,应该遵循高内聚,低耦合

  • 高内聚:类的内部数据操作由自己完成,不允许外部干涉。

比如银行的钱,只能自己去管理,不允许外部人员参与管理,拒绝外部干涉。

  • 低耦合:仅暴露少量的方法供外部使用。

比如我们去银行取钱,只能用自己的银行卡区去取钱。

  • 属性私有:get / set

二、私有(private)

属性的私有就是,在类中进行修饰,把类中的属性变为私有的属性,不可以随意调用。

我们用代码的方式来说明一下,首先我们创建一个学生类,并且创建的属性和方法用private修饰。

package oop.Demo04;
//private:私有  public:公有
public class Students
{
    //姓名
    private String name;
    //学号
    private int id;
    //性别
    private String sex;
    //学习()
    private void study()
    {

    }
}

然后我们用main方法对这个类进行实例化。

package oop.Demo02;

import oop.Demo04.Students;

public class Application {
    public static void main(String[] args) {
        Students s1 = new Students();
        s1.name="";//这里不可以直接调用,编译器会报错提示,如下图。
    }
}

在这里插入图片描述

我们可以发现,如果我们的修饰符是公有的,那可以在创建完对象的时候,直接拿过来使用,但是我们定义的属性是私有属性,就没有权限拿过来使用。

我们如果想去使用,就需要提供一些可以操作这些属性的方法。

  • 提供一些 public 的 get 或者set方法。
  • get :获取这个属性。
  • set :给这个数据设置值。

三、get

package oop.Demo04;
//private:私有  public:公有
public class Students
{
    //姓名
    private String name;
    //学号
    private int id;
    //性别
    private String sex;
    //学习()
    private void study()
    {

    }
    //get方法 公有方法,可以直接调用。
    public String getName()
    {
    	return this.name;
    }
}

四、set

package oop.Demo04;
//private:私有  public:公有
public class Students
{
    //姓名
    private String name;
    //学号
    private int id;
    //性别
    private String sex;
    //学习()
    private void study()
    {

    }
    //get方法 公有方法,可以直接调用。
    public String getName()
    {
    	return this.name;
    }
    //set方法 公有方法,但是要有返回值类型
    public void setName(String name)
    {
    	this.name=name;
    }
}

五、get/set方法的调用

我们上面了解了两个方法,虽然这个类里面的属性都是私有的,但是有开放的方法,就好比是箱子的一个缺口,我们可以通过方法,来调用私有的属性,然后拿来使用😎。

package oop.Demo02;

import oop.Demo04.Students;

public class Application {
    public static void main(String[] args) {
        
        Students s1 = new Students();//创建对象是s1
        
        s1.setName("落满樱花的羊");//用set方法进行传参
        
        System.out.println(s1.getName());//用get方法进行获取输出
    }
}

我们执行一下代码,发现可以输出名字。

落满樱花的羊

进程结束.......
  • 我们以后在定义属性的时候,基本上都会用private私有修饰符。
  • 我们写get / set 方法的时候也可以发现,比如setName,也是遵循驼峰规则的。
  • alt + ins 快捷键!!我们前面的文章说到他可以直接生成构造器,这个快捷键同样可以生成get set 方法,非常实用!😎

在这里插入图片描述

根据自己需要的属性去选择,就可以一键生成get和set方法。

六、get/set方法优化

我们再定义一个年龄的属性,age,但是我们知道,人的年龄是有上限和下限的,所以不能随意赋值,我们先看一下错误示范!

package oop.Demo04;
//private:私有  public:公有
public class Students
{
    //姓名
    private String name;
    //学号
    private int id;
    //性别
    private String sex;
    //年龄
    private int age;

    public String getName()
    {
        return this.name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

我们这里定义好一个年龄的get set 方法,我们输出一个200岁。

package oop.Demo02;

import oop.Demo04.Students;

public class Application {
    public static void main(String[] args) {
        Students s1 = new Students();
        s1.setName("落满樱花的羊");
        System.out.println(s1.getName());
        s1.setAge(200);
        System.out.println(s1.getAge());
    }
}
落满樱花的羊
200

进程结束......

我们可以看到,虽然我们可以正常输出,但是人没有200岁这个年纪🥲,方法是我们自己定义的,所以我们一样可以在封装的方法里面去优化,可以加一个判断。

    public void setAge(int age) {
        if (age>120 || age<0)
        {
            this.age=1;
        }
        else
        {
            this.age = age;
        }
    }

我们再执行刚刚传参200的代码,就会发现,输出的结果是

落满樱花的羊
1
    
进程结束......

七、封装的意义

  • 提供程序的安全性,可以保护数据。
  • 隐藏代码的细节,比如年龄设计。
  • 统一接口,所有的方法都是get set。
  • 提高了系统的可维护性,良好的封装可以便于我们更改内部代码。
  • 将数据的属性隐藏起来,禁止直接访问其中一个属性,需要通过接口去访问,也称之为信息隐藏。
  • 注意方法的重载,可以多去参考一下println方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Python3 中使用变量

介绍 变量是一个重要的编程概念&#xff0c;值得掌握。它们本质上是在程序中用于表示值的符号。 本教程将涵盖一些变量基础知识&#xff0c;以及如何在您创建的 Python 3 程序中最好地使用它们。 理解变量 从技术角度来说&#xff0c;变量是将存储位置分配给与符号名称或标…

YOLOv8改进 | 主干篇 | 低照度增强网络PE-YOLO改进主干(改进暗光条件下的物体检测模型)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络PE-YOLO中的PENet,PENet通过拉普拉斯金字塔将图像分解成多个分辨率的组件,增强图像细节和低频信息。它包括一个细节处理模块(DPM),用于通过上下文分支和边缘分支增强图像细节,以及一个低频增强滤波器(LEF),…

<软考高项备考>《论文专题 - 71 风险管理(3)》

3 过程2-识别风险 3.1 问题 4W1H过程做什么是识别单个项目风险以及整体项目风险的来源&#xff0c;并记录风险特征的过程。作用:1、记录现有的单个项目风险&#xff0c;以及整体项目风险的来源:2、汇总相关信息&#xff0c;以便项目团队能够恰当地应对已识别的风险。为什么做…

重温经典struts1之DispatchAction完成一个Action中编写多个方法接收页面的增删改查请求

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 之前我们学习的Action类中&#xff0c;编写一个方法&#xff0c;重写父类的execute方法&#xff0c;接收页面发来的请求&#xff0c;而且&#xff0c;一个action中只能…

Jetson AGX Orin安装archiconda、Pytorch

想在Jetson AGX Orin创建一个虚拟环境&#xff0c;然后安装pytorch&#xff0c;过程中遇到了很多的坑&#xff0c;这篇文章主要用于记录过程~因为Orin本身是Arm架构&#xff0c;X86架构可以装Anaconda&#xff0c;对于ARM要装archiconda。 1.安装archiconda 1.1确定操作系统架…

FlinkSQL【分组聚合-多维分析-性能调优】应用实例分析

FlinkSQL处理如下实时数据需求&#xff1a; 实时聚合不同 类型/账号/发布时间 的各个指标数据&#xff0c;比如&#xff1a;初始化/初始化后删除/初始化后取消/推送/成功/失败 的指标数据。要求实时产出指标数据&#xff0c;数据源是mysql cdc binlog数据。 代码实例 --SET t…

【GCC】6 接收端实现:周期构造RTCP反馈包

基于m98代码。GCC涉及的代码,可能位于:webrtc/modules/remote_bitrate_estimator webrtc/modules/congestion_controller webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc webrtc 之 RemoteEstimatorProxy 对 remote_bitrate_estimator 的 RemoteEstimato…

java注释详解

1、Java 中的注释详解 概括&#xff1a;注释是增加一些说明&#xff0c;在编译后&#xff0c;注释会被抹掉&#xff0c;不起任何租用&#xff0c;只在书写代码的时候&#xff0c;对代码进行的一个说明 不管是那种编程语言&#xff0c; 代码的注释都是必备的语法功能&#xff…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(5)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

GitLab Runner 实现项目 CI/CD 发布

Gitlab Runner简介 Gitlab实现CICD的方式有很多&#xff0c;比如通过Jenkins&#xff0c;通过Gitlab Runner等&#xff0c;今天主要介绍后者。Gitlab在安装的时候&#xff0c;就默认包含了Gitlab CI的能力&#xff0c;但是该能力只是用于协调作业&#xff0c;并不能真的去执行…

Vulnhub-tr0ll-1

一、信息收集 端口收集 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_-rwxrwxrwx 1 1000 0 8068 Aug 09 2014 lol.pcap [NSE: writeable] | ftp-syst: | STAT: | FTP …

STM32F103标准外设库——GPIO 输入、输出 (五)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

Qt第二周周二作业

代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void paintEvent(…

苹果MAC怎么清理内存?苹果MAC清理内存的方法

很多使用苹果电脑的用户都喜欢在同时运行多个软件&#xff0c;不过这样会导致在运行一些大型软件的时候出现不必要的卡顿现象&#xff0c;这时候我们就可以去清理下内存&#xff0c;不过很多人可能并不知道正确的清内存方式&#xff0c;下面就和小编一起来看看吧。 苹果MAC清理…

微信小程序防止截屏录屏

一、使用css添加水印 使用微信小程序原生的view和css给屏幕添加水印这样可以防止用户将小程序内的隐私数据进行截图或者录屏分享导致信息泄露&#xff0c;给小程序添加一个水印浮层。这样即使被截图或者拍照&#xff0c;也能轻松地确定泄露的源头。效果图如下&#xff1a; 代码…

从云计算到物联网:虚拟化技术的演变与嵌入式系统的融合

文章目录 一、硬件性能提升&#xff1a;摩尔定律与嵌入式虚拟化二、CPU多核技术&#xff1a;为嵌入式虚拟化提供支持三、业务负载整合&#xff1a;嵌入式虚拟化的核心需求四、降低硬件成本&#xff1a;虚拟化技术的经济效益五、软件重用与移植&#xff1a;虚拟化技术的优势六、…

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…

每日一练:LeeCode-107、199、637、429、515、116、117题-层序遍历模版通解 【二叉树】

本文是力扣LeeCode-107、199、637、429、515、116、117题的层序遍历模版通解 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 以下题目都是套用层序遍历的模版解决的: 大家可以去参考我的 每日一练&#xff1a;LeeCode-10…

接口防刷方案

1、前言 本文为描述通过Interceptor以及Redis实现接口访问防刷Demo 2、原理 通过ip地址uri拼接用以作为访问者访问接口区分 通过在Interceptor中拦截请求&#xff0c;从Redis中统计用户访问接口次数从而达到接口防刷目的 如下图所示 3、案例工程 项目地址&#xff1a; htt…

【Linux】Linux 系统编程——which 命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 which 命令用于定位执行文件的路径。当输入一个命令时&#xff0c;which 会在环境变量 PATH 所指定的路径中搜索每个目录&#xff0c;以查找指定的可执行文件。 2.命令格式 which [选项] 命令名3.常…