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;%创…

星光云VR全景系统源码

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

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

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

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

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

初识html——网页基础知识

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

【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;处…

Function Call ReACT,Agent应用落地的加速器_qwen的function calling和react有什么不同

探索智能体Agent的未来之路&#xff1a;Function Call与ReACT框架的较量&#xff0c;谁能引领未来&#xff1f; 引言 各大平台出现智能体应用创建&#xff0c;智能体逐渐落地&#xff0c;背后的使用哪种框架&#xff1f; 随着各大平台&#xff0c;例如百度千帆APPbuilder、阿…

jenkins搭建部署前端工程 ,从0到1

一.java环境配置 1 安装tomcatjdk17 这个也行 3 安装maven3.3.9 安装教程参考 4 安装Jenkins 下载地址 参考教程 二、相关配置 1 访问http://localhost:8080/jenkins&#xff0c;进入Jenkins初始化页面&#xff0c;第一次启动时间可能有点长&#xff0c;耐心等待。进入成功后会…

【Python】各种运行符及其运用实例

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言什么是运算符&#xff1f;算术运算符实例 比较运算符实例 赋值运算符实例 逻辑运算符实例 位运算符实例 成员运算符实例 身份运算符实例 运算符优先级实例 前言 关于九种数据…

娱乐圈幕后揭秘孙俪天选打工人

【娱乐圈幕后揭秘&#xff1a;孙俪“天选打工人”背后的热议风暴】在聚光灯下光鲜亮丽的娱乐圈&#xff0c;每一位明星的日常备受瞩目。近日&#xff0c;实力派演员孙俪在社交媒体上分享了一段片场棚拍的趣事&#xff0c;本是无心之举&#xff0c;意外引爆了网络热议的导火索。…

鸿蒙小练习

bean对象 export class BannerImage{id:numberurl:stringtargetUrl:stringproductId:numberconstructor(id: number, url: string, targetUrl: string, productId: number) {this.id idthis.url urlthis.targetUrl targetUrlthis.productId productId} }export class d…

YOLO之boxes小记

import cv2 from ultralytics import YOLO # 加载模型 model YOLO(modelyolov8n.pt) results model(sourceanimal.jpg)result results[0] img result.plot() from matplotlib import pyplot as plt # matplotlib :rgb模式 # cv:bgr模式 plt.imshow(Ximg[:,:,::-1])result.b…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【加密导入密钥(C/C++)】

加密导入密钥(C/C) 以加密导入ECDH密钥对为例&#xff0c;涉及业务侧加密密钥的[密钥生成]、[协商]等操作不在本示例中体现。 具体的场景介绍及支持的算法规格。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 设备A&#xf…