Java基础---复习01

main方法

一个程序有且只有一个main方法,main方法是java程序的唯一入口。

修饰符

修饰类修饰方法修饰域
public都可以访问都可以访问
private私有类只能本类只能本类
protected子类可以继承、访问,同包下的类也可以访问子类可以继承、访问,同包下的类也可以访问
default只有同包下的才可以访问只有同包下的才可以访问

static关键字

  1. static修饰的方法只能调用static修饰的属性或者方法,普通方法可以调用static修饰的
  2. 静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化

类的加载顺序

public class Main {private static int k = 1;private static Main m1 = new Main("m1");private static Main m2 = new Main("m2");private static int i = print("i");private static int n = 99;{print("初始化块");j = 100;}public Main(String name) {System.out.println((k ++) + ":" + name + ",i=" + i + ",n=" + n);++ i;++ n;}static {print("静态块");n = 100;}private int j = print("j");public static int print(String str) {System.out.println((k ++) + ":" + str + ",i=" + i + ",n=" + n);++ n;return ++ i;}public static void main(String[] args) {Main m = new Main("m");}
}

输出结果
在这里插入图片描述

解释
这道题还是有点难度的,答案错了也没关系。耐心看完这篇博客就什么明白了。

  1. 首先我们需要清除当类加载时,第一步是静态的属性进行创建,此时并不会进行赋值操作,也即k=0,m1=null,m2=null等等
  2. 然后才是开始进行赋值操作,此时k=1;接下来创建实例对象m1,创建对象时是执行所有的非静态属性、代码块以及方法,最后执行构造方法。此时执行第一个静态代码块,并且此时的i和n是还没有赋值的,所以输出1:初始化块,i=0,n=0",然后i和n都完成++操作。
  3. 然后执行private int j = print("j");,故而输出2:j,i=1,n=1,i和n也都完成++操作。
  4. 当所有的非静态属性、方法等都执行完毕,就执行自己的构造函数,故而输出3:m1,i=2,n=2,i和n也都完成++操作。
  5. 此时完成了m1对象的创建。代码继续向下执行,创建m2对象,其过程同m1对象的过程一样,先完成非静态的所有属性、代码块、方法,然后再执行构造函数。这里就不作过多赘述。
  6. 当m2对象也创建完成,代码继续向下执行,对i进行赋值操作,也就是执行print("i"),故而输出7:i,i=6,n=6,i和n也都完成++操作。
  7. 接着向下执行,为n赋值为99。然后是静态代码块static{print("静态块");n = 100;}这里要注意静态代码块也是赋值操作。因此输出8:静态块,i=7,n=99
  8. 然后就是执行我们的main方法,跟创建m1和m2时一样,只不过此时的n以及完成了赋值操作。

总结起来就一句话,类加载时先静态,并且按照顺序从上往下加载,先进行所有静态属性的初始化,然后才是赋值。创建对象时,只执行非静态的,然后再执行构造方法。

final

  1. final阻止变量二次赋值
  2. 修饰的类不能被继承。
  3. 修饰的方法不能被重写。
  4. 防止指令重排序,保障多线程下的可见性

基本数据类型

byte(8bit,-128~127) short int long float double char boolean

float x = 1;
float y = 0.9f;
System.out.println(x - y);
double a = 1;
double b = 0.9;
System.out.println(a - b);

我们会发现上边两个的结果没有一个是0.1,这是因为float和double存在精度的缺失

包装器类型

自动拆箱与自动装箱

  • 自动装箱是指将基本类型自动转换成对应的包装类类型
  • 自动拆箱则是指将包装类自动转换成基本类型

例如:

Integer a = 1234; // 自动装箱
int b = a; // 自动拆箱
int c = 1234;
System.out.println(a == c); //  true 也是自动拆箱的过程

128陷阱

我们观察这一段代码,发现输出是ttft

public class Main{public static void main(String[] args){Integer a = 120;Integer b = 120;int c = 120;System.out.println(a == b);System.out.println(a == c);Integer x = 1234;Integer y = 1234;int w = 1234;System.out.println(x == y);System.out.println(x == w);}
}

