一、注释
注释:注释是一个重要的工具,用于向代码的阅读者(包括程序员自己和其他团队成员)提供关于代码功能、目的、工作方式或其他重要信息的说明。Java编译器会忽略注释,因此它们不会影响代码的执行。
Java提供了三种类型的注释:单行注释、多行注释和文档注释。
1.1、单行注释
单行注释以 //
开头,以换行
结束,格式如下:
//注释内容
1.2、多行注释
多行注释以 /*
开头,以*/
结束,格式如下:
/*
注释内容
*/
1.3、文档注释(也称为JavaDoc注释)
使用/**
开始,并使用*/
结束。这种注释主要用于生成API文档,通过javadoc工具可以自动从这种注释中生成HTML格式的文档。
/**
注释内容
*/
1.4、一般使用位置
//单行注释
/*
多行注释
*/
/**
文档注释演示
@author zjh
*/
public class Demo{
/**
Java程序的入口
@param String[] args main方法的命令参数
*/
public static void main(String[] args){
System.out.println("hello");
}
}
1.5、文档注释常见注释
@author 标明开发该类模块的作者,多个作者之间使用,分割
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@since 从哪个版本开始增加的
@param 对方法中某参数的说明,如果没有参数就不能写
@return 对方法返回值的说明,如果方法的返回值类型是void就不能写
@throws/@exception 对方法可能抛出的异常进行说明 ,如果方法没有用throws显式抛出的异常就不能写
其中 @param、@return 和 @exception 这三个标记都是只用于 方法 的。
@param的格式要求:@param 形参名 形参类型 形参说明
@return 的格式要求:@return 返回值类型 返回值说明
@exception 的格式要求:@exception 异常类型 异常说明
@param和@exception可以并列多个
二、标识符
标识符:标识符(Identifier)是用来给变量、类、方法、包等命名的符号。这些标识符必须遵循一定的规则,以便Java编译器能够正确解析和识别它们。
2.1、规则:
字母数字字符:标识符可以由字母(A-Z 或 a-z)、数字(0-9)、美元符号($)或下划线(_)组成。注意,标识符不能以数字开头。
区分大小写:Java是大小写敏感的,所以
myVar
和myvar
会被视为两个不同的标识符。长度限制:在理论上,Java标识符的长度没有限制,但实际上受限于具体编译器和运行环境的实现。
不能是Java关键字:标识符不能与Java的关键字相同。例如,你不能将变量命名为
class
、public
、for
等,因为这些是Java语言的保留字。规范命名:虽然Java不强制要求特定的命名规范,但通常遵循一定的命名约定可以提高代码的可读性。例如,类名通常以大写字母开头(遵循驼峰命名法),变量和方法名则以小写字母开头,后续单词的首字母大写。
Unicode字符:从Java 1.5开始,标识符中可以包含任何Unicode字符,只要它们可以通过转义序列或Unicode转义序列来表示。但是,为了代码的可读性和可维护性,通常建议只使用ASCII字符集中的字母、数字、美元符号和下划线来构成标识符。
2.2、命名规范:
见名知意
类名、接口名等:每个单词的首字母都大写,形式:XxxYyyZzz,
例如:HelloWorld,String,System等
变量、方法名等:从第二个单词开始首字母大写,其余字母小写,形式:xxxYyyZzz,
例如:age,name,bookName,main
包名等:每一个单词都小写,单词之间使用点.分割,形式:xxx.yyy.zzz,
例如:java.lang
常量名等:每一个单词都大写,单词之间使用下划线_分割,形式:XXX_YYY_ZZZ,
例如:MAX_VALUE,PI
三、关键字
关键字(Keywords):关键字是具有特殊含义的标识符,它们被Java语言本身预定义并赋予了特定的含义。这些关键字不能用作变量名、方法名、类名、包名或其他用户自定义的标识符。
Java关键字主要用于控制流语句、类定义、方法定义、数据访问修饰符、错误处理等方面。
控制流语句:
if
,else
,switch
,case
,for
,while
,do
,break
,continue
,return
等。类、接口和枚举定义:
class
,interface
,enum
等。访问修饰符:
public
,private
,protected
,default
(默认访问级别不是关键字,但经常被提及)等。数据类型:
byte
,short
,int
,long
,float
,double
,char
,boolean
等。包和导入:
package
,import
等。实例化和对象:
new
,this
,super
等。异常处理:
try
,catch
,finally
,throw
,throws
等。其他:
void
(用于表示方法没有返回值),true
,false
(布尔类型的字面值),null
(表示引用类型的变量没有引用任何对象),instanceof
(用于检查对象是否是一个类的实例),goto
(在Java中是保留字,但并未使用),transient
(用于序列化),volatile
(用于多线程),synchronized
(用于同步),final
(用于表示常量或不可变),static
(用于表示静态成员或方法),abstract
(用于表示抽象类或方法),strictfp
(用于浮点数计算的精度控制)等。
四、数据类型
数据类型:数据类型是用于指定存储在变量中的值的种类或类型。Java支持两种基本的数据类型:基本数据类型和引用数据类型。
4.1、基本数据类型
基本数据类型是Java中预定义的数据类型,它们直接存储值而不是引用。Java有8种原始数据类型,可以分为四类:
整型(Integral Types):
byte
: 8位,取值范围是-128到127short
: 16位,取值范围是-32,768到32,767int
: 32位,通常用于整型数据,取值范围取决于具体的Java虚拟机实现long
: 64位,取值范围远大于int
,常用于大整数
浮点型(Floating-Point Types):
float
: 32位单精度浮点数double
: 64位双精度浮点数
字符型(Character Types):
char
: 16位,用于存储Unicode字符
布尔型(Boolean Types):
boolean
: 只有两个值,true
和false
4.1.1、类型转换
在赋值时的转换
不同数字类型在赋值时,会发生自动转换和强制转换。具体为:
自转----小类型可以直接赋值给大类型;
强转----大类型必须手动强转之后,赋值给小类型;
数字类型的大小关系:double > float > long > int > char、short 、byte
注意:整数强转可能发生溢出问题,浮点数强转可能发生精度丢失。
自动转换:
当存储范围小的数据类型与存储范围大的数据类型一起混合运算时,会按照其中最大的类型运算。
当byte,short,char数据类型进行算术运算时,按照int类型处理。
需要注意的是,自动类型转换只适用于基本数据类型之间的转换。
强制类型转换:
强制类型转换:Java中大容量是无法直接转换成小容量的。因为这种操作可能会导致精度损失,所以这种行为交给了程序员来决定,当然这种后果自然是程序员自己去承担。因此在代码中需要程序员自己亲手加上强制类型转换符,程序才能编译通过。
4.1.2、常用字符编码
a 对应ASCII码 97(b是98,以此类推)
A 对应ASCII码 65(B是66,以此类推)
0 对应ASCII码 48(1是49,以此类推)
4.2、引用数据类型
引用数据类型在Java中不直接存储值,而是存储对对象的引用。这些对象在堆内存中被创建,并通过引用来被访问。Java中有三种主要的引用数据类型:
类(Class Types):
类是用户定义的数据类型,它包含字段(变量)和方法(函数)。接口(Interface Types):
接口是一种特殊的类,它只包含抽象方法和常量。接口不能被实例化,但可以被类实现。数组(Array Types):
数组是一种特殊的数据结构,用于存储相同类型的数据项。数组可以是任何类型的数组,包括基本数据类型和引用数据类型。
4.3、封装类型
Java还提供了与原始数据类型对应的封装类型(Wrapper Classes),它们是引用数据类型,用于将原始数据类型包装为对象。这些封装类型有:
Byte
Short
Integer
Long
Float
Double
Character
Boolean
封装类型主要用于集合框架、泛型和其他需要对象的地方,因为它们提供了原始数据类型所不具备的方法和功能。同时,自动装箱(autoboxing)和拆箱(unboxing)机制使得在原始数据类型和封装类型之间转换变得容易。
4.3.1、自动装箱
自动装箱是指Java自动将基本数据类型值转换成对应的包装类对象。在Java 5之前,如果你需要将一个基本数据类型值赋给一个包装类对象,你需要显式地创建一个新的包装类对象。
4.3.2、自动拆箱
自动拆箱则与自动装箱相反,它是指Java自动将包装类对象转换成对应的基本数据类型值。在Java 5之前,如果你需要从包装类对象中获取基本数据类型值,你需要调用包装类的某个方法(如intValue()
, doubleValue()
等)。
注意事项
虽然自动装箱和拆箱带来了便利,但它们也可能会导致一些潜在的问题:
空指针异常:由于包装类对象是引用类型,它们可以为
null
。当尝试对null
的包装类对象进行拆箱时,会抛出NullPointerException
。性能问题:虽然现代JVM的优化已经使得这种性能差异变得不那么显著,但在某些情况下,自动装箱和拆箱仍然可能导致不必要的性能开销。
缓存问题:对于
Byte
,Short
,Integer
,Long
,Character
这几个包装类,它们的值在-128到127之间(对于Character
是0到127)时,会利用缓存机制直接返回已存在的对象实例,而不是创建新的对象。但超出这个范围的值每次都会创建新的对象实例。
因此,在使用自动装箱和拆箱时,需要注意这些潜在的问题,并根据实际情况进行适当的优化和处理。
五、变量
变量:变量相当于内存中一个数据存储空间的表示,可以把变量看作门牌号,通过门牌号我们可找到房间,而通过变量我们可以找到值。
5.1、使用基本步骤
声明变量
int a;赋值
a = 60; //把60赋给a,也可以一步到位 int a = 60;
5.2、使用注意事项
变量表示内存中的一个存储区域(不同变量,类型不同,占用空间大小不同,如int 4字节,double 8字节)。
该区域有自己的名称(变量名)和类型(数据类型)。
变量必须先声明,后使用。
该区域的数据/值可以在同一类型范围内不断变化。
变量 = 变量名 + 值+ 数据类型
5.3、程序中 + 号的使用
当左右两边都是数值类型,则加法运算。
左右两边一方为字符串,则拼接运算。
运算顺序,从左到右
//下面代码输出什么?
System.out.println(100+90); //190
System.out.println("100"+90); //10090
System.out.println(100+3+"90"); //10390
System.out.println("3"+100+90); //310090
5.4、变量的分类
局部变量:定义在方法、语句块、形式参数中的变量。
成员变量:定义在类中,但在方法之外的变量。
静态变量:使用static关键字定义的变量。
实例变量:没有使用static关键字定义的变量。
5.6、最终变量/常量(final)
最终变量习惯上也称为常量,因为它是通过在声明变量的数据类型前面加final的方式实现的,所以叫最终变量。加final修饰后,这个变量的值就不能修改了,一开始赋值多少,就是多少,所以此时的变量名通常称为常量名。常量名通常所有字母都大写,每一个单词之间使用下划线分割,从命名上和变量名区分开来。
六、运算符(Operator)和标点符号(Separators)
在Java中,一共有38个运算符。
运算符的分类:
按照功能分:算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符、Lambda运算符
按照操作数个数分:一元运算符(单目运算符)、二元运算符(双目运算符)、三元运算符 (三目运算符)
6.1、算术运算符
6.1.1、加法
第一种:对于
+
两边都是数值的话,+
就是加法的意思第二种:对于
+
两边至少有一边是字符串得话,+
就是拼接的意思
6.1.2、自加自减运算
理解:++
运算,变量自己的值加1。反之,--
运算,变量自己的值减少1,用法与++
一致。
1、单独使用
变量在单独运算的时候,变量
前++
和变量后++
,变量的是一样的;变量
前++
:例如++a
。变量
后++
:例如a++
。
2、复合使用
和
其他变量放在一起使用
或者和输出语句放在一起使用
,前++
和后++
就产生了不同。
变量
前++
:变量先自身加1,然后再取值。变量
后++
:变量先取值,然后再自身加1。
3.小结:
++在前,先自加,后使用;
++在后,先使用,后自加。
6.2、关系运算符/比较运算符
比较运算符,是两个数据之间进行比较的运算,运算结果一定是boolean值
true
或者false
。其中>,<,>=,<=不支持boolean,String类型,==和!=支持boolean和String。
6.3、逻辑运算符
&&和&区别,||和|区别:
&&和&区别:
&&和&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。
||和|区别:
||和|结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。
6.4、条件运算符
条件运算符格式:
条件表达式?结果1:结果2
条件运算符计算方式:
条件判断的结果是true,条件运算符整体结果为结果1,赋值给变量。
判断条件的结果是false,条件运算符整体结果为结果2,赋值给变量。
6.5、位运算符
位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果
从二进制到十进制都是基于原码
正数的原码反码补码都一样,负数原码反码补码不一样
byte,short,char在计算时按照int类型处理
如何区分&,|,^是逻辑运算符还是位运算符?
如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符。
6.6、赋值运算符
6.7、运算符优先级
提示说明:
(1)表达式不要太复杂
(2)先算的使用()
口诀:
单目运算排第一;
乘除余二加减三;
移位四,关系五;
等和不等排第六;
位与、异或和位或;
短路与和短路或;
依次从七到十一;
条件排在第十二;
赋值一定是最后;
评论区