iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详细聊一聊java中封装的那点事
  • 459
分享到

详细聊一聊java中封装的那点事

2024-04-02 19:04:59 459人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是封装封装拓展之包包的概念 什么是包访问权限什么是静态成员总结一下: 什么是封装 什么是封装呢?我们先来看一段代码 class Student {

什么是封装

什么是封装呢?我们先来看一段代码

class Student {
    public String name;
    private int age;
}
public class Test4 {
    public static void main(String[] args) {
        // 引用变量student指向该新创建的对象
        Student student = new Student();    // 实例化对象
        student.age = 12; // 通过引用变量名.成员变量来访问Student类中的成员变量            
    }
}

 让我们运行一下

 好家伙,报错了,为什么当age被private修饰后就不能访问了呢?

?private的字面意思就是私人的、私有的,在java中被private修饰的变量只能在当前类中访问,就像上面的Student类中的age变量,它就只能在Student这个类中被访问,不能在Test4这个类中访问。 

这样有什么用呢?当然有用?

这样可以防止age其他地方被随意的修改,比如把age赋值成一个负数,那合适吗、正常吗?

 ?那name成员变量前的public又是什么意思呢?public就是公共的、公开的,被public修饰的成员变量不管在那都是可以被访问的。我们之前在定义成员变量时,好像在变量前没有像public、private这样的东东呀!那时我们也能通过对象引用一个一个的访问那些成员变量呀?

?这时我们就有必有引入封装这个概念了

?封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。例如:一台计算机内部极其复杂,有主板、CPU、硬盘和内存, 而一般用户不需要了解它的内部细节,不需要知道主板的型号、CPU 主频、硬盘和内存的大小,于是计算机制造商将用机箱把计算机封装起来,对外提供了一些接口,如鼠标、键盘和显示器等,这样当用户使用计算机就非常方便。

?封装的特点:

  • 只能通过规定的方法访问数据。
  • 隐藏类的实例细节,方便修改和实现。

?实现封装的具体步骤如下:

  • 修改属性的可见性来限制对属性的访问,一般设为 private。
  • 为每个属性创建一对赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。
  • 在赋值和取值方法中,加入属性控制语句(对属性值的合法性进行判断)。

?我们刚才提到的private其实就是一种封装,被private修饰的只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

?那么我们如何访问被private修饰的成员变量呢?

?如果外界想要访问私有属性,需要提供一些使用public修饰的公有方法。其中包括用于获取属性值的getXxx方法和设置属性值的setXxx方法 。

class Student {
    public String name;
    private int age;
 
    public int getAge() {        // 这些专门用来访问设置属性的方法一般用public来修饰
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}
public class Test4 {
    public static void main(String[] args) {
        Student student = new Student();
        student.name = "张三";   // 被public修饰的可以在其他类中随意访问(但不太安全,有风险)
        System.out.println("姓名:" + student.name);
 
        System.out.println("======这是分割线========");
        student.setAge(19);    // 通过专门的设置属性的setAge()方法来赋值(安全,不能随意修改)
        System.out.println("年龄:" + student.getAge());//通过专门的访问属性的getAge()来打印
    }
}

 

从运行结果来看,姓名、年龄都被成功的赋值并打印了。但因为他们前面的访问修饰限定符不一样,所以对年龄、姓名的访问权限也不同,访问方式自然也不同了。

封装拓展之包

?而如果你没任何修饰限定符,编译器默认就是包访问权限;想要理解什么是包访问权限,你首先要理解什么是包。

包的概念

?在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件 包。

?这其实有点类似于我们电脑中不同的文件夹。

在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一 个包中的类不想被其他包中的类使用。

包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。 

? 我们可以idea里尝试创建一个包:

?然后输入你包的名字,比如demo1,然后回车

?就新创建了一个新的文件夹demo1

 ?在这个文件夹(也就是这个包中)我们就可以添加我们的java文件了

 

 什么是包访问权限

 包访问权限就是只要我们再同一个包下面就可以访问互相访问,即使他们不在同一个java文件里面

为了更清楚一点,我们来实践一下

?可以看到我们在testdemo1中定义了一个变量a,成员变量a的访问权限是包访问权限

 看来只要这个变量是包访问权限,那么在一个包下变量可以互相访问呀!

 那么如果不在一个包下呢

 看来就无法访问了?

?这下你对包访问权限是否有了一个初步的理解了呢?

?从上面的例子我们也不难发现,

被private修饰的变量只能在同一个类中访问默认的包访问权限可以在同一个包下、不同的类中来访问而public则是哪都能访问 

????????????????

什么是静态成员

静态成员就是被关键字static修饰的成员变量或者成员方法。

?而static又是什么呢?老规矩,先来看一段代码

class Student {
    private String name;
    private int age;
    public static String school;   // 定义一个静态成员变量
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        // 想一下我下面为什么不用this.school来访问
        System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 学校:" + school);
    }
}
public class Test4 {
    public static void main(String[] args) {
        // 奇怪吧!我还没实例化对象呢?怎么就能对类中的成员变量赋值呢?
        Student.shool = "茶啊二中"; 
        Student student1 = new Student("张三", 17);
        Student student2 = new Student("李四", 16);
        Student student3 = new Student("王五", 18);
    }
}

 ?可以看出,上面我们创建的三个学生对象都在同一个学校,所以为了节省内存空间,我们其实不需要让创建的每个对象都储存一份学校这个属性?,只要有一个内存储存学校这个属性,然后大家共享就好了。

下面先来看共享的一个例子:

class Student {
    private String name;
    private int age;
    public static String school;   // 定义一个静态成员变量
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        // 想一下我下面为什么不用this.school来访问
        System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 学校:" + school);
    }
}
public class Test4 {
    public static void main(String[] args) {
        // 奇怪吧!我还没实例化对象呢?怎么就能对类中的成员变量赋值呢?
        Student.shool = "茶啊二中"; 
        Student student1 = new Student("张三", 17);
        Student student2 = new Student("李四", 16);
        Student student3 = new Student("王五", 18);
    }
}

 什么情况,竟然没报错?

