Java之封装

文章目录

  • 1.封装
    • 1.1 什么是封装
    • 1.2 访问限定符
    • 1.3 包
      • 1.3.1 什么是包
      • 1.3.2 导包
      • 1.3.3 自定义包
  • 2. static
    • 2.1 static 修饰成员变量
    • 2.2 static 修饰成员方法
    • 2.3 static成员变量初始化
  • 3. 代码快
    • 3.1 普通代码块
    • 3.2 实例代码块
    • 3.3 静态代码块
  • 4. 对象的打印

1.封装

1.1 什么是封装

在Java中,面向对象程序三大特性:封装、继承、多态,而封装就是将对象的状态(数据)和行为(方法)打包在一起,并隐藏对象的内部实现细节,只提供公开的接口(getter和setter方法)来与对象进行交互。

1.2 访问限定符

在Java中,主要通过类和访问权限来实现封装,访问限定符用于控制类、变量、方法或其他引用对象的访问级别。Java支持四种访问限定符
在这里插入图片描述

  1. private:私有访问级别。只对定义它的类可见。
  2. default:默认访问级别,同一个包中的类可见。当类没有定义访问限定符时,此时默认访问级别为default。
  3. protected:保护访问级别。对于同一包中的类及其子类是可见的。(介于public和private之间)
  4. public:公共访问级别。对于同一包中的所有类都是可见的。

一般情况下,我们建议:

  1. 成员变量定义为private
  2. 成员方法定义为public

建议不唯一,根据具体场景来使用。

在这里插入图片描述

1.3 包

1.3.1 什么是包

包其实就是一个文件夹,为了更好的管理,我们将类划分,把多个类收集成一组,就是一个包。

例如:我们将D盘中的文件划分,将Java语言相关的文件放到Java包中,将C语言相关的文件放到C语言包中,将下载的软件放到app这个包中……

在Java中,包是一种用来组织和管理类和接口的机制。它为开发者提供了一种逻辑分组的方式,使得代码更加模块化、结构化和易于管理。

1.3.2 导包

Java中提供了许多现成的类供我们使用,例如Date类,可以使用 java.util.Date 导入 java.util 这个包中的 Date
类。

例如:
在这里插入图片描述
在IDEA中会自动导入包,如果使用其他环境,可以去设置。

当我们需要用到 java.util 中的其他类时,可以使用 java.util.*
在这里插入图片描述

1.3.3 自定义包

  1. 包名和代码路径匹配,例如创建一个 com.bit.demo1 的包,那么它对应的路径就是 com/bit/demo1
  2. 包名尽量指定成唯一的名字(公司通常会将公司的域名的颠倒的形式来命名包)
  3. 当我们创建一个Java文件时,最上面的package语句就是,改java文件放到了哪个包中
  4. 如果一个类没有package语句,该类被放到默认包中。

例如,我们创建一个名为 com.bit.demo1 的包

自定义包的步骤:

  1. 右键src -> new -> package
    在这里插入图片描述

  2. 输入包名
    在这里插入图片描述
    在这里插入图片描述

  3. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了
    在这里插入图片描述

  4. 新建一个java类,我们可以看到顶部出现package语句
    在这里插入图片描述

  5. 如果出现 2 步骤所示的图片,可以更改设置
    在这里插入图片描述
    包教会的
    在这里插入图片描述

2. static

2.1 static 修饰成员变量

static修饰的成员变量,称为静态成员变量
静态成员变量,不属于某个具体的对象,而是所有对象共享的

静态成员变量的特征

  1. 又称为静态属性,不属于某个具体的对象,是类的属性,所有对象共享的
  2. 静态成员变量即可以通过类名直接访问,又可以通过对象访问,但是推荐使用类名来访问,因为这样可以更清楚地表明它是属于类而不是某个对象的。
  3. 存储在方法区。
  4. 生命周期随着类的加载而创建,随着类的卸载而销毁
public class Student {
    public int id;
    public String name;
    public int age;
    public String sex;
    public static String classRoom = "计科一班";

