java的封装

封装概述

        java中的封装指的是将一系列有关的事物的共同属性和行为提取出来放到一个类中,隐藏对象的实行和现实细节,仅对外提供公共的访问方式的操作。这样说起来感觉很抽象,也不好理解,这里不妨举一个例子。将配置电脑这个动作看成封装。

        这个要怎么理解呢?一般情况下,现在大多数人使用的是笔记本电脑,但是在排除风险的情况下,台式机的性价比要高于笔记本,这里不讨论如何配置一台好的台式机,也不需要理解如何配置台式机,只要理解,所谓的台式机就是将电脑需要的显卡、声卡、内存条、散热装置等放到一个盒子里,然后在这个盒子上开了一些口,用来连接键盘、耳机、电源、显示器等。配置完一台电脑后,只需要通过键盘和鼠标就能对电脑进行操作了。这里将显卡、声卡、内存条等装置放入机箱的过程看成封装,就相当于隐藏对象的实行和现实细节,预留的电源和usb接口就是提供公共的访问方式。

        那么封装带来了一些什么样的好处呢?依然以台式机的主机作为例子,如果台式机的主机没有机箱,那么它里面的声卡啊、显卡啊什么的都将直接暴露在空气中,且无法直接固定,那么各个装置之间的连接极有可能因为使用者的粗心而频繁失效,同时用电也会成为安全隐患,所以封装首先就提供了安全性。其次,封装之后提供了对外的公共访问接口,一台没有进行封装的电脑主机,它与外界的连接不一定是标准接口,那么就不是所有的外接设备都能使用这个电脑主机,它的复用性也就大大降低了。最后,如果不是电脑高手,而是一个电脑小白,那么要使用台式电脑,可以直接购买电脑主机,不需要对电脑主机进行配置,将原本复杂的配置流程直接简化。这就是封装的好处,大大降低了事情的复杂程度。

        在java中,封装体包括了方法和类。方法的安全性体现在调用者不知道方法是如何实现的,只知道方法的功能,并将其调用;复用性体现在方法可以重复使用;简单化体现为将冗杂的代码用一个方法体现出来,通过调用方法就可以实现方法的功能,代码的维护也变得更加方便。类的安全性体现在调用者不知道类是如何实现的,只能通过访问定义类中的对象,但这个类中定义的对象属性以及方法究竟是怎样的,调用者并不知道;复用性体现为一个类中可以定义多个对象;简单化体现为类中的对象,拥有的方法功能并不单一,但只要调用者合法访问就能调用对象方法,实现对象功能。

封装的实现——访问控制符

        在java中,访问控制符一共有四个,即private,default(即下表中的默认)、protected以及public。它们的访问权限如下表所示,接下来对它们的作用一一叙述。

        private,权限修饰符,表示私有,当用来修饰类中的成员时,被修饰的成员只能在本类中被访问。使用private时的具体格式为: 

                private 数据类型 变量名;

                private 返回值类型 方法名(参数列表){};

        default,表示没有修饰符,可以写,也可以不写。当用default来修饰类中的成员时,被修饰的成员不仅在本类中能被访问,与本类处于同一个包中的类也能对被defanlt修饰的成员进行访问。但本类的子类以及其他的类无法访问default修饰的成员。

        protected,表示被保护的,当用protected来修饰成员时,被修饰的成员不仅能被本类和与本类处于同一个包下的类访问,还能被本类的子类访问,但是除此之外,其他的类不能访问被protected修饰的成员。这里要注意,当本类的子类要访问被protected修饰的成员时,有一个注意事项,那就是如果父类和子类在同一个包中,子类可以访问父类的protected成员,也可以访问父类对象的protevted成员,但当父类和子类不在同一个包中时,子类可以访问父类的protected成员,但不能访问父类对象的protected成员

        public公共的,即所有的类都可以访问public修饰的成员。

        接下来用代码来具体演示这四个关键字的使用,以加深理解。首先创建两个包,分别为cn.fengzhuang.demo和cn.fengzhuang.demo1。在cn.fengzhuang.demo中创建三个对象,分别为Person、Student和Student1,其中Student1为Person的子类。在cn.fengzhuang.demo1中创建两个类,分别为Teacher和Teacher1,其中Teacher1为Person类的子类。以下为这5个类的关系以及创建代码:

public class Person {
    private int testPrivate = 100;
    int testDefault = 200;
    protected int testProtected = 300;
    public void test(){
        System.out.println(this.testPrivate);
        System.out.println(this.testDefault);
        System.out.println(this.testProtected);

    }
}
package cn.fengzhuang.demo;

public class Student {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(p.testPrivate);
        System.out.println(p.testDefault);
        System.out.println(p.testProtected);
    }
}
package cn.fengzhuang.demo;

public class Student1 extends Person {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.Private);
        System.out.println(person.testDefault);
        System.out.println(person.testProtected);
    }

}
package cn.fengzhuang.demo1;

import cn.fengzhuang.demo.Person;

