✨✨个人主页:沫洺的主页
📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏
📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏
📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏
💖💖如果文章对你有所帮助请留下三连✨✨
🍁注释
注释分为:单行注释、多行注释、文档注释
/** * 这是文档注释,可以写文档信息 * @author moming * javac -d . Notes.java */ public class Notes { public static void main(String[] args) { //这是单行注释,用两个左斜杠表示 /* 这是多行注释 用左斜杠星号和星号左斜杠表示 */ } }
文档注释,主要依赖于javadoc.exe,提取java源代码文件中的注解结构,生成html-api 参考文件
怎么生成api参考文件可以看这里:
🍂关键字、标志符
标识符
标识符(identifier)是指用来标识某个实体的一个符号,在不同的应用环境下有不同的含义。在计算机编程语言中,标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立 起名称与使用之间的关系。
标识符是由字母 数字 下滑线 $组成的,不能数字开头,不能使用空格和特殊的符号。
关键字
Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。在Java中目前一共有53个关键字:其中由51+2个保留字=53个关键字。
具体每个关键字的解释可以参考以下内容:
Java中的关键字_沫洺的博客-CSDN博客
💐变量、常量
变量
变量:是指值在程序运行期间可以被改变的量。变量用于储存信息。它指向内存的某个单元,而且指明了这块内存有多大。java是强类型,局部变量必须先声明初始化才可以使用。java程序中,变量名是区分大小写。
推断变量:var
Java中var是Java10版本新出的特性,用它来定义局部变量。 使用var 定义变量的语法: var 变量名 = 初始值;
var不是关键字,它不是固定的,它是一种动态类型,它会根据所赋的值来转换自生类型
var声明变量的注意事项: 1,var只能在方法内定义变量,不允许定义类的成员变量。 2,var 定义变量【必须】赋初始值,以后不能在赋初始值,不赋值无法判断类型。 3,var每次只能定义一个变量,不能复合声明变量。
常量
指在程序执行期间其值不能发生变化的数据。例如数学中的π= 3.1415……又如:整数123,小数1.23,字符’A’,布尔常量 true、false等,程序开发中,常量名一般规则全部大写,声明常量时必须赋值,以后只能使用,不能再赋值,java语言声明常量使用final修饰。
在开发领域常量一般都要求全大写
常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。
🌺数据类型、类型转换
数据类型分为基本数据类型(8种)和引用数据类型(对象 类 接口 数组)
为什么Java里有基本数据类型和引用数据类型?
引用类型在堆里,基本类型在栈里。
栈空间小且连续,往往会被放在缓存。引用类型cache miss率高且要多一次解引用。
对象还要再多储存一个对象头,对基本数据类型来说空间浪费率太高
基本数据类型
byte short int long float double char boolean (8大类型)
类型名称 关键字 字节数 范围 整数 字节型 byte 1 -128 ~ 127 短整型 short 2 -32768 ~ 32767 整形 int 4 -2147483648 ~ 2147483647 长整型 long 8 -2的63次方 ~ 2的63次方-1 浮点数 单精度 float 4 1.4e-45f ~ 3.4e+38f 双精度 double 8 4.9e-324 ~ 1.8e+308 布尔型 boolean 1 true或false 字符型 char 2 引用数据类型(对象 类 接口 数组)
对象
对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。
类
具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
类和对象的关系
对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:
声明:声明一个对象,包括对象名称和对象类型。
实例化:使用关键字new来创建一个对象。
初始化:使用new创建对象时,会调用构造方法初始化对象。
package moming; public class Student { //名为Student的类 public Student() { //这是一个无参构造方法 } public Student(String name) { //这是一个有参构造方法 System.out.println(name); //输出语句 } public static void main(String[] args) { //main方法 Student stu = new Student("张三"); /*声明对象,对象类型为Student 对象名称为stu 通过new实例化Student这个类 并调用了有参构造,对参数进行初始化*/ } }
数组
数组(array)是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。
定义数组两种方式
第一种方式:类型[] 数组名; 如 int[] nums;
第二种方式:类型数组名[]; 如 int nums[];
大多数Java程序员喜欢使用第一种风格,因为它把数据类型int[],和变量名num分开了.
数组的初始化
Java中数组必先初始化后才能使用.
初始化就是给数组元素分配内存,并为每个元素赋初始值。
初始化数组的两种方式:
- 静态初始化:
语法格式:类型[] 数组名 = new 数组类型[]{元素1,元素2,元素3,...元素n};
简化语法:类型[] 数组名 = {元素1,元素2,元素3...元素n};
- 动态初始化:
如果我们事先不知道数组里存储哪些数据,只知道需要存储数据的个数,此时可以使用动态初始化方式。
动态初始化:初始化时由我们指定数组的长度,系统自动为数组元素分配初始值。
格式:类型[] 数组名 = new 数组类型[数组长度];
注意:无论,以哪种方式初始化数组,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。也就是说数组是定长的。接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法
用interface关键字定义接口(注意类是用Class定义的,区分开),一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现,这一点和抽象类是不一样的。接口是更高级别的抽象。类可以实现多个接口。
public interface 接口名称{ //可以定义常量 //方法只有方法声明,而且是公共的(public)。 public void 方法名称(); ... }
类要实现接口,只需要使用implements关键字,实现类必须要实现接口中的所有的方法
public class 实现类名 implements 接口{ //实现接口的方法(方法重写) }
类型转换
基本数据类型由小到大(byte,short,char)--int--long--float--double
对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用强制类型转换
隐式转换(自动类型转换)低级到高级
上面所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。
short s=10; int i=s; //将short类型的变量向int类型的变量 //赋值时,(从小到大)实现了自动转换
char c='A'; //A的ASCII码值为65 int i=c; //这时会将'A' 对应的ASCII码值赋值给i
显式转换(强制类型转换)高级到低级
强制类型转换可能造成数据(丢失)溢出;
1、float型转换为double型:
float f1=100.00f; Float F1=new Float(f1); //F1.doubleValue()为Float类的返回double值型的方法 double d1=F1.doubleValue();
2、double型转换为int型:
double d1=100.00; Double D1=new Double(d1); int i1=D1.intValue();
3、int型转换为double型:
int i1=200; double d1=i1;
其它类型向字符串的转换
int number = 10; //通过包装类调用toString方法 String age = Integer.toString(number); //利用字符串拼接的方法 String age1 = number+""; //使用String中的valueOf方法 String age2 = String.valueOf(number);
字符串作为值,向其它类型的转换
静态parseXXX方法
String s = "1"; byte b = Byte.parseByte( s ); short t = Short.parseShort( s ); int i = Integer.parseInt( s ); long l = Long.parseLong( s ); Float f = Float.parseFloat( s ); Double d = Double.parseDouble( s );
当然还有其他类型转换,这里就不一一列举了
🍃运算符表达式
运算符:是一种特殊符号,用以表示数据的运算、赋值和比较。表达式:使用运算符将运算数据连接起来的符合Java语法规则的式子。
算术运算符:+ - * / % ++ --
算数运算符 | 运算 |
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
++ | 自身加1 |
-- | 自身减1 |
赋值运算符 | 运算 | 范例 | 结果 |
= | 赋值 | a=3;b=2; | a=3;b=2; |
+= | 加等于 | a=3;b=2;a+=b; | a=5;b=2; |
-= | 减等于 | a=3;b=2;a-=b; | a=1;b=2; |
*= | 乘等于 | a=3;b=2;a*=b; | a=6;b=2; |
/= | 除等于 | a=3;b=2;a/=b; | a=1;b=2; |
%= | 模等于 | a=3;b=2;a%=b; | a=1;b=2; |
比较运算符:== != > >= < <= instanceof
比较运算符 | 运算 | 范例 | 结果 |
== | 相等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
> | 大于 | 4>3 | true |
< | 小于 | 4<3 | false |
>= | 大于等于 | 4>=3 | true |
<= | 小于等于 | 4<=3 | false |
instanceof | 检查是否是类的对象 | "hello" instanceof String | true |
逻辑运算符 | 运算 | 范例 | 结果 |
& | 与 | false&true | false |
&& | 短路与 | false&&true | false |
| | 或 | false|true | true |
|| | 短路或 | false||true | true |
! | 非 | !true | false |
^ | 异或 | true^false | true |
位运算符 | 运算 | 示例 |
| | 或运算 | 6&3=2 |
& | 与运算 | 6|3=7 |
^ | 异或运算 | 6^3=5 |
~ | 反码 | ~6=-7 |
<< | 左移 | 3<<2=12 (3*2*2=12) |
>> | 右移 | 3>>2=1 (3/2=1) |
>>> | 无符号右移 | 3>>>1=1 (3/2=1) |
🌾格式化
- System.out.printf();String.format();
- DecimalFormat
- SimpleDateFormat
- NumberFormat
format(Locale locale, String format, Object... args) 使用指定的语言环境,制定字符串格式和参数
生成格式化的字符串。
显示不同转换符实现不同数据类型到字符串的转换,如下表:
转换符 | 说明 | 示例 |
%s | 字符串类型 | "abc" |
%c | 字符类型 | 'a' |
%b | 布尔类型 | true |
%d | 整数类型(十进制) | 123 |
%x | 整数类型(十六进制) | FF |
%o | 整数类型(八进制) | 77 |
%f | 浮点类型 | 99.99 |
%a | 十六进制浮点类型 | FF.35AE |
%e | 指数类型 | 9.38e+5 |
%g | 通用浮点类型(f和e类型中较短的) | |
%h | 散列码 | |
%% | 百分比类型 | % |
%n | 换行符 | |
%tx | 日期与时间类型(x代表不同的日期与时间转换符) |
搭配转换符的标志,如下表:
标志 | 说明 | 示例 |
+ | 为正数或者负数添加符号 | ("%+d",15) |
- | 左对齐(指定区域内) | ("%-5d",15) |
0 | 数字前面补0 | ("%04d",99) |
空格 | 在整数之前添加指定数量的空格 | ("% 4d",99) |
, | 以“,”对数字分组 | ("%,f",9999.99) |
( | 使用括号包含负数 | ("%(f",-99.99) |
# | 如果是浮点数则包含小数点,如果是16进制或8进制则添加0x或0 | ("%#x",99) ("%#o",99) |
< | 格式化前一个转换符所描述的参数 | ("%f和%<3.2f",99.45) |
$ | 被格式化的参数索引 | ("%1$d,%2$s",99,"abc") |
package moming;
public class Format {
public static void main(String[] args) {
System.out.printf("%+d%n",15);
System.out.printf("%-5d%n",15);
System.out.printf("%04d%n",99);
System.out.printf("% 4d%n",99);
System.out.printf("%,f%n",9999.99);
System.out.printf("%(f%n",-99.99);
System.out.printf("%#x%n",99);
System.out.printf("%#o%n",99);
System.out.printf("%f和%<3.2f%n",99.45);
System.out.printf("%1$d,%2$s%n",99,"abc");
}
}
运行结果
+15
15
0099
99
9,999.990000
(99.990000)
0x63
0143
99.450000和99.45
99,abc
常见日期和时间组合的格式,如下表:
转换符 | 说明 | 示例 |
c | 包括全部日期和时间信息 | 周二 8月 02 14:21:20 CST 2022 |
F | “年-月-日”格式 | 2022-08-02 |
D | “月/日/年”格式 | 08/02/22 |
r | “HH:MM:SS PM”格式(12时制) | 19:29:51 下午 |
T | “HH:MM:SS”格式(24时制) | 14:21:20 |
R | “HH:MM”格式(24时制) | 14:21 |
package moming;
import java.util.Date;
public class Time {
public static void main(String[] args) {
System.out.printf("%tc%n",new Date());
System.out.printf("%tF%n",new Date());
System.out.printf("%tD%n",new Date());
System.out.printf("%tr%n",new Date());
System.out.printf("%tT%n",new Date());
System.out.printf("%tR%n",new Date());
}
}
运行结果
周二 8月 02 19:42:15 CST 2022
2022-08-02
08/02/22
07:42:15 下午
19:42:15
19:42
转换符 | 说明 | 示例 |
H | 2位数字24时制的小时(不足2位前面补0) | 15 |
I(大写i) | 2位数字12时制的小时(不足2位前面补0) | 03 |
k | 2位数字24时制的小时(前面不补0) | 15 |
l(小写L) | 2位数字12时制的小时(前面不补0) | 3 |
M | 2位数字的分钟(不足2位前面补0) | 03 |
S | 2位数字的秒(不足2位前面补0) | 09 |
L | 3位数字的毫秒(不足3位前面补0) | 015 |
N | 9位数字的毫秒数(不足9位前面补0) | 562000000 |
p | 小写字母的上午或下午标记 | 中:下午 英:pm |
z | 相对于GMT的RFC822时区的偏移量 | +0800 |
Z | 时区缩写字符串 | CST |
s | 1970-1-1 00:00:00 到现在所经过的秒数 | 1193468128 |
Q | 1970-1-1 00:00:00 到现在所经过的毫秒数 | 1193468128984 |
package moming;
import java.util.Date;
public class Time {
public static void main(String[] args) {
System.out.printf("%tH%n",new Date());
System.out.printf("%tI%n",new Date());
System.out.printf("%tk%n",new Date());
System.out.printf("%tl%n",new Date());
System.out.printf("%tM%n",new Date());
System.out.printf("%tS%n",new Date());
System.out.printf("%tL%n",new Date());
System.out.printf("%tN%n",new Date());
System.out.printf("%tp%n",new Date());
System.out.printf("%tz%n",new Date());
System.out.printf("%tZ%n",new Date());
System.out.printf("%ts%n",new Date());
System.out.printf("%tQ%n",new Date());
}
}
运行结果
19
07
19
7
45
07
805
805000000
下午
+0800
CST
1659440707
1659440707820
字母 | 日期或时间元素 | 表示 | 示例 |
G | Era标志符 | Text | AD |
y | 年 | Year | 2022;22 |
M | 年中的月份 | Month | July;Jul;07 |
w | 年中的周数 | Number | 27 |
W | 月中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday;Tue |
a | am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数 (1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time;PST;GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
package moming;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Dome1 {
public static void main(String[] args) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("GG ww WW DD FF EE aa");
SimpleDateFormat sdf3 = new SimpleDateFormat("kk KK hh SS zz ZZ");
Date d = new Date();
System.out.println(sdf1.format(d));
System.out.println(sdf2.format(d));
System.out.println(sdf3.format(d));
}
}
2022-08-02 20:11:09
公元 32 01 214 01 周二 下午
20 08 08 182 CST +0800