    public Student() {
    }

    public Student(int id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}

public class Test1 {
    public static void main(String[] args) {
        //可以直接通用类名访问
        System.out.println(Student.classRoom);

        //也可以通过对象访问,但是不建议,这种方法合法不合理
        Student student = new Student(1,"zhangsan",12,"男");
        System.out.println(student.classRoom);
    }
}

在Student类中,成员变量 classRoom 被 static 修饰 ,此时,这个成员变量就不属于这个对象了,所以用类名访问 classRoom

2.2 static 修饰成员方法

在封装中,一般情况下类的成员变量都设置为 private ,而成员方法设置为 public ,当成员变量 classRoom 被设置为 private 后,我们在其他类应该如何访问呢?

在Java中,被 static 修饰的成员方法被称为静态成员方法,是类的方法,而不是某个对象特有的

静态成员变量一般通过静态成员方法来访问

public class Student {
    private static String classRoom = "计科一班";

    public static String getClassRoom(){
        return classRoom;
    }
}


import com.bit.demo1.Student;

public class StudentTest {
    public static void main(String[] args) {
        System.out.println(Student.getClassRoom());
    }
}

与静态成员变量一样,通过类名调用,不推荐使用对象调用。

注意

  1. 静态方法不需要对象调用,所以不能传递 this
  2. 静态方法中不能调用任何非静态成员变量
public class Student {
    private int age;
    private static String classRoom = "计科一班";

    public static String getClassRoom(){
        age = age + 1;
        return classRoom;
    }
}

public class StudentTest {
    public static void main(String[] args) {
        System.out.println(Student.getClassRoom());
    }
}

运行结果:
在这里插入图片描述

  1. 静态方法中不能调用任何非静态方法(因为非静态方法中有 this 参数)
public class Student {
    private int age;
    private static String classRoom = "计科一班";

    public int getAge(){
        return age;
    }

    public static String getClassRoom(){
        age = age + 1;
        return classRoom;
    }
}


public class StudentTest {
    public static void main(String[] args) {
        System.out.println(Student.getAge());
    }
}

运行结果:
在这里插入图片描述

  1. 可以在非静态成员方法中调用静态方法

2.3 static成员变量初始化

静态成员变量一般不会在构造方法中初始化。

静态成员变量的初始化分为两种,分别为:就地初始化静态代码块初始化

  1. 就地初始化:在定义该静态成员变量时就进行初始化。
  2. 静态代码块初始化:等下面理解什么是代码块再进行讲解

好多东西啊,真是烦躁,感觉有人在念紧箍咒
在这里插入图片描述

3. 代码快

3.1 普通代码块

普通代码块,即定义在方法中的代码块。

public class Test1 {
    public static void main(String[] args) {
        {
            int a = 1;
            System.out.println("a = " + a);
        }
        int b = 2;
        System.out.println("b = " + b);
    }
}

//运行结果
a = 1
b = 2

这种用法不常见

你小子,肯定又不记了
在这里插入图片描述

3.2 实例代码块

实例代码块又叫构造代码快,一般用在初始化实例成员变量。
例如:

public class Student {
    private String name;
    private int age;
    private String sex;
    public static String classRoom = "计科一班";
	
	public Student(){
        System.out.println("不带参数的构造方法");
    }
    
    {
        System.out.println("实例代码块");
        this.name = "zhangsan";
    }

    public void show() {
        System.out.println("name = " + name + " age = " + age + " sex = " + sex + " claasRoom = " + classRoom);
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student = new Student();
        student.show();
    }
}

//运行结果
实例代码块
不带参数的构造方法
name = zhangsan age = 0 sex = null claasRoom = 计科一班

根据执行结果我们可以知道,实例代码块的执行顺序优先于构造方法。

3.3 静态代码块

静态代码快,即被static定义的代码块,一般用于初始化静态成员变量

例如:我们将上述代码改动一下

public class Student {
    private String name;
    private int age;
    private String sex;
    public static String classRoom;

