【JavaSe篇】——封装,static成员,代码块

目录

👩🏻‍💻封装

🚩访问限定符

🚩封装扩展之包

👉导入包中的类

👉自定义包

🕶️操作步骤

👉包的访问权限控制举例

🕶️常见的包

👩🏻‍💻static成员

🚩static修饰成员变量

🚩static修饰成员方法

🚩static成员变量初始化

1. 就地初始化

2. 静态代码块初始化

👩🏻‍💻代码块

🎈代码块概念以及分类

🚩普通代码块

❗构造代码块

❗静态代码块


👩🏻‍💻封装

面向对象程序三大特性:封装、继承、多态 。而 类和对象阶段,主要研究的就是封装特性 。何为封装呢?简单来说就是套壳屏蔽细节

对于我们买电脑,我们买电脑的时候我们只看到外壳开关屏幕外观的美丽,但是内部的硬件是被封装起来的,我们通过开关键盘网卡等等来进行用户和计算机交互。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

🚩访问限定符

Java 中主要通过类和访问权限来实现封装: 类可以将数据以及封装数据的方法结合在一起 ,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用 Java 中提供了四种访问限定符:

比如:
  • public:可以理解为一个人的外貌特征,谁都可以看得到
  • default: 对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了(什么都不写,默认是default)

  • private:只有自己知道,其他人都不知道
public class Computer {private String cpu; // cpuprivate String memory; // 内存public String screen; // 屏幕String brand; // 品牌---->default属性public Computer(String brand, String cpu, String memory, String screen) {this.brand = brand;this.cpu = cpu;this.memory = memory;this.screen = screen;}public void Boot(){System.out.println("开机~~~");}public void PowerOff(){System.out.println("关机~~~");}public void SurfInternet(){System.out.println("上网~~~");}}
class TestComputer {public static void main(String[] args) {Computer p = new Computer("HW", "i7", "8G", "13*14");System.out.println(p.brand); // default属性:只能被本包中类访问System.out.println(p.screen); // public属性: 可以任何其他类访问//System.out.println(p.cpu); // private属性:只能在Computer类中访问,不能被其他类访问}
}

解析:brand没有指明什么属性,所以默认是default属性,只能被本包中类访问,因为这个俩个类在一个文件中。public可以任何其他类访问,所以没有错误,而private只能在类中访问,不能被其他类访问,cpu是Computer类,当TestComputer类访问Computer类的时候是不被允许的。

注意:一般情况下成员变量设置为private,成员方法设置为public 


上面我们看到default是只能在本包中类访问,包的概念是什么?包其实就是一个文件夹。


🚩封装扩展之包

在面向对象体系中,提出了一个软件包的概念,即: 为了更好的管理类,把多个类收集在一起成为一组,称为软件 。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。

在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一 个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可

src里面的Package是一个封装包 里面包含了名为Test的类,而src里面直接有一个Test类,如果我们没有设定什么封装包默认在src中。


👉导入包中的类

Java 中已经提供了很多现成的类供我们使用 . 例如 Date 类:可以使用 java.util.Date 导入 java.util 这个包中的 Date类
public class Test {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
但是这种写法比较麻烦一些 , 可以 使用 import 语句导入 .
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
如果需要使用 java.util 中的其他类 , 可以使用 import java.util.*
import java.util.*;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
但是我们 更建议显式的指定要导入的类名 . 否则还是容易出现冲突的情况.

如果在这种情况下需要使用完整的类名

可以使用 import static 导入包中静态的方法和字段
import static java.lang.Math.*;
public class Test {public static void main(String[] args) {double x = 30;double y = 40;
// 静态导入的方式写起来更方便一些.
// double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));double result = sqrt(pow(x, 2) + pow(y, 2));System.out.println(result);}
}

注意事项 : import C++ #include 差别很大 . C++ 必须 #include 来引入其他文件内容 , 但是 Java 不需要 . import 只是为了写代码的时候更方便 . import 更类似于 C++ namespace using

👉自定义包

  • 在文件的最上方加上一个 package 语句指定该代码在哪个包中.
  • 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.cl.demo1 ).
  • 包名要和代码路径相匹配. 例如创建 com.cl.demo1 的包, 那么会存在一个对应的路com/cl/demo1 来存储代码.(基本上包名java.util....)
  • 如果一个类没有 package 语句, 则该类被放到一个默认包中.
🕶️操作步骤
1. IDEA 中先新建一个包 : 右键 src -> 新建 ->

2. 在弹出的对话框中输入包名 , 例如 com.cl.demo1
3. 在包中创建类 , 右键包名 -> 新建 -> , 然后输入类名即可 .
4. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了

5. 同时我们也看到了 , 在新创建的 Test.java 文件的最上方 , 就出现了一个 package 语句


👉包的访问权限控制举例

Computer 类位于 com.cl.demo1 包中, TestComputer 位置 com.cl.demo2 包中:


🕶️常见的包