运行结果:
![[Pasted image 20240326081752.png]]

先给出结论,当Integer类型的数值在[-128,127]之间时,所有的都是同一个引用,而超出这个范围的就是两个不同的引用。
再给出原理:
我们从参考资料中找到这样一句话:装箱过程实际上是通过调用包装类的valueOf方法实现的。
即:

Integer a = 123; 
等价于 
Integer b = Integer.valueOf(123);
System.out.println(a == b);// true

我们就可以查看valueOf的源码:

    public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

对这个源码的解释:当给定的参数在IntegerCache.low与IntegerCache.high之间时,我们就返回一个以及创建好的对象,否则就重新new一个对象。接着我们我们找到内部静态类IntegerCache:

    private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

我们观察源码发现,当数值范围在[-128,127]是,都是存在一个叫作cache的Integer数组中,并且创建好了数组的长度是256,也就是说我们已经new了256个对象,他们的值是从-128到127的,然后存储到cache数组中。
因此我们就得到一个结论:当Integer的范围在[-128,127]时,使用的时已经创建好的对象,是同一个对象,而超出这个范围的都是需要程序new一个对象,他们就是不同的对象,因此使用==时就会出现218陷阱。此时我们就可以使用equals来比较大小。

String

不可变性:在String中有一个final修饰的char数组,也就是说其不可以赋值,但是char数组中的值是可以变的。但是在String中没有提供任何修改其值的方法。并且String是final修饰的类,也就是不可以被其他类继承之后而去修改char的内容。
StringBuffer是线程安全的,方法都加上了synchronized,StringBuilder是线程安全的。

八大排序

  • 冒泡
int[] x = new int[]{4, 48, 98, 78, 2, 0, 3, 1, 78};
int n = x.length;
for (int i = 0; i < n; i++) {for (int j = 0; j < n - i - 1; j ++) {if (x[j] > x[j + 1]) {x[j] ^= x[j + 1];x[j + 1] ^= x[j];x[j] ^= x[j + 1];}}
}
  • 快排
public static void QuickSort(int[] arr,int start,int end){if(start<end){int index=partition(arr,start,end);QuickSort(arr,start,end-1);QuickSort(arr,end+1,end);}
}
public static int partition(int[] arr,int low,int high){//划分算法int temp=arr[low];while(low!=high){//从尾开始找到第一个比temp小的,把他移到前边while(low<high&&arr[high]>=temp){high--;}arr[low]=arr[high];//从头开始找到第一个比temp大的,放到后边while(low<high&&arr[low]<=temp){low++;}arr[high]=arr[low];}arr[low]=temp;//此时的low就是temp的最终位置return low;
}
  • 推排序

完全二叉树:下标为n的左孩子是2n+1,右孩子是2n+2(n从0开始);左右孩子的父亲都是其下标减1再除以2

  1. 完全二叉树–>大根堆
    遍历无序的数组,每次用一个数去构建完全二叉树然后将这个完全的二叉树转化为大根堆,也即当前节点大于父节点就交换数字,然后继续和其父节点比较,直至小于或者到达根节点。
  2. 大根堆–>有序数组
    将大根堆的根节点与末尾未处理的节点交换位置,然后再将除了已经处理过的节点之前的再变成大根堆,重复以上步骤

抽象类和接口

单继承多实现

Object

是所有类的父类

Object的方法

hoshcode() equals() notify() notifyAll() wait() toString()

hashcode与equals

为什么重写hashcode要重写equals?/为什么重写equals要重写hashcode/在什么情况下要重写hashcode方法。
equals是用来比较连个对象是否是同一个对象,使用equals判断出来两个对象相同时,那么他们的hashcode就一定是相同的,也就是说在进行hashtables存储时,这两个对象的存储位置是一个位置。但假设我们不重写hashcode就有肯出现我们认定相同的两个对象的hashcode的值不一样,存储在hashtables中的位置就不一样,这样就与我们的预期有了偏差。

内部类

  • 局部内部类
  • 普通内部类
  • 静态内部类
  • 匿名内部类:典型是Runnable的使用。
   Thread t1 = new Thread(() -> System.out.println("12456"), "t1");t1.start();

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

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

