【Java基础篇 | 面向对象】—— 封装详解

news2024/12/23 9:39:25

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

目录

  • 一、封装
    • 1.1什么是封装
    • 1.2访问修饰符
  • 二、封装拓展之包
    • 2.1包的概念
    • 2.2导入包中的类
    • 2.3自定义包
  • 三、static成员
    • 3.1static修饰成员变量
    • 3.2静态成员方法的访问
    • 3.3static成员变量的初始化
  • 四、代码块

一、封装

1.1什么是封装

封装概念将数据和对数据的操作封装在一个类中,对外部的访问只通过类提供的接口进行。

封装目的隐藏类的内部实现细节,只公开必要的方法来操作数据,避免数据被外部直接访问和修改,从而提高代码的安全性和可维护性。

那java是如何控制对数据的访问权限呢,答案是访问修饰符。通过访问修饰符,可以控制对数据的访问权限,以确保代码的安全性和封装性。

1.2访问修饰符

java中主要有以下四种访问修饰符:
加粗样式在这里插入图片描述

  • public:公共访问修饰符,可以被任何其他类或代码访问。
  • protected:受保护的访问修饰符,可以被同一包内的类、子类以及其他包中的子类访问。
  • default(默认):没有显式指定访问修饰符时,默认的访问修饰符,可以被同一包中的类访问。
  • private:私有访问修饰符,只能被所属类的内部访问。

二、封装拓展之包

2.1包的概念

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

2.2导入包中的类

在Java中,你可以使用import关键字来导入其他包中的类。导入包中的类可以让你在当前文件中直接使用这些类而无需使用完整的包名来引用它们。

比如,我们想要导入java.util包中的Date类。即import java.util.Date