  • 1. java.lang:系统常用基础类(StringObject),此包从JDK1.1后自动导入。
  • 2. java.lang.reflect:java 反射编程包;
  • 3. java.net:进行网络编程开发包。
  • 4. java.sql:进行数据库开发的支持包。
  • 5. java.util:java提供的工具程序包。(集合类等) 非常重要
  • 6. java.io:I/O编程开发包。

👩🏻‍💻static成员

使用前文中介绍的学生类实例化三个对象 s1 s2 s3 ,每个对象都有自己特有的名字、性别,年龄,学分绩点等成 员信息,这些信息就是对不同学生来进行描述的,如下所示:
public class Student{
// ...
public static void main(String[] args) {
Student s1 = new Student("Li leilei", "男", 18, 3.8);
Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
Student s3 = new Student("Jim", "男", 18, 2.6);
}
}

假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成 员变量,来保存同学上课时的教室呢?答案是不行的。
之前在 Student 类中定义的成员变量,每个对象中都会包含一份 ( 称之为实例变量 ) ,因为需要使用这些信息来描述 具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所 有的学生来共享。 在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的

🚩static修饰成员变量

static 修饰的成员变量,称为静态成员变量 ,静态成员变量最大的特性: 不属于某个具体的对象,是所有对象所共 享的 直接用类名.访问。
【静态成员变量特性】
  • 1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  • 2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  • 3. 类变量存储在方法区当中,对象存在堆区
  • 4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

监视窗口中可以看到,静态成员变量并没有存储到某个具体的对象中。

🚩static修饰成员方法

一般类中的数据成员都设置为 private ,而成员方法设置为 public ,那设置之后, Student 类中 classRoom 属性如何 在类外访问呢?
Java 中, 被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的 静态成员一般是通过 静态方法来访问的。(一个类里声明一个静态成员方法,然后再另一个类接收这个静态成员方法的返回值)


静态方法特性
  • 1. 不属于某个具体的对象,是类方法
  • 2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
  • 3. 不能在静态方法中访问任何非静态成员变量

但是可以再非静态成员方法中访问静态成员变量

  • .4 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
public static String getClassRoom (){
doClass ();
return classRoom ;
}

🚩static成员变量初始化

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

1. 就地初始化

就地初始化指的是:在定义时直接给出初始值


2. 静态代码块初始化

那什么是代码块呢?继续往后看 :) ~~~

👩🏻‍💻代码块

🎈代码块概念以及分类

使用 {} 定义的一段代码称为代码块 。根据代码块定义的位置以及关键字,又可分为以下四种:
  • 普通代码块
  • 构造块
  • 静态块
  • 同步代码块(后续讲解多线程部分再谈)

🚩普通代码块

普通代码块:定义在方法中的代码块

❗构造代码块

构造块:定义在类中的代码块 ( 不加修饰符 ) 。也叫: 实例代码块 构造代码块一般用于 初始化实例成员变量

实例代码块只有在创建对象时才会执行。(所以我们再创建对象的时候,实例化代码块执行)

❗静态代码块

使用 static 定义的代码块称为静态代码块。 一般用于初始化静态成员变量

注意事项
  • 静态代码块不管生成多少个对象,其只会执行一次

  • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
  • 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
  • 实例代码块只有在创建对象时才会执行,静态代码块在加载内存的时候执行。所以惊天比实例先打印,但是静态代码块只打印一次。

我们会有怎样的未来?

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

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

相关文章

10V单通道负载开关

概述 EM5220是一款单通道负载开关,具有可编程上升时间和集成输出放电控制。该设备包含一个P沟道NOSFET,可以通过输入进行操作电压范围为4.5V至10V。开关由接通和断开低电平逻辑输入控制,其能够与GPIO信号接口。设备的可编程上升时间可以减少…

Ruff应用:打破传统,IoT技术赋能工业制造数字化转型之路

近年来,随着物联网、大数据、云计算、5G等数字技术的快速应用,工业制造领域正在经历着前所未有的变革。工业4.0时代,各种数字技术与工业制造的结合,不仅提高了工业生产效率、降低运营成本,更是极大地推动了传统工业数字…

ssm跨域方案?

1、过滤器 2、xml配置 <mvc:cors><mvc:mapping path"/**" /> </mvc:cors>3、注解 CrossOrigin(origins “*”) 说明&#xff1a;三种方案&#xff0c;本质都是一样的、只是方式不一样罢了。

Vite+Vue3使用Vue-i18n笔记

一、下载依赖 vue-i18n yarn add vue-i18n创建存放语言文件的目录 以及配置文件的配置 我是在src/lang 新建index.ts、cn.ts、en.ts以及test文件夹其中再分别新建cn.ts以及en.ts /lang/index.ts 用于导出vue-i18n需要的配置对象 import en from "./en.ts"; import…

MySQL的原生API实现插入数据后在可视化工具上不显示的问题解决

显示表中有两行数据&#xff0c;该表也设置了主键和唯一索引 点进表里看却没有数据 问题原因出现在这里&#xff0c;虽然很多常用的数据库连接池都会开启自动提交&#xff0c;但ibatis的SqlSession使用sessionFactory.openSession()创建时&#xff0c;默认的自动提交是false&am…

com.alicp.jetcache.support.CacheEncodeException: Java Encode error 报错解决

目录 一、报错截图&#xff1a;二、报错原因三、解决方式 一、报错截图&#xff1a; Spring boot 整合 JetCache 使用Cached。报错如下&#xff1a; 二、报错原因 带有Cached注解的方法返回值对象没有实现序列化接口&#xff0c;如下图所示 三、解决方式 带有Cached注解的…

GP232RL国产USB串口如何兼容FT232RL开发资料

GP232RL是最新加入 ftdi 系列 usb 接口集成电路设备的设备。 232r是一个 usb 到串行 uart 接口&#xff0c;带有可选的时钟发生器输出&#xff0c;以及新的 ftdichip-idTM 安全加密器特性。此外&#xff0c;还提供了异步和同步位崩接口模式。 通过将外部 eeprom、时钟电路和 …

基础知识总结

概念概述 计算机网络是通过传输介质、通信设施和网络通信协议&#xff0c;把分散在不同地点的计算机设备互连起来&#xff0c;实现资源共享和数据传输的系统。而网络编程就是编写程序使联网的两个或多个设备&#xff08;比如计算机&#xff09;之间进行数据传输。Java语言对网…

MATLAB R2023B下载安装教程,免费使用,附安装包和工具,操作简单,小白也能轻松搞定

前言 MATLAB是一款商业数学软件&#xff0c;用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境&#xff0c;主要包括MATLAB和Simulink两大部分&#xff0c;可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等…

【正则表达式】获取html代码文本内所有<script>标签内容

文章目录 一. 背景二. 思路与过程1. 正则表达式中需要限定<script>开头与结尾2. 增加标签格式的限定3. 不限制<script>首尾的内部内容4. 中间的内容不能出现闭合的情况 三. 结果与代码四. 正则辅助工具 一. 背景 之前要对学生提交的html代码进行检查&#xff0c;在…

基于springboot招生管理系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括招生管理系统的网络应用&#xff0c;在外国招生管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。招生管理系统具有招生公告信息管理功能的选择…

2024-01-30(Hadoop_HDFS)

1.什么是大数据 狭义&#xff08;技术思维&#xff09;&#xff1a;使用分布式技术完成海量数据的处理&#xff0c;得到数据背后蕴含的价值。 广义&#xff1a;大数据是数字化时代&#xff0c;信息化时代的基础&#xff08;技术&#xff09;支撑&#xff0c;以数据为生活赋能…

win wsl2 Ubuntu-22.04 设置时间为国内时间

使用 wsl2 安装 Ubuntu-22.04 后 时间不正确&#xff0c;主要有两个原因 时区设置不正确&#xff0c;国内为京八区。 时区正确后&#xff0c;没有同步时间。&#xff08;大部分人容易忽略这一点&#xff09; Linux 默认情况下使用 UTC 格式作为标准时间格式&#xff0c;如果在…

双创竞赛项目申报:Java + Spring Boot的实战指南

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

单片机学习笔记---静态数码管显示

目录 数码管是什么&#xff1f; 一位数码管的引脚定义 四位一体的数码管引脚定义 数码管的原理图解析 数码管怎么显示数据&#xff1f;&#xff08;总结代码显示&#xff09; 今天开始学习数码管&#xff0c;它比LED和独立按键复杂一点 数码管是什么&#xff1f; LED数码…

如何获取到小程序appId

一、申请测试号 直接访问这个链接微信扫一下 微信公众平台 然后再去微信公众平台登录&#xff0c;账号的选择中就会多一个微信小程序测试号 选择登录即可获取到appid 二、注册一个微信小程序 第二种方式&#xff0c;去微信公众平台注册一个小程序。 注册完成后&#xff0c;…

ARM汇编 4.GNU伪指令、内联汇编

汇编伪指令格式 标号symbol&#xff08;label&#xff09; 注释符号&#xff1a; 整行注释&#xff1a;# 语句分离&#xff1a;&#xff1b; 立即数前缀&#xff1a;# 或 $ 分段&#xff1a;.section伪操作&#xff0c;用于自定义新的段 .text&#xff1a;代码段.data&am…

MP4格式视频怎么提取gif?一招教你在线做

MP4是一种常见的数字多媒体容器格式&#xff0c;它是一种使用最广泛的视频文件格式之一。MP4文件可以包含音频、视频和字幕等多种媒体数据&#xff0c;并且可以通过各种播放器和设备进行播放和共享。它是一种压缩格式&#xff0c;可以在保持相对较小文件大小的同时提供较高的视…

Java 的 Map 與 List

通過重新new 一個ArrayList 轉化 resTask.setList(new ArrayList<Group>(custMap.values())); 无序的Map List 有序的数据放到Map&#xff0c;就变成无序。 List排序 按照code 的字母进行排序A-Z resTask.getListData().sort(Comparator.comparing(Gmer::getCode));…

spring框架(一)

1、Spring框架&#xff1a;IoC和AOP 服务端三层开发&#xff1a;表现层、业务层、持久层 ssm, springboot, springcloud(微服务&#xff0c;治理组件) Spring框架是一个流行的Java应用程序框架&#xff0c;它提供了许多功能来简化企业级应用程序的开发。其中&#xff0c;控制反…