?我想你在看了上面的代码,肯定有很多疑惑吧!别着急我们慢慢来揭开static这层神秘的面试

Java 中,被 static 修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对 象,是所有对象所共享的 。 如果把shool这个属性设置为static,那school这个静态变量将会单独储存在静态区,而不是和他所在的对象一起存储在堆区。什么意思呢?咱们用图说话:

 如上图所示,实例化的对象student1和student2共享school这个成员属性。

从上图我们也可以看出静态区的school其实是不依赖对象的,因为他根本都没在对象所在的堆区,所以我们可以直接通过:类名.school来访问这个成员变量。

 哈哈,是不是有有点晕?。就快完了,加油!

?被static修饰的变量称为静态变量,被static修饰的方法称为静态方法

?不管静态变量还是静态方法都不属于某个具体的对象,而是整个类的属性。我们下面尝试用一下静态方法,看看他和普通方法的区别在哪里?

? 可以看出程序在 " run() "这个地方报错了,为啥在静态方法中不能调用普通方法呢?

?我们前面说过this这个关键字,其实在这里报错就和this引用有关。我们先来回顾一下this

 (❁´◡`❁)(❁´◡`❁)(❁´◡`❁)(❁´◡`❁)(❁´◡`❁)

?this的深入:1.在每一个非静态方法的内部,都有一个this,相当于一个句柄,由编译器隐示添加。method(参数列表)可以看成是method(类名 this,参数列表)

?在面向对象中,成员属性必须由对象调用,所以在方法内部,每一个成员其实都有一个this.”前缀,当对象调用这个方法的时候,编译器会把该对象传递给方法(也就是常说的“this指向调用该方法的当前对象”),编译器会将其编译为method(对象,实参列表)。

  ? 而在一个静态方法内部,由于静态方法是属于类的,被每个类的实例所共享,所以没有this句柄,当然就不能在静态方法中访问非静态的成员(属性和方法)?,而具体在编译器会怎么看愣,编译器会说哪个对象调用了成员,我都找不到这个对象?,然后它就会大吼一句“还有谁!!!”,最后报错?。

?所以说,静态方法里面调用的必须是不依赖对象的成员变量和成员方法——即静态方法和静态变量,当我们把上面的run普通方法改成静态方法,编译器自然就不报错了。

总结一下: 

被static修饰的成员变量或方法,被所有对象所共享静态变量和静态方法可以直接被类名所调用静态方法只能调用静态成员,不能调用非静态成员。非静态方法可以调用静态成员,也可以调用非静态成员

好了,以上就们就对静态成员有了一个初步的认识。

到此这篇关于java中封装的文章就介绍到这了,更多相关java封装详解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详细聊一聊java中封装的那点事

本文链接: https://www.lsjlt.com/news/147727.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详细聊一聊java中封装的那点事
    目录什么是封装封装拓展之包包的概念 什么是包访问权限什么是静态成员总结一下: 什么是封装 什么是封装呢?我们先来看一段代码 class Student { ...
    99+
    2024-04-02
  • 详细聊聊Vue生命周期的那些事
    目录前言一、Vue2中的生命周期实例的生命周期其它生命周期钩子二、Vue3中的生命周期OptionsAPI生命周期CompositionAPI生命周期两个新的Vue3生命周期函数最后...
    99+
    2024-04-02
  • 详细聊聊关于Mysql联合查询的那些事儿
    目录联合查询之union 1. 查询中国各省的ID以及省份名称 2. 湖南省所有地级市ID、名字 3. 用union将他们合并 联合查询之union a...
    99+
    2024-04-02
  • 一起详细聊聊C#中的Visitor模式
    目录写在前面模式演进举个例子使用了Tpye-Switch的版本尝试使用重载的版本单分派与双分派Visitor模式总结写在前面 Visitor模式在日常工作中出场比较少,如果统计大家不...
    99+
    2024-04-02
  • 详细聊一聊algorithm中的排序算法
    目录前言一、algorithm是什么?二、有哪些排序算法?sortrandom_shufflemergereverse总结前言 雨下不停,爱意难眠,说一下algorithm中的几个排...
    99+
    2024-04-02
  • 详细聊聊Vue.js中的MVVM
    目录MVVM的理解MVVM的原理脏检查机制:数据劫持相同点实现MVVM总结MVVM的理解 MVVM拆开来即为Model-View-ViewModel,有View,ViewModel...
    99+
    2024-04-02
  • 详细聊聊JS中不一样的深拷贝
    前言 对于深拷贝这个概念在面试中时常被提起,面试官可能让你实现深拷贝需要考虑那些因素,或者直接让你手写封装一个深拷贝,那么今天就和大家探讨一下一个让面试官感到牛的深拷贝, 1.思考 ...
    99+
    2022-11-13
    js深拷贝实现方式 js 对象深拷贝 js深拷贝的应用场景
  • 聊聊Ubuntu上安装GitHub的详细过程
    GitHub是全球最大的开源社区,许多开发者都使用GitHub管理和分享自己的代码。在Ubuntu系统中安装GitHub,可以让你更加方便地使用GitHub,参与到开源社区中来。本文将介绍在Ubuntu上安装GitHub的详细过程。安装Gi...
    99+
    2023-10-22
  • 详细聊聊Vue中的options选项
    目录Vue中的options选项options的五类属性入门属性使用vue文件添加组件computed(计算属性)用途缓存示例:watch(监听)用途何为变化deep: true是干...
    99+
    2024-04-02
  • 详细聊聊关于sql注入的一些零散知识点
    目录零、本文涉及知识点一、sqlmap写一句马的过程(-- os-shell)1.1 简述过程1.2 一个小问题二、堆叠注入:2.1 什么是堆叠注入2.2 如何判断存在堆叠注入?2....
    99+
    2024-04-02
  • 一文详细聊聊vue3的defineProps、defineEmits和defineExpose
    目录definePropsdefineEmitsdefineExpose总结 最近在开发中用到了vue3的defineProps、defineEmits和defineExp...
    99+
    2023-02-08
    vue3 defineProps vue3 defineEmits vue3 defineExpose
  • 详细聊聊MySQL中的LIMIT语句
    目录问题 server层和存储引擎层 那LIMIT是什么鬼? 怎么办? 吐个槽 最近有多个小伙伴在答疑群里问了小孩子关于LIMIT的一个问题,下边我来大致描述一下这个问题。 问题 ...
    99+
    2024-04-02
  • 详细聊聊Mybatis中万能的Map
    目录万能的Mapdemomap 实现add usermap 实现通过id查询多个参数可以使用Map进行传参总结万能的Map 假设,我们的实体类,或者数据库中的表,字段或者参数过多,我...
    99+
    2024-04-02
  • 详细聊聊golang中函数的用法
    随着计算机技术的不断发展,编程语言也在不断更新换代,其中Golang是近年来非常热门的一种编程语言,它的高效、安全、易用受到了很多开发者的喜爱。在Golang中,函数是一种非常重要的编程元素,本文将详细介绍Golang函数的用法。一、函数的...
    99+
    2023-05-14
  • 一起聊聊Node中的事件循环
    事件循环是 Node.js 的基本组成部分,通过确保主线程不被阻塞来实现异步编程,了解事件循环对构建高效应用程序至关重要。下面本篇文章就来带大家深入了解Node中的事件循环 ,希望对大家有所帮助!你已经使用 Node.js 一段时间了,构建...
    99+
    2023-05-14
    Node.js 前端 JavaScript
  • 详细聊聊前端Vue.js开发中的坑
    Vue.js是一个非常流行的JavaScript框架,能够帮助开发者快速构建高性能和可维护的Web应用程序。Vue.js框架在使用过程中,有时候会遇到一些“坑”,所谓“坑”,就是一些代码或设计上的难点或者问题。下面我将详细介绍一下前端Vue...
    99+
    2023-05-14
  • 详细聊聊TypeScript中unknown与any的区别
    目录前言1. unknown vs any2. unknown 和 any 的心智模式3.总结总结前言 我们知道 any 类型的变量可以被赋给任何值。 let myVar: a...
    99+
    2024-04-02
  • 详细聊聊vue中组件的props属性
    目录问题一:那props具体是怎么使用呢?原理又是什么呢?往下看问题二:那如果我们想给年龄加1岁,怎么实现?问题三:对于年龄这一类型,我们最希望拿到的是什么数据类型?问题四:可以限制...
    99+
    2024-04-02
  • 详细聊聊Vue中的MVVM模式原理
    目录1. MVVM模式2. Vue响应式3. Vue监听对象3.1 监听普通对象3.2 监听复杂对象(深度监听)4. Vue监听数组5. 使用 Object.defineProper...
    99+
    2023-03-03
    vue.js mvvm vue.js教程 vue mvvm模式
  • 详细聊聊MySQL中慢SQL优化的方向
    目录前言SQL语句优化记录慢查询SQL如何修改配置查看慢查询日志查看SQL执行计划如何使用SQL编写优化为何要对慢SQL进行治理总结前言 影响一个系统的运行速度的原因有很多,是多方面...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作