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;}@Overridepublic 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
,我认为讲的很详细,点击进去就可以了
在这里插入图片描述
觉得我写的博客对你有用,给我点个赞,嘻嘻
在这里插入图片描述

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

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

相关文章

力扣 713.乘积小于k的子数组

文章目录 题目介绍解法 题目介绍 解法 和209.长度最小的子数组思路大致相同。 思路:如果从l到r这一段的乘积是小于k的,那么[l,r]、[l1,r]….[r,r]这些子数组都是满足乘积小于k的,一共有r-l1个。 class Solution {public int minSubArrayLen…

Node.js backend for OpenAI image generation giving error code 400

题意:用于 OpenAI 图像生成的 Node.js 后端返回错误代码 400。 问题背景: I am trying to build a backend for the first time using Node.js. This is what I need: Generate image based on prompt -> Get the image and upload it to supabase s…

浅析OceanBase数据库的向量化执行引擎

本篇博客是偏数据库系统概念性的内容,不会深入到 OceanBase 中各个算子和表达式的在向量化中的详细设计和实现。 背景 为了提升OceanBase社区版用户解决问题的效率,OceanBase官方不久前推出了《OceanBase 从入门到实践》系列课程。在第七期直播课程后&a…

基于MATLAB的安全帽检测系统

课题名称 课题介绍 众所周知,在一些施工工地,必须明确佩戴安全帽。可以对生命安全起到保障作用。该课题为常见的安全帽的识别,主要分为红色,蓝色,黄色三类安全帽。而安全帽的主要是红色,蓝色&…

项目文件配置

1. 参数配置化 1.1 问题分析 1.2 问题解决 Value 注解通常用于外部配置的属性注入,具体用法为:Value("${配置文件中的key}") 2. yml配置文件 2.1 SpringBoot提供了多种属性配置方式 2.2 常见配置文件格式对比 2.3 yml 基本语法 大小写敏…

相位型SLM硬件产品面型性能提升

背景介绍 作为一种动态可编程光学元件,液晶空间光调制器(LC-SLM)在波前整形和光束控制等精密光学调控应用中发挥着非常重要的作用。典型的纯相位SLM工作原理是通过加载的电压控制在每个液晶像素处诱导相位延迟,实现对入射光波波前…

滚珠花键与滚珠丝杆的区别与应用

在机械工业中,经常使用滚珠花键这种传动元件,人们经常拿它与滚珠丝杆相比较,甚至与之混淆。事实上,它们是不同的,滚珠花键和滚珠丝杆在机械传动领域中各有其独特的作用和特点。那么,两者之间的区别是什么呢…

渐变色代码主题你受得了吗

分享一个vscode编辑器的渐变色主题 效果图如下 vscode扩展搜索 gradient theme安装即可。

LinuxC高级作业2

1.整理思维导图 2.做一套笔试题 一: 1.cd .. mkdir dir1 cd dir1 touch file1 2.cp ~/mnt/dir1/ -r * ~/home/dir2/ 3.pwd 4.ls -l 5.ifconfig 6.top 10.find /usr -type f -name "*name*" 11.:wq 13.df -h 14.tar -xzvf tmp.tar.gz 15.sudo c…

Windows安装启动:stable-diffusion-webui,AIGC大模型文生图、文生视频,Python

Windows安装启动:stable-diffusion-webui,AIGC大模型文生图、文生视频,Python stable-diffusion-webui是github上的AIGC开源项目,地址: https://github.com/AUTOMATIC1111/stable-diffusion-webuihttps://github.com/AUTOMATIC1…

ThreadLocal的用法

概述 ThreadLocal提供了线程局部变量,用于在线程中保存数据,在ThreadLocal中保存的数据仅属于当前线程,所以ThreadLocal实例的get或set方法访问自己的独立副本,这些副本之间相互隔离,互不影响 ThreadLocal利用Thread中…

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

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

828华为云征文|基于华为云Flexus X实例快速搭建Halo博客平台

目录 前言 一、Flexus云服务器X介绍 1.1 Flexus云服务器X实例简介 1.2 Flexus云服务器X实例特点 1.3 Flexus云服务器X实例场景需求 二、Flexus云服务器X购买 2.1 Flexus X实例购买 2.2 购买MySQL加速镜像 2.3 重置密码 2.4 登录服务器 三、Flexus X实例安装Docker 3.1 系统版本…

天宝Trimble RealWorks2024.0.2注册机 点云后处理软件 点云三维重建软件

一、功能特色 1、强大的点云数据处理平台 Trimble Realworks2024是市面上先进的点云数据处理软件,能够配准、可视化、浏览和直接处理市面上几乎所有主流品牌扫描仪点云数据,包括Leica、Riegl、ZF、Faro、Topcon等。 2、业界领先的无目标全自动配准 T…

前端大数据渲染:虚拟列表、触底加载与分堆渲染方案

前言 针对表格展示数据,用户提出要求前端在表格下面有一展示多少条数据的选项,如果要求一次性展示10000条数据,如果直接染会造成页面的卡顿,渲染速度下降,内容展示慢,如果有操作,操作会卡顿 下面总结常见…

【C++】STL----list常见用法

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:C从小白到高手 🌹往期回顾🌹:[C]vector常见用法 🔖 流水不争,争的是滔滔不息。 文章目录 一、list的介绍li…

【软件基础知识】什么是 API,详细解读

想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。 API,全称Application Programming Interface(应用程序编程接口),是现代软件世…

数字签名和CA数字证书的核心原理

看了蛋老师的视频就很容易理解了,首先对服务器的公钥和信息进行哈希运算得到一个短字符串,然后用CA机构中的私钥对这一短字符串进行加密就得到了一个数字签名,然后就这个数字签名放到数字证书中,同时服务器的公钥也放在数字证书中…

Unity之FPS

目录 🎮MouseLook摄像机旋转脚本 🎮PickUpItem武器拾取脚本 🎮PlayerController玩家控制器 🎮Inventory武器库 🎮Weapon武器抽象类 🎮Weapon_AutomaticGun武器脚本 其实这个教程很早就收藏了就是被20…

9.20哈好

函数体 #include"SeqList.h"void SeqList::init(int n) {this->ptrnew data[n];this->len0;this->sizen; }bool SeqList::empty() {return this->len0; }bool SeqList::full() {return this->sizethis->len; }void SeqList::push_back(data e) {i…