public class Teacher extends Person {
    public static void main(String[] args) {
        Person p1 = new Person();
        System.out.println(p1.testPrivate);
        System.out.println(p1.testDefault);
        System.out.println(p1.testProtected);
    }
}
package cn.fengzhuang.demo1;

import cn.fengzhuang.demo.Person;

public class Teacher1 extends Person {
    public void test(){
        System.out.println(super.testProtected);
    }
    public static void main(String[] args) {
        Person p3 = new Person();
        System.out.println(p3.testPrivate);
        System.out.println(p3.Default);
        System.out.println(p3.testProtected);
    }

}

        在以上的五个代码中,每一个代码都会报错,接下来,根据四个关键字的作用来分析这些错误。首先,对于private关键字,它修饰的成员只能在本类中被访问,所以除了Person类能正常访问成员testPrivate外,其他的类访问testPrivate均会报错。

        其次,对于default关键字 ,被它修饰的成员不仅在本类中能被访问,与本类处于同一个包中的类也能对被defanlt修饰的成员进行访问,因此,对于testDefault成员,Person、Student、Student1这三个类不会报错,而cn.fengzhuang.demo1下的Teacher和Teacher1两个类在访问testDefault成员时会报错。

        对于protected关键字,由于被修饰的成员不仅能被本类和与本类处于同一个包下的类访问,还能被本类的子类访问,但如果父类和子类在同一个包中,子类可以访问父类的protected成员,也可以访问父类对象的protevted成员,但当父类和子类不在同一个包中时,子类可以访问父类的protected成员,但不能访问父类对象的protected成员。因此Person、Student、Student1这三个类访问testProtect成员时不会报错,但Teacher访问testProtect成员时会报错。而对于,Teacher1类,因为它和Person类不再同一个包中,因此如果在Teacher1类中访问父类的protected成员就不会报错,但是如果在这个类中访问父类对象的protected成员就会报错。简单来说就是,如果通过对象来访问protected成员时,protected成员已经属于了类,所以叫对象的protected成员,会报错。但是如果通过super关键字直接访问父类中的protected成员,则不会报错。错误提示如下图。

 

 

 

封装的使用

        前面,用电脑主机的配置来比喻java中的封装,那么会有人想,如果电脑主机中的配件坏了怎么办呢?得拆开来修吗?其实,一般情况下,电脑会提供一套方法来检测电脑中软件或者硬件是否出现问题,这就涉及到了访问电脑主机中的配件的问题。同样,对于java中的封装体,一般情况下,属性类通常用private关键字来修饰,也就是只能在本类中访问这些成员变量,所以也得有算法来帮助访问封装体中的成员。

        在java中一般提供set和get方法来访问相关的私有属性,用来对属性进行赋值或者读取操作,值得注意的是,boolean类型的get方法不是get开头,而是is开头。

        接下来用一个简单的javabean代码来演示set和get方法。

