当前位置: 首页 > news >正文

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提供了一个专门用于操作数组的工具类&#xff0c;即Arrays类&#xff0c;位于Java. util包下【需要导入】。该类提供了一系列方法来操作数组&#xff0c;例如排序、赋值、比较、填充数组 等&#xff0c;用户直接调用这些方法即可【例如&#xff1a;Arrays.sort(数组名)】&a…...

yolov5、YOLOv7、YOLOv8改进:注意力机制CA

目录 1.背景介绍 论文题目&#xff1a;《Coordinate Attention for Efficient Mobile NetWork Design》论文地址&#xff1a; https://arxiv.org/pdf/2103.02907.pdf 2.原理介绍 3.YOLOv5改进&#xff1a; 3.1common中加入下面代码 3.2在yolo.py中注册 3.3添加配置文件 …...

​LeetCode解法汇总617. 合并二叉树

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你两棵二…...

记vite打包vue项目内存溢出问题解决

出现问题 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory解决方法一&#xff1a; 1.根据网上的资料是通过全局下载npm包increase-memory-limit&#xff1a; npm install -g increase-memory-limit2.在项目目录执…...

【SCI征稿】2区SCI,大数据与遥感技术、图像处理技术、物联网(IoT)技术、传感器网络的结合研究

期刊简介&#xff1a; 【出版社】Elsevier 【影响因子】IF&#xff08;2022&#xff09;&#xff1a;3.0-4.0 【期刊分区】JCR2区&#xff0c;中科院4区 【检索情况】SCIE 在检&#xff0c;正刊 【参考周期】期刊部系统内提交&#xff0c;预计3个月左右录用&#xff0c;走…...

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控件库&#xff0c;它几乎重写了所有原生样式&#xff0c;同时包含80余款自定义控件&#xff08;正逐步增加&#xff09;&#xff0c;下面我们开始使用。 1、准备 1.1 创建项目 C# WPF应用(.NET Framework)创建项目 1.2 添加包 1.3 在App.xaml中引用…...

探索ES高可用:滴滴自研跨数据中心复制技术详解

Elasticsearch 是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎&#xff0c;其每个字段均可被索引&#xff0c;且能够横向扩展至数以百计的服务器存储以及处理TB级的数据&#xff0c;其可以在极短的时间内存储、搜索和分析大量的数据。 滴滴ES发展至今&#xf…...

指针---进阶篇(二)

指针---进阶篇&#xff08;二&#xff09; 前言一、函数指针1.抛砖引玉2.如何判断函数指针&#xff1f;&#xff08;方法总结&#xff09; 二、函数指针数组1.什么是函数指针数组&#xff1f;2.讲解函数指针数组3.模拟计算器&#xff1a;讲解函数指针数组 三、指向函数指针数组…...

Python实现SSA智能麻雀搜索算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…...

【go语言基础】结构体struct

主要是敲代码&#xff0c;敲的过程中会慢慢体会。 1.概念 结构体是用户定义的类型&#xff0c;表示若干字段的集合&#xff0c;目的是将数据整合在一起。 简单的说&#xff0c;类似Java中的实体类。存储某个实体属性的集合。 2.结构体声明 注意&#xff1a;结构体名字&…...

显卡服务器适用于哪些场景

显卡&#xff08;GPU&#xff09;服务器&#xff0c;简单来说&#xff0c;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 协议缺陷: ⽆法复⽤链接&#xff0c;完成即断开&#xff0c;重新慢启动和 TCP 3 次握⼿head of line blocking : 线头阻塞&#xff0c;导致请求之间互相影响 1.1 改进: ⻓连接(默认 keep-alive )&#xff0c;复⽤host 字段指定对应的虚拟站点新增功…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...