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.rhkb.cn/news/372402.html

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

相关文章

[AI 大模型] Google Gemini

文章目录 [AI 大模型] Gemini简介模型架构发展新技术和优势示例 [AI 大模型] Gemini 简介 Google Gemini 是 Google 最新推出的多模态 AI 大模型&#xff0c;旨在提升 AI 在各个领域的应用能力。Gemini 能够处理文本、图像、音频、视频和代码等多种数据类型&#xff0c;展现出…

暑期备考2024小学生古诗文大会:吃透真题和知识点(持续)

2024年上海市小学生古诗文大会的自由报名初赛将于10月19日&#xff08;星期六&#xff09;正式开始&#xff0c;还有3个多月的时间。 为帮助孩子们备考&#xff0c;我持续分享往年上海小学生古诗文大会真题&#xff0c;这些题目来自我去重、合并后的1700在线题库&#xff0c;每…

云计算渲染时代:选择Blender或KeyShot进行高效渲染

在云渲染技术日益成熟的背景下&#xff0c;挑选一款贴合项目需求的3D渲染软件显得尤为关键。当前&#xff0c;Blender与KeyShot作为业界领先的全能渲染解决方案&#xff0c;广受推崇。它们虽皆能创造出令人信服的逼真视觉效果&#xff0c;但在特色功能上各有所长。本篇文章旨在…

稀疏建模介绍,详解机器学习知识

目录 一、什么是机器学习&#xff1f;二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习&#xff1f; 机器学习是一种人工智能技术&#xff0c;它使计算机系统能够从数据中学习并做出预测或决策&#xff0c;而无需明确编程。它涉及到使用算…

华为HCIP Datacom H12-821 卷30

1.单选题 以下关于OSPF协议报文说法错误的是? A、OSPF报文采用UDP报文封装并且端口号是89 B、OSPF所有报文的头部格式相同 C、OSPF协议使用五种报文完成路由信息的传递 D、OSPF所有报文头部都携带了Router-ID字段 正确答案&#xff1a;A 解析&#xff1a; OSPF用IP报…

游戏AI的创造思路-技术基础-决策树(1)

决策树&#xff0c;是每个游戏人必须要掌握的游戏AI构建技术&#xff0c;难度小&#xff0c;速度快&#xff0c;结果直观&#xff0c;本篇将对决策树进行小小解读~~~~ 目录 1. 定义 2. 发展历史 3. 决策树的算法公式和函数 3.1. 信息增益&#xff08;Information Gain&…

无线网卡怎么连接台式电脑?让上网更便捷!

随着无线网络的普及&#xff0c;越来越多的台式电脑用户希望通过无线网卡连接到互联网。无线网卡为台式电脑提供了无线连接的便利性&#xff0c;避免了有线网络的束缚。本文将详细介绍无线网卡怎么连接台式电脑的四种方法&#xff0c;包括使用USB无线网卡、内置无线网卡以及使用…

终于搞定了通过两路蓝牙接收数据

一直想做无线传感器&#xff0c;通过蓝牙来接收数据&#xff0c;无奈因为arduino接收串口数据的一些问题&#xff0c;一直搁到现在。因为学校里给学生开了选修课&#xff0c;所以手边有一些nano和mega可以使用&#xff0c;所以就做了用两个nano加上两个蓝牙模块来发射数据&…

群体优化算法---文化算法介绍,求解背包问题

介绍 文化算法&#xff08;Cultural Algorithm, CA&#xff09;是一种基于文化进化理论的优化算法&#xff0c;首次由Robert G. Reynolds在20世纪90年代提出。文化算法通过模拟人类社会中的文化进化过程&#xff0c;利用个体与群体的双重进化机制来解决优化问题。其基本思想是…

动态数据库设计

动态数据库设计是一种灵活的方法&#xff0c;用于构建能够适应不断变化的数据需求的数据库结构。它强调在不频繁修改数据库表结构的前提下&#xff0c;有效管理和存储多样化的数据。以下是实现动态数据库设计的一些关键技术点和策略&#xff1a; 实体-属性-值&#xff08;EAV&a…