相关文章

mmdetection中的Spatial-Transform-Decoupling项目部署,debug记录

1.安装环境 在这之前&#xff0c;因为是新的服务器&#xff0c;很多包没有安装 安装conda&#xff0c;在root/anaconda/bin 巴拉巴拉 vim~/bash.rc 按ESC 按&#xff1a;wq 删除是Delete sudo apt install libnccl22.7.8-1cuda11.0 libnccl-dev2.7.8-1cuda11.0bug1&#xff1…

基于单片机的空调控制器的设计

摘 要 &#xff1a; 以单片机为核心的空调控制器因其体积小 、 成本低 、 功能强 、 简便易行而得到广泛应用 。 本设计通过 &#xff21;&#xff34;&#xff18;&#xff19;&#xff33;&#xff15;&#xff12; 控制&#xff24;&#xff33;&#xff11;&#xff18;&a…

matlab:对带参数a关于x的方程求解

题目 讲解 简洁对各个式子的内部含义用浅显易懂的话语总结出来了&#xff0c;耐心体会 f(a) (x)exp(x)x^ax^(sqrt(x))-100;%因为下面的fzero的第一个数需要一个fun&#xff0c;所以这里有两个句柄&#xff0c;第一个a是输入的&#xff0c;第二个x是需要被解出的 A0:0.1:2;%创…

服务器该如何抵御CC攻击

CC攻击也是分布式拒绝服务攻击的一种类型&#xff0c;同时CC攻击也属于网络流量攻击&#xff0c;但是CC攻击主要是用来攻击网站页面的&#xff0c;向着目标网络服务器发送一些请求&#xff0c;以此来消耗目标网络服务器的资源&#xff0c;导致目标服务器无法响应正常请求&#…

星光云VR全景系统源码

星光云VR全景系统源码 体验地址请查看

智能视频监控中心 - 详细介绍

目录 一、概述 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;作用 1、系统安全性 2、整体管理效率 3、数据支持决策 4、促进企业集团化和智慧城市发展 二、原理和组成 &#xff08;一&#xff09;原理 &#xff08;二&#xff09;组网图 &#xff08;…

Java与Chrome下使用Selenium进行元素定位与操作详解

摘要&#xff1a;本文将详细介绍如何利用Java语言结合Chrome浏览器使用Selenium框架进行Web自动化测试中的关键技术&#xff0c;包括元素定位、常用操作、Driver对象方法、元素等待策略以及特殊元素处理方法。 1. 简介 在当今软件开发和测试领域&#xff0c;Web自动化测试扮演…

2024年交安安全员考试题库及答案

一、单选题 111.下列关于钢筋对焊机施工安全规定&#xff0c;错误的是&#xff08;&#xff09;。 A.多台并列安装对焊机的间距不得小于lm B.钢筋对焊机应安装在室内或防雨棚内 C.现场应设可靠的接地、接零装置 D.对焊作业闪光区四周应设置挡板 答案&#xff1a;A 112.混…

【从零到一,如何搭建本地AI大模型】

摘要: 本文主要记录这一段时间对本地大模型搭建的心得。 作为一个资深程序员,在AI席卷全球的时候,深深感觉到了一丝危机感,不禁有一个想法不断在脑海闪现:我会不会真的哪一天被AI给取代了? 从哪入手 程序员出生的我,掌握了很多语言,从前端到数据库,再到运维,基本都…

Python面试题:在 Python 中,如何处理文件操作?

在Python中&#xff0c;文件操作&#xff08;如读取和写入文件&#xff09;是一个常见的任务。Python标准库提供了内置的函数和上下文管理器来简化文件操作。以下是处理文件操作的一些基本方法和示例&#xff1a; 打开和关闭文件 使用open()函数打开文件。该函数返回一个文件…

基于 Qt、FFmpeg 和 OpenGL 开发跨平台安卓实时投屏软件 QtScrcpy