    public Student(){
        System.out.println("不带参数的构造方法");
    }

    {
        System.out.println("实例代码块");
        this.name = "zhangsan";
    }

    static{
        System.out.println("静态代码块");
        classRoom = "计科一班";
    }

    public void show() {
        System.out.println("name = " + name + " age = " + age + " sex = " + sex + " claasRoom = " + classRoom);
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student1 = new Student();
        System.out.println("===========");
        Student student2 = new Student();
    }
}

//执行结果
静态代码块
实例代码块
不带参数的构造方法
===========
实例代码块
不带参数的构造方法

根据执行结果我们得到结论,静态代码块优先被执行,其次是实例代码块,最后是不带参数的构造方法。
上述代码中我们new了两个Student对象,但是执行结果中只出现了一次静态代码快,所以静态代码块只执行一次

注意

  1. 静态代码块只执行一次
  2. 如果一个类中定义了多个静态代码快,在编译时,编译器会按照定义的先后顺序来执行
  3. 静态成员变量是类的属性,所以是在JVM加载类的时候开辟空间并初始化的
  4. 实例代码块只有在创建对象的时候才会执行,构造方法也是。

这个一定要记住
在这里插入图片描述

4. 对象的打印

public class Student {
    private String name;
    private int age;
    private String sex;
    public static String classRoom;

    public Student() {
    }

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

}

public class Test1 {
    public static void main(String[] args) {
        Student student1 = new Student("zhangsan",12,"男");
        System.out.println(student1);
    }
}

当我们直接打印对象时,执行结果为
在这里插入图片描述
这个结果的结构为:类所在的包名.类名 + @ + 哈希码值

并不是我们想要实现的打印,如果想要实现打印,我们可以直接调用java自带的 toString 方法(快捷键Alt + Insert ,点击toString 即可),也可以重写toString 方法

public class Student {
    private String name;
    private int age;
    private String sex;
    public static String classRoom = "计科一班";

    public Student() {
    }

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString(){
        return "[" + name + "," + age + "," + sex + "," + classRoom + "]";
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student1 = new Student("zhangsan",12,"男");
        System.out.println(student1);
    }
}

//执行结果
[zhangsan,12,,计科一班]

如果想要了解这个部分的详细内容,我发现了一个博主的博客link
,我认为讲的很详细,点击进去就可以了
在这里插入图片描述
觉得我写的博客对你有用,给我点个赞,嘻嘻
在这里插入图片描述

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

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

相关文章

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

monorepo基础搭建教程(从0到1 pnpm+monorepo+vue)

monorepo 前言1、搭建空项目并配置pnpm-workspace.yamlpnpm initpnpm-workspace.yaml 2.配置packages测试文件配置相关内容 3.引入packages内容至公共package.json4.创建测试项目,并引入公共包结语 前言 有个项目要引入一个第三方库,但是第三方库下载下…

LabVIEW提高开发效率技巧----使用快捷键

在LabVIEW的开发过程中,熟练掌握和运用快捷键可以极大地提升工作效率,减少重复性操作所花费的时间。快捷键不仅可以加快编程速度,还能让开发者更加专注于逻辑实现和功能设计。细问问将详细介绍LabVIEW中的常用快捷键,特别是强大的…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…

YOLOv8改进系列,YOLOv8替换主干网络为PP-HGNetV2(百度飞桨视觉团队自研,助力涨点)

摘要 PP-HGNetV2(High Performance GPU Network V2) 是百度飞桨视觉团队自研的 PP-HGNet 的下一代版本,其在 PP-HGNet 的基础上,做了进一步优化和改进,最终在 NVIDIA GPU 设备上,将 “Accuracy-Latency Balance” 做到了极致,精度大幅超过了其他同样推理速度的模型。其在…

vue part 11

vuex的模块化与namespace 115_尚硅谷Vue技术_vuex模块化namespace_1_哔哩哔哩_bilibili 116_尚硅谷Vue技术_vuex模块化namespace_2_哔哩哔哩_bilibili vue-router路由 很常见的很重要的应用:Ajax请求,将响应的数据替换掉原先的代码从而实现不跳转页面…

对称加密算法使用示例

Demo包括以下对称加密算法组合 备注:XTS仅支持AES128和AES256,不支持AES192 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import cmac from cryptography.hazmat.primitives.…

使用Big Data Tools连接JetBrains IDE与OSS

您可以在JetBrains IDE中通过Big Data Tools插件直接管理OSS的Bucket和文件。 什么是Big Data Tools Big Data Tools是一款JetBrains IDE插件,可以提供以下扩展功能: 便于使用远程文件系统(包括OSS)的用户界面。 与文件管理器类…

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)

