当前位置: 首页 > 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 字段指定对应的虚拟站点新增功…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...