Java类与对象详解(3)
目录
封装
封装的概念
访问限定符
封装扩展之包
包的概念
导入包中的类
自定义包
基本规则
包的访问权限控制举例
常见的包
static 成员
static 修饰成员变量
static修饰成员方法
static 成员变量的初始化
代码块
代码块的概念及其分类
普通代码块
构造代码块
静态代码块
封装
封装的概念
我们知道,面向对象程序的三大特性为:封装,继承,多态。而类和对象阶段,主要研究的是封装特性,何为封装呢?简单来说就是套壳屏蔽细节。在java语法中,就是指被private修饰的成员变量和成员方法。(private一会会详细介绍)。
那么为什么用private修饰了,我们就说实现了封装了呢?来看下面一个代码:
class Peo{private int age;private String name;public Peo(){}public Peo(int age, String name){this.age = age;this.name = name;}public void sleep(String name){System.out.println(this.name + "正在睡觉");}
}public class test1 {public static void main(String[] args) {Peo p = new Peo();//直接调用?p.name = "马牛逼";}
}
这里出现了一个错误:

原因是这里Peo类中name被private 修饰了(等同于name被屏蔽了,用户不知道这个p对象中的属性),所以不能直接调用name。通俗的来说:就是p这个对象具有隐私权,根据宪法(private),我们无法侵犯它的隐私(name这个属性)。
访问限定符
Java中主要通过类和访问权限进行封装:类可以将数据以及封装数据的方法结合到一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:

比如:
public:可以理解为一个人的外貌特征,谁都可以看得到。
default:对于自己家族中(同一个包中)不是什么秘密,对于其他人就是隐私了(默认权限)
private:只有自己知道,其他人都不知道。
说明:
protected主要用在继承中,继承部分会详细介绍
default权限指:前面不写访问限定符的默认权限
访问权限除了可以限定类中成员的可见性,也可以限制类的可见性
注意:一般情况下成员变量设置为private,成员方法设置为public.
封装扩展之包
包的概念
在面向对象体系中,提出了软件包的概念,即:为了更好地管理类,把多个类放在一起成为一组,称为软件包。有点类似于目录。比如管理电脑中歌曲的方式如下:

在Java中也引入了包,包是对类,接口等封装机制的体现,是一种对类或者接口等很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在一个工程中允许出现相同名称的类,只要在不同包中即可。
导入包中的类
Java中已经提供了很多现成的类供我们使用,例如Date类:可以使用java.util.Date导入java.util这个包中的Date类。
public class test2 {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 test2 {public static void main(String[] args) {Date date = new Date();//得到一个毫秒级别的时间戳System.out.println(date.getTime());}
}
如果要使用java.util中的其它类,可以使用import java.util.*;
但是还是更建议显式地指定导入java.util的其它类。否则可能会出现冲突的情况,举个栗子:
import java.util.*;
import java.sql.*;public class test2 {public static void main(String[] args) {Date date = new Date();//得到一个毫秒级别的时间戳System.out.println(date.getTime());}
}
这里有这样的问题:

因此这种情况应该使用完整的类名。
可以用import static 导入包中的静态方法和字段。eg:
import static java.lang.Math.*;public class test3 {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);}
}
自定义包
基本规则
1.在文件的最右上方加上一个package语句指定该代码在哪个包中。
2.包名需要尽量指定生成唯一的名字,通常会用公司域名的颠倒形式(eg:com.air.demo)
3.包名要和代码路径相匹配,例如创建com.air.demo的包,那么就会存在一个对应路径com/air/demo来存储代码
4.如果没有package的语句,则该类被放在一个默认包中。
包的访问权限控制举例
Computer位于Demo1中,TestComputer位于Demo2中
package Demo1;public class Computer {private String cpu;//cpuprivate String memory;//内存public String screen;//屏幕String brand;//品牌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("上网---");}
}package Demo2;import Demo1.Computer;
public class TestComputer {public static void main(String[] args) {Computer p = new Computer("MAC","M1", "8G", "13*14");System.out.println(p.screen);//System.out.println(p.cpu);//报错:cpu是私有的,不允许被其它类访问//System.out.println(p.brand);//报错:brand是default,不允许被其他的包访问}
}//注:如果去掉Computer类之前的public 修饰符,代码也会编译失败
常见的包
1.java.lang:系统常用的基础类(String, Object),此包从JDK1.1后自动导入
2. java.lang.reflect:java 反射编程包
3. java.net:进行网络编程开发包
4. java.sql:进行数据库开发的支持包
5. java.util:是java提供的工具程序包,(集合类等) 非常重要
6. java.io:I/O编程开发包
static 成员
static 修饰成员变量
我们之前讲过:实例变量是指定义在类中的变量,每个类的实例(对象)都会有自己的一组实例变量,那么什么又是static 修饰的成员变量呢?
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。(比如创建几个学生对象,他们都是一班的,那么这个班级是共享的,是static 修饰的成员变量)。
静态成员变量的特性
1.不属于某个具体的对象,是类的属性,为所有对象共享的,不存储在某个对象的空间中
2.既可以通过对象访问,也可以通过类名访问,但一般更推荐类名访问
3.类变量存储在方法区中
4.生命周期伴随着类的一生(即:随类的加载而创建,随类的销毁而卸载)
举个栗子:
public class Student {public String name;public String gender;public int age;public double score;public static String classroom = "303";public static void main(String[] args) {//静态变量可以直接通过类名来访问System.out.println(Student.classroom);Student s1 = new Student();Student s2 = new Student();//也可通过类名来访问,不过classroom是两个对象共享的System.out.println(s1.classroom);System.out.println(s2.classroom);}
}
通过调试,在监视窗口可以看到,静态成员并没有存储到某个具体的对象中。

static修饰成员方法
一般类中的数据成员都设置为private,而成员方法设置为public,那设置之后,Student类中classRoom属性如何在类外访问呢?
class Student {private String name;private String gender;private int age;private double score;private static String classRoom = "103";}public class TestStudent{public static void main(String[] args) {System.out.println(Student.classRoom);}
}//java: classRoom 在 Demo2.Student 中是 private 访问控制
那static 属性应该如何访问呢?
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。(把静态变量叫做类变量/方法)静态成员一般是通过静态方法来访问的。
举个栗子:
public class Student {private static String classRoom = "103";public static String getClassRoom() {return classRoom;}public static void main(String[] args) {System.out.println(Student.classRoom);}
}
显而易见静态方法可以轻松解决问题,下面我们来说一下静态方法的特性:
1.与静态成员变量相同,不属于某个具体的对象,属于类
2.可以通过对象调用,也可以通过类名.静态方法名的方式调用,更推荐后者
3.不能在静态方法中使用任何非静态变量
4.静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中不能传递this引用
static 成员变量的初始化
注意:静态变量一般不在构造方法中初始化,因为静态变量不属于任何对象,构造方法中初始化的是对象相关的实例属性。
静态成员变量的初始化分为两种:就地初始化和代码块初始化。
1.就地初始化:在定义时直接给出初始值。
2.静态代码块初始化:见下文:
代码块
代码块的概念及其分类
使用{}定义的一段代码成为代码块。根据代码块的定义位置以及关键字,又可分为以下四种:
1.普通代码块
2.构造块
3.静态块
4.同步代码块
普通代码块
定义:定义在方法内的代码块
public class Test1 {public static void main(String[] args) {{//直接用{}定义普通代码块int x = 10;System.out.println(x);}int x = 100;System.out.println(x);}
}

这种用法偏少
构造代码块
构造块:定义在类中的代码块(不加修饰符) 。也叫:实例代码块
构造代码块一般适用于初始化实例成员变量。
class Student1 {//实例成员变量private String name;private String gender;private int age;private double score;//构造方法public Student1() {System.out.println("I am Student init()!");}//实例代码块{this.name = "bit";this.age = 12;this.gender = "man";System.out.println("I am instance init()");}public void show(){System.out.println("name:" + name +",age:" + age + ",gender:" + gender);}public static void main(String[] args) {Student1 stu = new Student1();stu.show();}
}

静态代码块
使用static 定义的代码块称为静态代码块。一般用于初始化静态成员变量。、
public class Student2 {private String name;private String gender;private int age;private double score;private static String classRoom;//实例代码块{this.name = "bit";this.age = 12;this.gender = "man";System.out.println("I am instance init()");}//静态代码块static {classRoom = "103";System.out.println("I am static init()");}//构造方法public Student2(){System.out.println("I am Student init()");}public static void main(String[] args) {Student2 s1 = new Student2();Student2 s2 = new Student2();}
}

通过上面的代码我们可以总结出如下规律:
1.静态代码块不管实例化出多少对象,都只执行一次
2.(以只创建一个对象为例)执行代码块的基本顺序为:静态代码块->实例代码块->构造方法
3.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
4.如果一个类中包含多个代码块/实例代码块,它们会合到一块
5.实例代码块只有创建了对象才会执行,而静态代码块不创建对象也可以
相关文章:
Java类与对象详解(3)
目录 封装 封装的概念 访问限定符 封装扩展之包 包的概念 导入包中的类 自定义包 基本规则 包的访问权限控制举例 常见的包 static 成员 static 修饰成员变量 static修饰成员方法 static 成员变量的初始化 代码块 代码块的概念及其分类 普通代码块 构造代码块…...
PMP备考指南来啦!
第一步:通读教材,了解学习内容 在正式开始课程的学习前,可以先快速简单地阅览一遍教材(PMBOK),在较短的时间内知道自己将要学习的是什么内容;同时可以标记出难理解的知识点。这样做有以下两个好…...
计算机视觉中的特征检测和描述
一、说明 这篇文章是关于计算机视觉中特征检测和描述概念的简要理解。在其中,我们探讨了它们的定义、常用技术、简单的 python 实现和一些限制。 二、什么是特征检测和描述? 特征检测和描述是计算机视觉中的基本概念,在图像识别、对象跟踪和图…...
【docker】 运行bytetrack 构建映像失败 使用docker删除之前构建的映像
1 Docker删除docker build失败的images docker images | grep "<none>" | awk {print $3} | xargs docker rmi 2 Docker删除启动失败的image docker ps -a | awk {if (length($2) 12){print $1}} | xargs docker rm...
视图矩阵推导
线性代数知识背景 空间中对边向量相等的四边形是平行四边形 视图矩阵推导...
Linux | 隐藏终端并在指定路径下执行命令
文章目录 概述一、定义介绍二、操作教程(一)、编写脚本1.创建脚本2.编写代码(二)、执行脚本1.脚本执行2.自启动执行3.检查和杀死隐藏程序概述 本节详细介绍了如何在Ubuntu18系统下隐藏终端执行命令,同时可以指定命令执行路径。 一、定义介绍 隐藏终端启动其实很简单,只需要在…...
JavaSE_2.1——数组之Arrays工具类
Java提供了一个专门用于操作数组的工具类,即Arrays类,位于Java. util包下【需要导入】。该类提供了一系列方法来操作数组,例如排序、赋值、比较、填充数组 等,用户直接调用这些方法即可【例如:Arrays.sort(数组名)】&a…...
yolov5、YOLOv7、YOLOv8改进:注意力机制CA
目录 1.背景介绍 论文题目:《Coordinate Attention for Efficient Mobile NetWork Design》论文地址: https://arxiv.org/pdf/2103.02907.pdf 2.原理介绍 3.YOLOv5改进: 3.1common中加入下面代码 3.2在yolo.py中注册 3.3添加配置文件 …...
LeetCode解法汇总617. 合并二叉树
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你两棵二…...
记vite打包vue项目内存溢出问题解决
出现问题 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory解决方法一: 1.根据网上的资料是通过全局下载npm包increase-memory-limit: npm install -g increase-memory-limit2.在项目目录执…...
【SCI征稿】2区SCI,大数据与遥感技术、图像处理技术、物联网(IoT)技术、传感器网络的结合研究
期刊简介: 【出版社】Elsevier 【影响因子】IF(2022):3.0-4.0 【期刊分区】JCR2区,中科院4区 【检索情况】SCIE 在检,正刊 【参考周期】期刊部系统内提交,预计3个月左右录用,走…...
java_基础语法及用法
文章目录 一、java基础1.1 JAVAEE的13个规范 二、java基础语法2.1 final2.2 static2.3 异常 三、java基础用法3.1 时间格式化3.2 java计时 一、java基础 1.1 JAVAEE的13个规范 JAVA EE的十三种规范 二、java基础语法 2.1 final 1.被final修饰的类不可以被继承 2.被final修…...
C# WPF 开源主题 HandyControl 的使用(一)
HandyControl是一套WPF控件库,它几乎重写了所有原生样式,同时包含80余款自定义控件(正逐步增加),下面我们开始使用。 1、准备 1.1 创建项目 C# WPF应用(.NET Framework)创建项目 1.2 添加包 1.3 在App.xaml中引用…...
探索ES高可用:滴滴自研跨数据中心复制技术详解
Elasticsearch 是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎,其每个字段均可被索引,且能够横向扩展至数以百计的服务器存储以及处理TB级的数据,其可以在极短的时间内存储、搜索和分析大量的数据。 滴滴ES发展至今…...
指针---进阶篇(二)
指针---进阶篇(二) 前言一、函数指针1.抛砖引玉2.如何判断函数指针?(方法总结) 二、函数指针数组1.什么是函数指针数组?2.讲解函数指针数组3.模拟计算器:讲解函数指针数组 三、指向函数指针数组…...
Python实现SSA智能麻雀搜索算法优化循环神经网络分类模型(LSTM分类算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法,在2020年提出&a…...
【go语言基础】结构体struct
主要是敲代码,敲的过程中会慢慢体会。 1.概念 结构体是用户定义的类型,表示若干字段的集合,目的是将数据整合在一起。 简单的说,类似Java中的实体类。存储某个实体属性的集合。 2.结构体声明 注意:结构体名字&…...
显卡服务器适用于哪些场景
显卡(GPU)服务器,简单来说,GPU服务器是基于GPU的应用于视频编解码、深度学习、科学计算等多种场景的快速、 稳定、弹性的计算服务。那么壹基比小鑫告诉你显卡服务器主要的用途有哪一些。 一、运行手机模拟器 显卡服务器可支持…...
MySQL DML 数据操作
文章目录 1.插入记录INSERTREPLACE 2.删除记录3.修改记录4.备份还原数据参考文献 1.插入记录 INSERT 使用 INSERT INTO 语句可以向数据表中插入数据。INSET INTO 有三种形式。 INSET INTO tablename SELECT...INSET INTO tablename SET column1value1,column2value2...INSET…...
服务端与网络相关知识
1. http/https 协议 1.0 协议缺陷: ⽆法复⽤链接,完成即断开,重新慢启动和 TCP 3 次握⼿head of line blocking : 线头阻塞,导致请求之间互相影响 1.1 改进: ⻓连接(默认 keep-alive ),复⽤host 字段指定对应的虚拟站点新增功…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