Person1 {
    private String name;
    private int age;
    private boolean flag;

    public String getName() {
        return name;
    }

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

    public void setAge(int age) {
        if(age<=0||age >150){
            System.out.println("非法输入");
        }
        else{
            this.age = age;
        }

    }

    public int getAge(){
        return age;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

        

public class TestPerson1 {
    public static void main(String[] args) {
        Person1 p = new Person1();
        p.setAge(100);
        System.out.println(p.getAge());
    }
}

        从上面的代码当中,能够看到,boolean类型的成员flag的set方法采用的方法名称为 isFlag。

而值得注意的是,java中的set和get方法可以自己写,也可以通过快捷键ALT+INS调出窗口,然后根据窗口提示快速生成。

         

 

 

 

 

 

 

 

 

 

      

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

伪装目标检测之注意力CBAM:《Convolutional Block Attention Module》

论文地址&#xff1a;link 代码&#xff1a;link 摘要 我们提出了卷积块注意力模块&#xff08;CBAM&#xff09;&#xff0c;这是一种简单而有效的用于前馈卷积神经网络的注意力模块。给定一个中间特征图&#xff0c;我们的模块依次推断沿着两个独立维度的注意力图&#xff…

Qt实现简易的多线程TCP服务器(支持多个客户端连接)附源码

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化&#xff0c;m_widget我们用于后续的显示消息等&#xff0c;说白了就是主界面的更新显示等 …

为何ChatGPT日耗电超50万度?

看新闻说&#xff0c;ChatGPT每天的耗电量是50万度&#xff0c;国内每个家庭日均的耗电量不到10度&#xff0c;ChatGPT耗电相当于国内5万个家庭用量。 网上流传&#xff0c;英伟达创始人黄仁勋说&#xff1a;“AI的尽头是光伏和储能”&#xff0c;大佬的眼光就是毒辣&#xff…

使用LLaVA模型实现以文搜图和以图搜图

本文将会详细介绍如何使用多模态模型——LLaVA模型来实现以文搜图和以图搜图的功能。本文仅为示例Demo&#xff0c;并不能代表实际的以文搜图和以图搜图的技术实现方案。 1、实现原理 使用多模态模型获取图片的标题和详细描述以文搜图功能&#xff1a;使用ES实现查询匹配&…

深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*

目录 前言一、什么是MTD子系统&#xff1f;二、 /dev/mtd* 设备文件用途注意事项 三、/dev/mtdblock* 设备文件用途注意事项 三、这两种设备文件的关系四、关norflash的一些小知识 前言 在嵌入式Linux系统的世界里&#xff0c;非易失性存储技术扮演着至关重要的角色。MTD&#…

面试知识汇总——垃圾回收器(分代收集算法)

分代收集算法 根据对象的存活周期&#xff0c;把内存分成多个区域&#xff0c;不同区域使用不同的回收算法回收对象。 对象在创建的时候&#xff0c;会先存放到伊甸园。当伊甸园满了之后&#xff0c;就会触发垃圾回收。 这个回收的过程是&#xff1a;把伊甸园中的对象拷贝到F…

初识redis(一)

前言 引用的是这本书的原话 Redis[1]是一种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis中的值可以是由string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列…

Android15功能和 API 概览

Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能&#xff0c;以帮助您开始使用相关 API。 如需查看新增、修改和移除的 API 的详细列表&#xff0c;请参阅 API 差异报告。如需详细了解新的 API&#xff0c;请访问 Android API 参考文档&#xff0…

Selenium 自动化 —— 定位页面元素

更多内容请关注我的 Selenium 自动化 专栏&#xff1a; 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码浏览器窗口操作切换浏览器窗口 使用 Selenium 做自动化&#xff0c;我们不仅仅是打开一个网页&#xff0c;这只是万里长…

Stable Diffusion 进阶教程 - 二次开发(制作您的文生图应用)

目录 1. 引言 2. 基于Rest API 开发 2.1 前置条件 2.2 代码实现 2.3 效果演示 2.4 常见错误 3. 总结 1. 引言 Stable Diffusion作为一种强大的文本到图像生成模型&#xff0c;已经在艺术、设计和创意领域引起了广泛的关注和应用。然而&#xff0c;对于许多开发者来说&#xff…

时序预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测

时序预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

DRC检查及丝印的调整

DRC检查及丝印的调整 综述&#xff1a;本文主要讲述AD软件中DRC检查、丝印的调整以及logo的添加的相关步骤&#xff0c;附加logo添加的脚本链接和大量操作图片&#xff0c;使步骤详细直观。 1. 点击“工具”→“设计规则检查”→“运行DRC”。&#xff08;一开始可以只开启电…

利用云手机技术,开拓海外社交市场

近年来&#xff0c;随着科技的不断进步&#xff0c;云手机技术逐渐在海外社交营销领域崭露头角。其灵活性、成本效益和全球性特征使其成为海外社交营销的利器。那么&#xff0c;究竟云手机在海外社交营销中扮演了怎样的角色呢&#xff1f; 首先&#xff0c;云手机技术能够消除地…

LLM - 大语言模型的指令微调(Instruction Tuning) 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137009993 大语言模型的指令微调(Instruction Tuning)是一种优化技术&#xff0c;通过在特定的数据集上进一步训练大型语言模型(LLMs)&a…

javaWeb个人日记(博客)管理系统

一、简介 在快节奏的生活中&#xff0c;记录生活点滴、感悟和思考是一种重要的方式。基于此&#xff0c;我设计了一个基于JavaWeb的个人日记本系统&#xff0c;旨在帮助用户轻松记录并管理自己的日记。该系统包括登录、首页、日记列表、写日记、日记分类管理和个人中心等功能&…

mysql - 缓存

缓存 InnoDB存储引擎在处理客户端的请求时&#xff0c;当需要访问某个页的数据时&#xff0c;就会把完整的页的数据全部加载到内存中&#xff0c;也就是说即使我们只需要访问一个页的一条记录&#xff0c;那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以…

命令模式(请求与具体实现解耦)

目录 前言 UML plantuml 类图 实战代码 模板 Command Invoker Receiver Client 前言 命令模式解耦了命令请求者&#xff08;Invoker&#xff09;和命令执行者&#xff08;receiver&#xff09;&#xff0c;使得 Invoker 不再直接引用 receiver&#xff0c;而是依赖于…

Java基础--128陷阱

问题引入 Integer a 123; Integer b 123; System.out.println(ab); 结果为true。 但是如果代码如下 Integer a 1230;Integer b 1230;System.out.println(ab); 这个的结果就是false。 问题解决 当Integer a 123时&#xff0c;其实他底层自动转换成了Integer a Inte…

Learn OpenGL 29 延迟着色法

延迟着色法 我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading)&#xff0c;它是我们渲染物体的一种非常直接的方式&#xff0c;在场景中我们根据所有光源照亮一个物体&#xff0c;之后再渲染下一个物体&#xff0c;以此类推。它非常…

网络安全-文件包含

一、php://input 我们先来看一个简单的代码 <meta charset"utf8"> <?php error_reporting(0); $file $_GET["file"]; if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://&quo…