文章目录 基于 Qt、FFmpeg 和 OpenGL 开发跨平台安卓实时投屏软件 QtScrcpy项目详细介绍1. 项目背景2. 功能特点3. 关键代码解读1. 引入必要的头文件和初始化函数2. VideoWidget 类的定义3. OpenGL 初始化和绘制函数4. 视频解码和渲染线程5. 主函数示例结语基于 Qt、FFmpeg 和 …

初识html——网页基础知识

Web相关术语 静态网页&#xff1a;只能浏览&#xff0c;不能实现客户端和服务器端的交流互动动态网页&#xff1a;网站页面随用户的输入而变化&#xff0c;能与客户端交流互动本地站点&#xff1a;一个在我们自己的计算机上&#xff0c;存储网站所有文件的临时文件夹远程站点&a…

一 、分布式软总线原理

分布式软总线(Distributed Soft Bus)是HarmonyOS(鸿蒙操作系统)中的关键技术之一,它负责提供设备间统一的分布式通信能力,使得不同终端设备能够像在同一台设备上一样进行高速、低延迟的数据传输和任务协同。在C++实现分布式软总线时,主要涉及以下几个核心部分: 设备发现…

【大模型】在大语言模型的璀璨星河中寻找道德的北极星

在大语言模型的璀璨星河中寻找道德的北极星 引言一、概念界定二、隐私保护的挑战2.1 数据来源的道德考量2.2 敏感信息的泄露风险 三、偏见与歧视的隐忧3.1 训练数据的偏见传递3.2 内容生成的不公倾向 四、责任归属的模糊地带4.1 生成内容的责任界定4.2 自动化决策的伦理考量 五…

【elasticsearch】IK分词器添加自定义词库,然后更新现有的索引

进入elasticsearch中的plugins位置&#xff0c;找到ik分词器插件&#xff0c;进入ik插件的config文件夹&#xff0c;当中有一个IKAnalyzer.cfg.xml配置文件。使用vim编辑器修改配置文件&#xff1a; vim IKAnalyzer.cfg.xml 配置文件如下&#xff08;添加了自定义字典的位置&…

领导有权利查看员工的电脑吗?违法吗?

在数字化办公环境中&#xff0c;企业领导是否可以查看员工的电脑成为了一个备受关注的话题。随着远程工作的普及和技术的发展&#xff0c;这个问题变得尤为复杂。 下面就由小编为大家分享关于企业领导查看员工电脑的权利范围&#xff0c;以及这种行为在何种情况下可能触犯法律…

美业SaaS系统有哪些?美业管理系统如何选?连锁美业门店收银系统源码

2024年业内较为知名、专业的美业门店管理系统软件有哪些&#xff1f;十大美业收银系统排名分享&#xff1a; 1.博弈美业 2.美务通 3.博卡 4.有赞美业 5.美管加 6.茂日软件 7.美问 8.伊智软件 9.剑琅管家 10.银豹美业 美业系统的选择取决于您的具体需求和业务规模。在选择美业系…

Windows下载安装配置并使用Redis(保姆级教程)

文章目录 1、Redis的下载与安装 2、Redis的使用 3、Redis的图形界面客户端 4、Redis开机自启动 1、Redis的下载与安装 下载Redis&#xff1a;https://pan.baidu.com/s/1zBonkO2y6AZeqCdRe0W5ow?pwd9999 提取码: 9999 下载后直接解压就可以使用了 2、Redis的使用 我们…

客户购买行为预测--Python数据分析

1、背景 客户购买行为预测是许多企业和组织所关注的一个重要问题&#xff0c;可以帮助它们更好地了解其客户的需求并制定更有效的销售和营销策略、优化产品营销等方面。 python可以通过使用各类库&#xff08;如numpy, pandas, matplotlib, scikit-learn等&#xff09;构建用于…

一文带你了解K8S组件架构

控制平面组件&#xff08;Control Plane Components&#xff09; 1. kube-apiserver 相当于一个通信部门&#xff08;秘书部&#xff09;&#xff0c;其他的部门都需要经过API进行信息的传递。 功能&#xff1a;作为Kubernetes的前端&#xff0c;提供REST API&#xff0c;处…