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

javaSE类和对象(下)

目录君

    • 1.封装
    • 2.访问限定符
    • 3.包的定义及使用
    • 4.static成员变量
    • 5.static成员方法
    • 6.代码块及其分类
      • 实例代码块
      • 静态代码块
      • 静态代码块与实例代码块的执行顺序
      • static成员变量(类变量)初始化

1.封装

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

封装的概念

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互,对类的实现细节进行隐藏,只对外提供接口进行访问,使用private关键字修饰成员变量或者成员方法,降低代码耦合度 简单举个例子,我们平时使用的电脑,我们在使用电脑时都是通过usb接口键盘,鼠标实现与电脑进行交互,而并没有直接对电脑中的硬件等进行操作,我们看不见其中的内部操作,但能通过一个接口访问电脑的方式。这就是封装的简单例子

2.访问限定符

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

public:允许不同包中的不同类之间进行访问,可以理解为一个人的外貌特征,谁都可以看得到
default: 最大访问权限是允许同一个包中不同类之间进行访问,对于自己家族中(同一个包中)的秘密,对于其他家族的人来说就是隐私
private:只允许在同一包中同一个类中进行访问,可以理解为自己的小秘密只有自己知道,其他人都不知道
protected:被该修饰符修饰的成员变量或成员方法,最大权限是允许不同包中的子类中访问,(注意是在不同包的子类,意思是如果这两个子类来自不同的包,那只能在继承的子类中使用,注意如果子类和父类在两个不同的包内时,父类的访问修饰限定符一定是public,因为如果不是的话,那就只有包权限的访问限定修饰符了,那此时这个类就只能在当前包中使用了,自然也就不能被其他包中的类继承了)
在这里插入图片描述

3.包的定义及使用

1.概念:任何操作系统中,都有一个统一的共识:同一个目录下不能存在相同的文件名称,但是,实际开发中又很难避免命名冲突矛盾的问题,为此,项目中往往会引入包的概念,所谓的包,存储时就是一个文件夹,在不同目录中可以存放相同的文件。

注意:Java项目开发中,程序类必须要有包的定义才可以使用,没有包的类不存在,类的完整名称就是”包.类“。

2.自定义包
规则

  1. 在文件的最上方加上一个 package 语句指定该代码在哪个包中,也叫做包的声明.
    2.包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.badu.demo1 ).
    3.包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径 com/bit/demo1 来存储代码.
    4.如果一个类没有 package 语句, 则该类被放到一个默认包中.
package com.example.myPackage;
//包定义的书写规则,com+公司域名+包名

操作步骤

1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包
2. 在弹出的对话框中输入包名, 例如 com.hat.myPackage
3. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可
4. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了,同时我们也看到了, 在新创建的文件的最上方, 就出现了一个package 语句

3.如何导入包

1.Java 中已经提供了很多现成的类供我们使用. 例如Date类:可以在代码中使用 java.util.Date 导入 java.util 这个包中的 Date 类.
2.上一种方式写法比较麻烦一些, 可以使用 import语句导入包.
3.如果还需要使用相同包中的不同类的话,例如Date类所在的包中使用 java.util 中的其他类, 可以使用 import java.util.*,但这种方式有个弊端就是如果不同包中都包含了同名的类,那编译器此时就会蒙,那此时就只能用第一种方式导入不同包中的同名类。
4(不建议).使用import static导入包中静态的方法和字段。