文章目录 前言一、ArkTS基本介绍1、 ArkTS组成2、组件参数和属性2.1、区分参数和属性的含义2.2、父子组件嵌套 二、装饰器语法1.State2.Prop3.Link4.Watch5.Provide和Consume6.Observed和ObjectLink代码示例:示例1:(不使用Observed和ObjectLi…

Flutter启动无法运行热重载

当出现这种报错时,大概率是flutter的NO_Proxy出问题。 请忽略上面的Android报错因为我做的是windows开发这个也就不管了哈,解决下面也有解决报错的命令大家执行一下就行。 着重说一下Proxy的问题, 我们看到提示NO_PROXY 没有设置。 这个时候我…

【计算机网络 - 基础问题】每日 3 题(十三)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

android10 系统定制:增加应用使用数据埋点,应用使用时长统计

需求意在统计应用的使用时长和开始结束时间,最终生成一个文件可以直观看出什么时候进入了哪个应用、什么时候退出,如图: 每行记录了应用的进入或退出,以逗号分割。分别记录了事件开始时间,应用包名,进入或…

STM32常用数据采集滤波算法

例如,STM32进行滤波处理时,主要目的是处理数据采集过程中可能产生的噪声和尖刺信号。这些噪声可能来自电源干扰、传感器自身的不稳定性或其他外部因素。 1.一阶互补滤波 方法:取a0~1,本次滤波结果(1-a)本次采样值a上…

用 nextjs 创建 Node+React Demo

1、环境准备 1、安装Node 访问Node官网下载对应Node版本:Node官网,安装成功后通过命令查看当前node版本 node -v2、安装Node版本管理工具nvm 如果nvm install 安装node失败,一般是网络问题,可以用手机热点或者翻墙 # 安装nvm c…

Python语言基础教程(上)4.0

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

【LeetCode每日一题】——401.二进制手表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 简单 三【题目编号】 401.二进制手表 四【题目描述】 二进制手表顶部…

4.提升客户服务体验:ChatGPT在客服中的应用(4/10)

本文大纲旨在指导撰写一篇全面探讨ChatGPT如何通过优化客户服务流程、提供实际应用案例和用户反馈,以提升客户服务体验的深入博客文章。 引言 在当今竞争激烈的商业环境中,客户服务已成为企业成功的关键因素。优质的客户服务不仅能够增强客户满意度和忠…

Docker 进入容器并运行命令的方法

目录 理解 Docker 容器的基本概念 使用 docker exec 进入运行中的容器 基本用法 常用选项解析 选项详解 实际案例演示 1. 进入容器的交互式 Shell 2. 在容器中运行单个命令 3. 以指定用户运行命令 4. 设置环境变量并运行命令 5. 指定工作目录 使用 docker attach 附…

数据结构-线性表顺序单项链表双向链表循环链表

1数据结构概述 数据结构是计算机组织、存储数据的方式。是思想层面的东西,和具体的计算机编程语言没有关系。可以用任何计算机编程语言去实现这些思想。 1.1 数据逻辑结构 反映数据逻辑之间的逻辑关系,这些逻辑关系和他们咱在计算机中的存储位置无关。…

原生+jquery写自动消失的提示框

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>自动消失消息提示</title> <style>/…