Java基础
前言
在这里我尽可能的整理Java学习过程的知识,希望能和学习编程的各位一起进步,如果在阅读过程发现问题的请给我留言。这是Java的学习笔记,我会尽可能把这些梳理过程变得通俗易懂,能够详略得当,方便读者的学习和复习。笔记我会不断补充更新,还请各位提出宝贵意见。
Java程序的基本结构
//1.原文件所在包,应该放在Java程序代码的第一行。
package com.study.origin;
//2.
public class Hello
{
/**
3.文档注释
*/
//4.
public static void main(String [] args)
{
//5.
System.out.println("Hello World!");
}
}
-
包名,表示该Java源代码所属的包。
-
public,访问修饰符,用于控制程序其他部分对这段代码的访问级别。
class,声明类的关键字,后跟着类名,Java所有的内容都包含在类中。
源文件名必须与使用public声明的类的名字相同,并使用.java作为扩展名。
-
文档注释,用以生成 API文档。
-
static表示方法为静态方法,void为方法返回值类型。
-
输出语句,在控制台输出字符串"Hello World"。
注释
注释类型
单行注释
//注释内容,只在本行有效
多行注释
/*
注释内容,可以跨越多行
*/
文档注释
/**
注释内容,用以提取出API文档
*/
注释作用和用法
注释会在编译过程中去除,所以可以在源程序中根据需要添加任意的注释,编译出的代码量不会因注释而增加。
/**/注释不能嵌套。
文档注释,可以用来自动生成API文档。一般文档注释第一句写概括性的句子。
javadoc命令(在命令行中使用)提取这些句子形成概要页,可以在其中使用html代码。
如果文档中有其他文件的链接,应将这些文件放在子目录doc-file中。
标识符和关键字
标识符
Java中标识符由数字、字母、下划线、和 $ 组成,且首字符不能为数字,不能为关键字和保留字,区分大小写。
不能在自己写的代码中使用 只用在Java编译器和其他工具生成的名字中。
命名规范:应该尽量使用有意义的英文单词。 包名:所有单词小写。 类名、接口名:单词首字母大写。 变量名、方法名:第一个单词首字母小写,之后单词首字母大写。 常量名:单词所有字母大写,单词之间用下划线连结。
关键字
50个关键字,48个可用,2个保留字goto、const。
数据类型 | 流程控制 | 权限修饰符 | 能修饰类/函数/变量 | 类的关系 | 对象实例 | 异常处理 | 包 | 数据类型字面量 | 其他 |
---|---|---|---|---|---|---|---|---|---|
byte | if | private | abstract | extends | new | try | package | true | native |
short | else | protect | final | implements | this | catch | import | false | stricfp |
int | switch | (默认) | static | super | finally | null | transient | ||
long | case | public | synchronized | instanceof | throw | volatile | |||
float | default | throws | assert | ||||||
double | while | ||||||||
char | do | ||||||||
boolean | for | ||||||||
void | break | ||||||||
class | continue | ||||||||
interface | return | ||||||||
enum |
数据类型
Java一共有8种基本数据类型,4种整数类型(byte、short、int、long),两种浮点数型(float、double),一种用以表示Unicode字符集的字符类型(char),一种用以表示真值boolean类型。
Java中基本数据类型的范围与内存大小与运行Java的机器无关,Java么有任何无符号的整数和浮点数类型。
整型
整数类型中,int类型最为常用,当然也要依据使用的场景选择相应范围的整数类型。byte和short类型主要用于底层文件处理或者需要控制占用存储空间量大的数组。
long类型字面量有后缀L或者l,一般使用L,易于区分。
浮点数类型
浮点数类型中,一般常用double,因为很对情况下float精度很难满足要求,当然还是要根据数据的精度选择数据类型。
float类型数值有一个后缀F或f,没有加后缀默认为double类型。double类型的后缀为d或D。
在使用浮点数计算时,超过精度就会引起误差或者错误。而且二进制系统中无法精确计算时无法表示十进制的1/10,所以在进行一些计算时或者进行浮点数值比较时容易出错。
数值计算中如果不允许有任何舍入误差,就应该使用BigDecimal类。
在数值计算中,一个正整数除0的结果为正无穷大,计算0/0或负数的平方根结果为NaN。
Double类型有三个用于表示浮点数溢出或计算出错情况下的数值。
public static final double POSITIVE_INFINITY = 1.0 / 0.0; //正无穷 public static final double NEGATIVE_INFINITY = -1.0 / 0.0; //负无穷 public static final double NaN = 0.0d / 0.0; //NaN非数值,不能进行比较,NaN和NaN以及数值都不相等
char类型
char类型总共2个字节,共16位,由于采用Unicode字符,所以有些字符会需要占用两给char值。
char类型的字面量用单引号括起,char类型的值可以表示为16进制,值的范围为\u0000-\uffff。
表示特殊字符的转义序列。
unicode转义序列会在解析代码之前处理成代表的字符。
JavaSE 5.0开始,码点是一个编码表中某个字符对应的代码值。在Unicode标准中码点采用16进制书写,并加前缀U+。
unicode的码点分为17个代码级别,第一个代码级别称为基本的多语言级别,码点从U+10000到U+10FFFF,其中包括一些辅助字符。
Unicode是一种编码机制,其中该机制具体实现有UTF-8、UTF-16。UTF-16编码采用不同长度的编码表示所有Unicode码点。
在基本的多语言级别中,每个字符用16位表示,称为代码单元,Java中char类型描述了UTF-16编码中的一个代码单元。
除非必要,一般不用char类型,而使用String类型处理字符串。
boolean类型
boolean类型有两个值,false和true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。
进制数
16进制的数有前缀0x或0X,8进制的数有前缀0,8进制容易与二进制的数混淆,一般不使用。
Java7开始,可以使用二进制数,加前缀0b或0B。并且可以为数字字面量加下划线,例如:100_000。编译器会去除这些下划线。
16进制浮点数,用p表示指数,尾数采用16进制,指数采用10进制。
变量和常量
变量
Java中每个变量都有一个类型,在声明变量时,变量的类型位于变量名之前。
声明变量后,必须使用赋值语句对变量进行显示初始化,不能使用未初始化的变量。
未初始化时,不同类型变量默认初始化为 整型:0、浮点型:0.0、char: 0 或\u0000、引用数据类型:null。
这种没人初始化的情况只在类变量中,在方法中的变量不会进行默认初始化。
常量
Java中,使用final关键字表示常量。
final表示这个变量只能被赋值一次,赋值后,就不能更改变量值。
public static final variable = value;
运算符
算术运算符:
+ - * / %
//a为整数
a % b = a - a / b * b;
//当a为小数
a % b = a - (int) a / b * b; //得到的是近似值
赋值运算符:
= += -= *= /= %=
自增自减:
(前)++ (后)++ (前)-- (后)--
int i = 1;
i = i++;
//i = 1;这种计算会引入一个临时变量存储i的值,因为i++是在赋值运算过程中进行的。
//(1)temp = i;(2) i = i + 1;(3) i = temp;
比较预算符:
== != > < >= <= instanceof(判断某个对象是否为某个类的实例)
逻辑运算符:
& &&(短路与) | ||(短路或) ! ^
&&优先级比||高。
位运算符:
<< >> >>> & | ^ ~
移位操作符的右操作数要完成模相应类型位数的运算。
符号移位运算,会用符号位填充高位。
>>:带符号右移。正数右移高位补0,负数右移高位补1。
>>>:无符号右移。无论是正数还是负数,高位通通补0。
三元运算符:
(运算时表达式1和2类型要相同,计算时存在类型转换。)
(条件表达式)? 表达式1 : 表达式2(真为1,假为2)
运算符优先级
运算符 | 结合性 |
---|---|
[] . ()(方法调用) | -> |
! ~ ++ -- - (强制类型转换) new | <- |
* / % | -> |
+ - | -> |
<< >> >>> | -> |
< <= > >= instanceof | -> |
== !=- | -> |
& | -> |
^ | -> |
| | -> |
&& | -> |
|| | -> |
?: | <- |
= += -= *= /= %= &= |= ^= <<= >>= >>>= | <- |
类型转换
类型转换范围小的转为大的类型不会有问题,反之会出现溢出问题。在进行二元操作时,要先将数据转换为同一类型,再计算。
自动类型转换
实线箭头表示无信息丢失转换,虚线箭头表示可能有精度损失的转换。
当有超过int的类型时,转化为表示数范围最大的类型,否则操作数都转化为int类型。当byte、char、short三种类型的变量做运算时,结果为int类型。
String的连结运算,+在前,结果自动转化成String类型;String转换为基本数据类型使用包装类的parseXXX方法。
如果没有后缀,整型字面量默认为int类型,浮点型字面量默认为double类型。所以在进行字面量计算时要注意类型转换的问题。
//Type mismatch: cannot convert from double to float float i = 3.0;
强制类型转换
形式:(type)data
强制类型转换只涉及7种基本数据类型,可能导致精度损失。
结合赋值运算符,运算值类型与左侧操作数的类型不同,就会发生强制类型转换。例如:x += 3.5; (int)(x+3.5)
强制类型转换通过截断小数部分将浮点值转换为整型。如果想进行舍入转换,可以使用Math.round方法。
double x = 3.14; int xPi = (int) Math.round(x);//round方法返回值为long类型
控制流程
分支结构
if (condition) statement else statement1
当条件condition为真时执行statement语句,否则执行,else后的语句。如果有多条语句要执行,就使用{}包含多个语句。
else与最近的if配对,配对的if-else是是一个语句块。
分支嵌套最好不要超过三层。
Size sz = ...; switch (sz) { case SMALL: ... break; ... default: ... break; }
switch语句从与选项值匹配的case标签处开始执行,知道遇到break语句,或者执行到switch语句的结束处。如果没有匹配的case标签,而有default子句,就执行这个语句。
case标签可以是:char byte short int的常量表达式、枚举常量、字符串字面量(jdk7);case后的值只能为常量或表达式不能为变量。
如果case分支语句的末尾没有break语句,那么就会执行下一个case分支语句。巧妙利用switch的穿透现象。
switch语句中使用枚举常量时,不必在每个标签中指明枚举名,可以由switch语句表达式确定。
循环结构
while (condition) statement do statement while (condition);
while循环首先检测循环条件,如果循环条件为false,则while循环体中语句就不会执行。
如果希望循环体中的代码至少执行一次,就可以使用do-while循环。
for(int i; i <= num; i++) { statement } for(variable:collection) { statement }
第一种循环为for循环,第一部分通常用于对计数器初始化,第2部分给出每新一轮循环执行前要检测的循环条件。第3部分给出如何更新技术器的语句。
循环内部定义的变量不能在外部使用,for循环在第一部分定义的变量,作用域位整个循环体。
第二种循环是foreach循环,定义一个变量用于暂存集合中的每个元素,然后执行相应语句。这个集合必须是一个数组或者是实现了Iterable接口的类对象。该循环会依次遍历collection中的元素,并执行相应的语句。
跳转语句
break、continue
break后可以带标签,可以跳转至标签位置,标签定义( label:)**,只能跳出语句块。
标签必须放在希望跳出的最外层循环之前,并且紧跟一个冒号,只能跳出语句块,不能跳入语句块;通过执行带标签的break跳转到带标签的语句块末尾,用于跳出多重嵌套循环。
continue跳过循环体当前剩余部分,continue后可以接标签。
数组
数组是多个类型相同数据的组合,实现对这些数据的统一管理。
声明数组
type [] arrayName;
初始化
type [] variableName = new int[] {······};(简写type [] variableName={···}; )
type [] variableName = new type [length];(扩容的一种手段)
数组元素:整型初始化为0,浮点型初始化为0.0,布尔型初始化为false,char类型初始化为\u0000,引用类型初始化为null。
属性:
length:数组的长度。(array index out of bounds数组下标越界异常)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异