Java的面向对象基础

叠甲&#xff1a;以下文章主要是依靠我的实际编码学习中总结出来的经验之谈&#xff0c;求逻辑自洽&#xff0c;不能百分百保证正确&#xff0c;有错误、未定义、不合适的内容请尽情指出&#xff01; 文章目录 1.面向过程和面向对象2.访问限定符3.类和对象基础3.1.类的定义3.2.…

【安全设备】下一代防火墙

一、什么是防火墙 防火墙是一个网络安全产品&#xff0c;它是由软件和硬件设备组合而成&#xff0c;在内网和外网之间、专用网与公共网之间的一种保护屏障。在计算机网络的内网和外网之间构建一道相对隔离的保护屏障&#xff0c;以达到保护资料的目的。它是一种隔离技术&#…

Qt 线程 QThread类详解

Qt 线程中QThread的使用 在进行桌面应用程序开发的时候&#xff0c; 假设应用程序在某些情况下需要处理比较复杂的逻辑&#xff0c; 如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个…

【操作系统】进程管理——进程的同步与互斥(个人笔记)

学习日期&#xff1a;2024.7.8 内容摘要&#xff1a;进程同步/互斥的概念和意义&#xff0c;基于软/硬件的实现方法 进程同步与互斥的概念和意义 为什么要有进程同步机制&#xff1f; 回顾&#xff1a;在《进程管理》第一章中&#xff0c;我们学习了进程具有异步性的特征&am…

如何安全隐藏IP地址,防止网络攻击?

当您想在互联网上保持隐私或匿名时&#xff0c;您应该做的第一件事就是隐藏您的 IP 地址。您的 IP 地址很容易被追踪到您&#xff0c;并被用来了解您的位置。下面的文章将教您如何隐藏自己&#xff0c;不让任何试图跟踪您的活动的人发现。 什么是 IP 地址&#xff1f; 首先&am…

JavaWeb系列二十一: 数据交换和异步请求(JSON, Ajax)

文章目录 官方文档JSON介绍JSON快速入门JSON对象和字符串对象转换应用案例注意事项和细节 JSON在java中使用说明JSON在Java中应用场景应用实例1.3.3 Map对象和JSON字符串转换 2. Ajax介绍2.1 Ajax应用场景2.2 传统的web应用-数据通信方式2.3 Ajax-数据通信方式2.4 Ajax文档使用…

百度云智能媒体内容分析一体机(MCA)建设

导读 &#xff1a;本文主要介绍了百度智能云MCA产品的概念和应用。 媒体信息海量且复杂&#xff0c;采用人工的方式对视频进行分析处理&#xff0c;面临着效率低、成本高的困难。于是&#xff0c;MCA应运而生。它基于百度自研的视觉AI、ASR、NLP技术&#xff0c;为用户提供音视…

标准盒模型和怪异盒子模型的区别

盒模型描述了一个 HTML 元素所占用的空间&#xff0c;由内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;和外边距&#xff08;margin&#xff09;组成。 可以通过修改元素的box-sizing属性来改变元素的盒模型…

idea 默认路径修改

1.查看 idea 的安装路径&#xff08;右键点击 idea 图标&#xff0c;查看路径 &#xff09; “C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1\bin\idea64.exe” 在 bin 目录查看 idea.properties 文件&#xff0c;修改以下四个路径文件 # idea.config.path${user.home}/…

【matlab】李雅普诺夫稳定性分析

目录 引言 一、基本概念 二、李雅普诺夫稳定性分析方法 1. 第一方法&#xff08;间接法&#xff09; 2. 第二方法&#xff08;直接法&#xff09; 三、应用与发展 matalb代码 对称矩阵的定号性(正定性)的判定 线性定常连续系统的李雅普诺夫稳定性 线性定常离散系统的李雅普诺夫…