public class Test3 {
    public static void main(String[] args) {
        java.util.Date date = new java.util.Date();
        // 得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}

这里如果需要使用 java.util 中的其他类,,可以使用 import java.util.*

需要注意的是:import java.util.*中的*代表导入‘java.util’包下的所有类,从而使所有类都可以在代码中直接使用。同时这里并不是一次性把java.util包下的所有类都导入进来,而是用到哪个类才导入哪个类(即用到谁导入谁)。

并不是只有 java.util包才有Date类,java.sql包中也是有Date类的。


2.3自定义包

在Java中,我们可以创建自己的包来组织和管理你的类文件。

创建和使用自定义包的一般步骤如下:

1.创建包目录结构:在我们的项目或源代码目录下,创建一个与我们的包名相对应的目录结构。例如,如果我们的包名是com.example.mypackage,那么你应该创建一个目录结构为com/example/mypackage的文件夹

2.编写类文件:在包目录结构下,创建你的类文件。例如,在com/example/mypackage目录下,你可以创建一个名为MyClass.java的文件,并在其中定义你的类。

3.声明包名:在你的类文件的开头,使用package关键字来声明你的包名。例如,在MyClass.java中,你可以添加如下的包声明:package com.example.mypackage;

4.导入和使用包中的类:如果你在另一个Java文件中想要使用你的包中的类,可以使用import语句导入该类。例如,如果你想在Main.java中使用MyClass类:

import com.example.mypackage.MyClass;

public class Main {
    public static void main(String[] args) {
        MyClass myObject = new MyClass();
        // 使用myObject进行操作
    }
}

三、static成员

在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对
象,是所有对象所共享的。

举个例子,我们以学生类进行举例,现在有10个学生,这10个学生中都是在同一个班级,所以我们此时就不需要再学生类中写一个成员变量来保存学生所处的班级,我们可以把班级理解为这些学生的共同属性,即所有学生所共享的一个属性。所以我们当然不需要在每个学生类对象中都要存储一份这样的属性,因为这个班级属性是每个学生所共享的。

3.1static修饰成员变量

static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。

静态成员变量的特性如下:

  • 静态成员变量不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。
  • 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  • 类变量存储在方法区当中
  • 静态成员变量的生命周期随类的加载而创建,随类的卸载而销毁

如果要为成员变量进行赋值的话,我们如下图可以直接为静态成员变量进行赋值即可。
在这里插入图片描述

3.2静态成员方法的访问

静态成员方法的访问是通过类名来进行访问的。
在这里插入图片描述

下面是静态成员方法的特性:

  • 静态成员方法不属于某个具体的对象,是类方法
  • 静态成员方法通过类名去进行访问,当然如果通过对象去访问也是可以的,只不过更推荐通过类名去进行访问
  • 不能直接访问静态方法中的任何非静态成员变量和非静态成员方法

综上,静态的无论是静态成员变量还是静态成员函数都是不依赖于对象的,它们都是可以通过类名去进行访问的。

3.3static成员变量的初始化

静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化和静态代码块初始化

就地初始化:在定义时直接给出初始值。
请看举例:
在这里插入图片描述

代码块初始化:

四、代码块

使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
实例代码块、静态代码块、局部代码块、同步代码块

下面来看下述代码:

public class MyStudent {
    public String name;
    public int age;
    public int ID;
    public static String classes = "classone";

    {
        System.out.println("实例代码块");
    }

    static {
        System.out.println("静态代码块");
    }

    public MyStudent(){
        this("李华",18,123456);
        System.out.println("不带参数的构造函数");
    }

    public MyStudent(String name,int age,int ID){
        System.out.println("带参数的构造函数");
        this.name = "Daming";
        this.age = 21;
        this.ID = 123456;
    }

    public static void main(String[] args) {
        MyStudent s1 = new MyStudent();
    }
}

在这里插入图片描述

看下图代码的执行结果:
在这里插入图片描述
由此可以看出static修饰的成员变量在对象创建之前就已经创建完成了,所以static修饰的成员变量和成员方法加载的速度比较快。

实例代码块、静态代码块、局部代码块、同步代码块的执行顺序如下:

1.静态代码块:静态代码块首先在类加载时执行,只会执行一次,并在类加载后执行。用于初始化类的静态成员变量或执行其他静态初始化操作

2.实例代码块:实例代码块在每次创建对象时都会被执行。它在构造方法之前执行,并且不管调用哪个构造方法,都会执行实例初始化块。

3.构造方法(Constructor):构造方法用于创建对象并对实例变量进行初始化。构造方法的执行顺序由具体调用的构造方法决定。

4.局部代码块:局部代码块是在方法或条件语句内部定义的代码块。它在程序运行到该代码块时被执行。

5.同步代码块(Synchronized Block):同步代码块使用关键字包裹一段代码,用于实现线程同步。当线程进入同步代码块时,需要获取锁,其它线程需要等待锁释放才能执行。

注意事项如下:
1.静态代码块不管生成多少个对象,其只会执行一次
2.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
4.实例代码块只有在创建对象时才会执行

总之静态代码块只在类加载时执行一次,而实例代码块(在构造方法之前执行)在每次创建对象时都会执行。局部代码块和同步代码块在程序运行到相应的位置时才会执行。构造方法在创建对象时被调用,并且可以根据具体的构造方法决定执行顺序。

以上就是本文的全部内容。

好了,友友们,本文到这里就结束了,再见啦!!!

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

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

相关文章

无涯教程-JavaScript - IMCONJUGATE函数

描述 IMCONJUGATE函数以x yi或x yj文本格式返回复数的复共轭。 语法 IMCONJUGATE (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the conjugate.Required Notes 使用COMPLEX将实系数和虚系数转换为复数。 复数的共轭是- $$…

数字自我主权的起点,DID 如何为下一代网络居民提供身份入口?

随着 Web3 浪潮逐渐影响社交、文化、娱乐行业,现存的数字身份模式已无法满足未来的网络世界,DID(去中心化身份)以超越 Web2 身份验证体系的高度去中心化、开放自由度等属性引来了行业人士的关注与讨论。然而,在 DID 领…

成都睿趣科技:抖音开店初期要注意什么

随着社交媒体和短视频平台的崛起,抖音已经成为了一个风靡全球的短视频应用,拥有着庞大的用户群体。因此,越来越多的创业者开始在抖音上开设自己的线上店铺,希望借助这个平台赚取丰厚的利润。然而,在抖音开店初期&#…

ARMv8 TTBRx寄存器

ARMv8 TTBRx寄存器 1 TTBR0_ELx and TTBR1_ELx2 TTBR0_ELx2.1 TTBR0_EL12.2 TTBR0_EL22.3 TTBR0_EL33 TTBR13.1 TTBR1_EL13.2 TTBR1_EL2 4 访问TTBRx寄存器4.1 TTBR0_ELx4.2 TTBR1_ELx 5 TTBRx保留的是物理地址还是虚拟地址5.1 保存的是物理地址还是虚拟地址5.2 为什么是物理地…

Redisson分布式锁实战

实战来源 此问题基于电商 这周遇见这么一个问题,简略的说一下 由MQ发布了两个消息,一个是订单新增,一个是订单状态变更 由于直接付款之后,这两个消息的发布时间不分先后,可能会造成两种情况,1、订单状态变更…

N5235B是德科技网络分析仪50GHz

181/2461/8938对无源元器件和简单的有源器件执行基本分析 适用于对成本非常敏感的应用,可以在高达 50 GHz 的频率范围内精确测量 S 参数 具有出色的性价比,可用于微波器件制造测试 可以配置经济型解决方案,用于信号完整性测量和材料表征 …

【python自动化】七月PytestAutoApi开源框架学习笔记(一)

前言 本篇内容为学习七月大佬开源框架PytestAutoApi记录的相关知识点,供大家学习探讨 项目地址:https://gitee.com/yu_xiao_qi/pytest-auto-api2 阅读本文前,请先对该框架有一个整体学习,请认真阅读作者的README.md文件。 本文…

ChatGPT AIGC 完成Excel条件求和函数

有一个明细表如下: 现在要根据日期来对销量进行求和。数据量大约200多条。 要写出Excel函数公式可以交给ChatGPT来操作。 公式直接就生成好了, 公众号:BI智能数据分析 =SUMIF($D$2:$D$100,G2,$E$2:$E$100) 然后我们将公式复制到表格中来进行验证。 因为ChatGPT在生成公式…

mac版微信小程序反编译学习

更新时间:2023年07月20日16:57:52 mac版本的微信小程序是没有做加密的,可以直接反编译 反编译的工具是适用于mac和Windows的,其实Windows还有其他更好用的工具。 本文是针对mac下使用微信的小程序进行解密,版本为3.8.1。 小程…

降低银行客户获取成本 (CAC) 的 3 种方法

银行的运营环境以及客户与银行服务互动的方式经历了深刻而彻底的变化。因此,银行业用于获取客户的方法必须经历平行演变。 传统上,客户根据利率和提供的服务范围来决定银行。然而,今天的客户期望更多。他们不仅需要有竞争力的价格和多样化的…

燃料电池FCU开发技术方案

燃料电池FCU电控开发介绍 FCU作为新能源汽车核心部件,对于氢燃料电池,追求的指标有:能量密度、额定功率、最大峰值功率(保持有限时间)、最小稳定功率(小于该功率,功率输出波动大,长…

九号滑板车F2 Pro采用全新折叠设计,为用户带来便捷使用体验

拥挤的城市中,滑板车可以作为一种快速、便捷的交通工具,帮助你避开交通堵塞。而且滑板车轻便,容易携带,你可以将它放在车上、公共汽车上、火车上,甚至在办公室或学校里使用。今天就带大家了解一款适合城市通勤骑行的车…

Docker从认识到实践再到底层原理(四-2)|Docker镜像仓库实战案例

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

Competitive Collaboration 论文阅读

论文信息 题目:Competitive Collaboration: Joint Unsupervised Learning of Depth, Camera Motion, Optical Flow and Motion Segmentation 作者:Anurag Ranjan, Varun Jampani, Lukas Balles 来源:CVPR 时间&#x…

考研资料共享系统的设计说明

考研资料共享系统的设计说明 设计意义及目的模块划分技术难点写项目中遇到的问题该项目的后端模块介绍该项目的前端模块介绍运行演示Gitee链接 设计意义及目的 为了方便找资料,了解考研形式;另一方面是锻炼编写系统的能力 模块划分 主要划分为&#xff1…

Oracle VM VirtualBox 安装 Ubuntu Linux

Virtual Box VirtualBox是一个强大的、面向个人用户或者企业用户的虚拟机产品,其支持x86以及AMD64/Intel64的计算架构,功能特性丰富、性能强劲,支持GPL开源协议,其官方网址是www.virtualbox.org,由Oracle开源&#xf…

冠达管理:哪些股票属于大权重?

跟着我国资本商场的开展,股票出资已经成为众多出资者出资的重要选择。在股票商场中,不同的股票权重不一,那么什么是大权重股票?哪些股票归于大权重呢?本文将从多个角度分析,带您了解大权重股票。 一、什么是大权重股…

华为云云耀云服务器L实例评测|部署spring项目端口开放问题的解决 服务器项目环境搭建MySQL,Redis,Minio...指南

目录 引出书接上回,部署spring项目,端口访问失败最后排查结果反馈 尝试的几种解决方案【未成功】1.指定tomcat启动ipv4端口2.添加开放端口规则保存规则防火墙相关命令记录 最终成功解决【成功!】用firewall成功了问题来了,如果这里…

HTTP代理只能代理HTTP协议吗?

HTTP代理是一种代理服务器,它可以充当客户端和服务器之间的中介,以帮助客户端访问服务器上的资源。但是,HTTP代理并不仅仅只能代理HTTP协议。 HTTP代理可以代理的协议 除了HTTP协议之外,HTTP代理还可以代理其他协议,例…

服务器数据恢复-EMC存储磁盘损坏的RAID5数据恢复案例

服务器数据恢复环境: 北京某单位有一台EMC某型号存储,有一组由10块STAT硬盘组建的RAID5阵列,另外2块磁盘作为热备盘使用。RAID5阵列上层只划分了一个LUN,分配给SUN小机使用,上层文件系统为ZFS。 服务器故障&#xff1…