//使用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);} 
}
`

常见的包

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编程开发包。

4.static成员变量

1.概念:在Java中,被static修饰的成员变量,称之为静态成员变量,也可以称为类变量,其不属于某个具体的对象,是所有对象所共享的,类中被static修饰的成员变量或方法其是被放在JVM的方法区的。

2.static修饰成员变量

static修饰的成员变量,称为静态成员变量(也称之为类变量),静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的,简单来说就是被static修饰的成员变量或者成员方法都不依赖于对象,可直接通过类名访问,静态成员变量可以在类中的普通方法或者静态方法中调用。

static修饰成员变量的特性

1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但更推荐使用类名访问(即使对象的引用为NULL也可以访问静态成员变量或者静态方法,原因是静态成员的访问不依赖于对象)
3. JDK7及以前,HotSpot(Java虚拟机)中存储在方法区,JDK8及之后,类变量存储在Java堆中
4. 类变量存储在方法区当中(方法区在逻辑上是和堆区是同一级别的,但是在现实时,JVM将方法区放在堆区实现)
5. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

 public static void main(String[] args) {//dog dog1=new dog("小狗",66,"公的");//此处打印类成员并没有实例化对象System.out.println(dog.name);//说明静态成员变量不依赖于对象//给dog对象的引用变量赋null值,也可以访问静态成员dog d1=null;d1.name}
}class dog{public static String name="小鬼子";private int  age;private String sex;
}

在这里插入图片描述

5.static成员方法

1.概念:在Java中,被static修饰的成员方法,称之为静态成员方法,其不属于某个具体的对象,是所有对象所共享的。

static修饰成员方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的,一般类中的数据成员都设置为private,而成员方法设置为public,

静态方法的特性

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
  3. 静态方法没有隐藏的this引用参数,因此不能在静态方法中访问任何非静态成员变量,但可以访问静态成员变量,方便理解其实就是静态方法是属于类的,调用静态方法是不依赖于对象的,而如果在静态方法中使用普通的成员变量或者普通成员方法那就会报错,因为他们都是依赖于对象来进行调用访问的,如果非要在静态方法中使用或调用普通成员变量和方法,那就要先在静态方法中实例化对象,通过创建好的对象来进行访问。

6.代码块及其分类

代码块概念:使用 {} 定义的一段代码称为代码块,根据代码块定义的位置以及关键字,又可分为以下四种:

1.普通代码块:定义在方法中的代码块.
**2.实例代码块(构造快):定义在类中的代码块(不加修饰符)。也叫:实例代码块。
3.静态块:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量
4.同步代码块(后续讲解多线程部分再谈)

实例代码块

简介

构造代码块一般用于初始化实例成员变量,也可以在构造代码块中对静态成员变量进行赋值,值得注意的是,实例代码块只有在实例化对象时才会被执行,如果不创建对象,那实例代码块就不会被执行,每实例化一次对象就会执行一次实例代码块。实例代码块优先于构造方法执行,因为编译完成生成字节码文件后,编译器会将实例代码块中的代码拷贝到每个构造方法第一条语句前。

实例化对象前
在这里插入图片描述

实例化对象后
在这里插入图片描述

静态代码块

简介

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量,所以在静态代码块中不能对普通成员变量赋值(因为依赖于对象),且静态代码块只执行一次(因为在程序运行过程中类只在JVM中加载一次),如果类中存在多个静态代码块,那编译器会按照前后顺序与实例代码块的执行顺序不同的是,静态代码块在JVM加载类的时候,就执行了,因为静态代码块不依赖于对象

例如

class person{public String name;public int age;public static String sex;//该代码块为一个实例代码块{name="小黄";age=18;// sex="hu";System.out.println("这是person类中的实例代码块");}//改代码块是一个静态代码块1static {sex="🐖";System.out.println("这是第一个静态代码块");}//改代码块是一个静态代码块2static {sex="🐂";System.out.println("这是类中第二个静态代码块");}public person(String name, int age) {this.name = name;this.age = age;System.out.println("这是带三个参数的构造函数");}
}
public class pack1demo1 {public static void main(String[] args) {person man1=new person("man1",54);person man2=new person("man2",22);System.out.println(man1.name);System.out.println(man1.age);System.out.println(person.sex);}
}

在这里插入图片描述

静态代码块与实例代码块的执行顺序

一般静态代码块的是先于实例代码块进行执行的,因为静态代码块是在类进行加载时就开始执行的,且只执行一次,而我们的实例代码块则是在类已经加载好之后,也就是要进行实例化对象时,此时实例代码块开始执行,对对象的成员变量进行初始化,可执行多次,创建一次对象就执行一次实例代码块。

java代码运行流程
Java代码在经过编译器编译之后,如果要运行必须先要经过类加载子系统加载到JVM中才能运行。在加载阶段:在链接阶段第二步准备中会给静态成员变量开辟空间,并设置为默认值,在初始化阶段,会执行静态代码块中的代码。(了解:关于类加载过程后序JVM中会详细讲解)
在这里插入图片描述

static成员变量(类变量)初始化

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

2.就地初始化

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

3.静态代码块初始化

静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的,所以静态成员变量常常使用静态代码块进行初始化,详情见上

相关文章:

javaSE类和对象(下)

目录君1.封装2.访问限定符3.包的定义及使用4.static成员变量5.static成员方法6.代码块及其分类实例代码块静态代码块静态代码块与实例代码块的执行顺序static成员变量(类变量)初始化1.封装 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要…...

【数据结构】第四站:单链表力扣题(二)

目录 一、链表的回文结构 二、相交链表 三、环形链表 四、环形链表Ⅱ 五、复制带随机指针的链表 一、链表的回文结构 题目描述:链表的回文结构_牛客题霸_牛客网 对于这道题,如果没有前面的一些题的基础,是非常难做的,我们的思…...

KafKa知识汇总

前言 汇总相关知识 Kafka快速实战与基本原理详解...

【RV1126】调试GT911,1024x600 7寸 MIPI 电容触摸屏

文章目录一、驱动注册失败二、触摸屏可以触摸,但是x轴数据反了三、可以触摸了,但是Y轴数据跳变,几乎只有一半的屏幕是可以正常滑动的三、汇顶触摸屏配置文件解析四、使用新的配置文件4.1 新配置解决问题4.2 测试触摸的方法在kernel增加frame …...

C的强符号/弱符号

首先上代码和结果&#xff1a; 代码&#xff1a; #include <stdio.h> int k; int k; int main() {printf("addr of k %p\n", &k);printf("value of k %d\n", k);return 0; }结果&#xff1a; addr of k 00408074 value of k 0问题&…...

AD/DA转换(XPT2046)

AD/DA介绍AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换为模拟信号AD/DA转换打开…...

乐观锁和悲观锁 面试题

Mysql的乐观锁和悲观锁 实现方式加锁时机常见的调用方式优势不足适用场景乐观锁开发自定义更新数据的时候sql语句中进行version的判断高并发容易出现不一致的问题高并发读&#xff0c;少写悲观锁Mysql内置查询数据的开始select * for update保证一致性低并发互联网高并发场景极…...

【Autoware规控】mpc_follower模型预测控制节点

文章目录1. 技术原理2. 代码实现1. 技术原理 MPC&#xff0c;即Model Predictive Control&#xff08;模型预测控制&#xff09;&#xff0c;是一种基于动态模型的控制算法。MPC算法通过建立系统的数学模型&#xff0c;根据当前状态和一定时间内的预测&#xff0c;优化未来的控…...

成果VR虚拟3D展厅让内容更丰富饱满

随着数字技术的不断发展和普及&#xff0c;数字化展厅成为了一种重要的展示形式。线上虚拟展厅作为数字化展示的一种新形式&#xff0c;采用虚拟现实技术&#xff0c;能够克服时空限制&#xff0c;打破传统展览业的展示模式&#xff0c;为用户提供更加丰富、立体、沉浸式的展览…...

【CE进阶】lua脚本使用

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 脚本窗口Lua ScriptLua EngineAuto assemble2️⃣ 全局变量3️⃣ 进程当前打开的进程ID系统的进程列表系统的顶部窗口列表4️⃣ 线程5️⃣ 输入设备6️⃣ 屏幕7️⃣ 剪贴板&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x…...

【vue2】近期bug收集与整理02

⭐【前言】 在使用vue2构建页面时候&#xff0c;博主遇到的问题难点以及最终的解决方案。 &#x1f973;博主&#xff1a;初映CY的前说(前端领域) &#x1f918;本文核心&#xff1a;博主遇到的问题与解决思路 ⭐数据枚举文件的使用 同后端那边发送请求的时&#xff0c;请求返…...

2. 01背包问题

文章目录QuestionIdeasCodeQuestion 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi &#xff0c;价值是 wi 。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入…...

【Docker】CAdvisor+InfluxDB+Granfana容器监控

文章目录原生命令 docker stats容器监控3剑客CIGCAdvisorInfluxDBGranfanacompose容器编排&#xff0c;一套带走新建目录新建3件套组合的 docker-compose.yml检查配置&#xff0c;有问题才有输出 docker-compose config -q启动docker-compose文件 docker-compose up -d测试浏览…...

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结

k8s 部署nginx 实现集群统一配置&#xff0c;自动更新nginx.conf配置文件 总结 大纲 1 nginx镜像选择2 创建configmap保存nginx配置文件3 使用inotify监控配置文件变化4 Dockerfile创建5 调整镜像原地址使用阿里云6 创建deploy部署文件部署nginx7 测试使用nginx配置文件同步&…...

动态内存管理(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是动态内存管理噢&#xff0c;下面&#xff0c;让我们进入动态内存管理的世界吧 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 为什么存在动态内存分配 我们已…...

GPT-4发布,这类人才告急,大厂月薪10W+疯抢

ChatGPT最近彻底火出圈&#xff0c;各行各业都在争相报道&#xff0c;甚至连很多官媒都下场“跟风”。ChatGPT的瓜还没吃完&#xff0c;平地一声雷&#xff0c;GPT-4又重磅发布&#xff01; 很多小伙伴瑟瑟发抖&#xff1a;“AI会不会跟自己抢饭碗啊&#xff1f;” 关于“如何…...

MySQL数据库实现主主同步

前言 MySQL主主同步实际上是在主从同步的基础上将从数据库也提升成主数据库&#xff0c;让它们可以互相读写数据库&#xff0c;从数据库变成主数据库&#xff1b;主从相互授权连接&#xff0c;读取对方binlog日志并更新到本地数据库的过程,只要对方数据改变&#xff0c;自己就…...

JavaScript传参的6种方式

JavaScript传参的方式1. 传递基本类型参数2. 传递对象类型参数3. 使用解构赋值传递参数4. 使用展开运算符传递参数5. 使用可选参数6. 使用剩余参数JavaScript是一门非常灵活的语言&#xff0c;其参数传递方式也同样灵活。在本篇文章中&#xff0c;会详细介绍JavaScript中的参数…...

蓝桥之统计子矩阵

样例说明 满足条件的子矩阵一共有 19 , 包含: 大小为 11 的有 10 个。 大小为 12 的有 3 个。 大小为13 的有 2 个。 大小为 14 的有 1 个。 大小为 21 的有 3 个。 前缀和二维数组 前缀和暴力搜索 import java.util.*; public class Main{private static int ans0;pub…...

Java的基础面试题

一.java基础1.JDK和JRE有什么区别&#xff1f;JDK是java开发工具包&#xff0c;JRE是java运行时环境&#xff08;包括Java基础类库&#xff0c;java虚拟机&#xff09;2.和equals的区别是什么&#xff1f;比较的是两者的地址值&#xff0c;equals比较的是两者的内容是否一样3.两…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

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

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

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...