共分出三个版本:JavaSE (标准版)、JavaEE(企业版) 、JavaME(瘦身版)
一个Java程序:
public class Hello { • public static void main(String[] arge){ • System. out. println("Hello,world"); • } • }
在Java中,在总能找到类似下面的定义:
public class Hello { • ... • }
这个定义被称为class(类),Hello为类名(大小写注意),public则表示这个类是公开的,{ }中间的为类的定义( 类的定义中可以定义方法 )。
一个程序的基本单位是class,class是关键字,用来定义一个类。
Hello是类名,区分大小写,类名要求:以英文字母开头,后接字母、数字、下划线,且习惯以大写字母开头。
public是访问修饰符,表示改class公开的,不写也可以编译,但这个类无法从命令行执行。
calss内部可以定义若干个方法
public class Hello { • public static void main(String[] arge){ • ... • } • }
其中方法名为main,返回值为void,表示没有任何返回值
方法定义了一组执行语句,会被依次执行。
public也可以修饰方法
static也是修饰符,表示静态方法;Java入口规定的方法必须是静态方法,方法名必须为main,括号内的参数必须是String数组
方法名命名和class一样,但首字母小写
方法内部的语句才是真正的执行代码
Java的每一行语句必须以分号结束
注释以/*开头 ; */结尾;多行注释则只改变开头为/**
变量分为基本类型的变量和引用类型的变量。
变量的作用范围:只作用于定义它的语句块,而语句块由花括号切割;同名的变量由于作用域不同,所以是两个不同的变量。
(感觉和c语言一样,不多说)
数据类型是CPU可以直接进行运算的类型。
Java定义的几种基本数据类型:
整型:byte、short、int、long
浮点型:float、double(浮点型数据加f后缀)
字符型:char(除了可以表示标准的ASCll外,还可以表示Unicode字符 另:char类型需要使用单引号且只有一个字符,而双引号则是字符串)
布尔类型:boolean
前三个基本和c一样。
一个字节是1byte,1024字节是1K,1024K是1M,1024M是1G,1024G是1T;
计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit。它的二进制表示范围从00000000
~11111111
,换算成十进制是0~255,换算成十六进制是00
~ff
。
byte占一个字节
short占两个字节
int占四个字节
long占八个字节
float占四个字节
double占八个字节
char占两个字节
布尔类型:
布尔类型boolean只要true和false两个值
boolean b1 = true; boolean b2 = false; boolean isGreater = 5 > 3; int age = 12; boolean isAdult = age >= 18;
理论上boolean占一个字节,但JVM内部会表示为四个字节整数。
除上面的基本类型之外剩下的都是引用类型,例如最常引用的就是string字符串。
定义变量时,若加上final修饰符,这个变量就成了常量,常量不可再次赋值,且常量名通常大写。
有时候类型名字太长写起来麻烦,则可以使用var关键字。
运算法则:遵循四则运算,另:%表示求余
溢出:整数存在范围限制,计算结果超出范围会产生溢出,但溢出不会出错,只会得到一个奇怪的结果。
n += 100 相当于 n=n+100;
n -= 100 相当于 n=n -100;
++:自增 n++ 相当于 n=n+1;
-- :自减 n-- 同上
移位运算:
左移:<< (将整数转换为二进制然后非0数依次向左移位)
右移:>> (同时但向右移且最高位始终为1)
无符号右移:>>> (向右移同时最高位补0)
位运算:
与:&& 两者都1
或:| 两者任意一个1
非:~ 0和1互换
异或:^ 两者不同则为1,否则为0
另:对两个整数进行位运算,转换成二进制并按位对齐,然后依次对每一位进行运算
运算优先级:
()
!
~
++
--
*
/
%
+
-
<<
>>
>>>
&
|
+=
-=
*=
/=
类型自动提升:
在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。
强制类型转换: (类型)
但是超出范围的强制类型转换会得到错误的结果(高位字节可能会被丢掉)。
和整数一样,但不能作位运算和移位运算。
由于浮点数无法在计算机中精确表示,计算时会产生误差,所以两个浮点数相比较常常采用绝对值之差是否小于一个很小的数。
另:Java的浮点数完全遵循IEEE-754标准
类型提升:如果参与运算的两个数其中一个是整型,则整型可以自动提升到浮点型;但整型计算结果出现了 浮点数最后结果却依然显示整型。
溢出:整数运算在除数为0
时会报错,而浮点数运算在除数为0
时,不会报错,但会返回几个特殊值:
NaN
表示Not a Number
Infinity
表示无穷大
-Infinity
表示负无穷大
double d1 = 0.0 / 0; // NaN double d2 = 1.0 / 0; // Infinity double d3 = -1.0 / 0; // -Infinity
强制类型转换:浮点数可以强制类型转换为整型,但小数部分会被丢掉;若转型后超出整型的最大范围,将返回整型最大值。
布尔运算只有true和false两个值
关系运算:
比较运算符:>
,>=
,<
,<=
,==
,!=
与运算 &&
或运算 ||
非运算 !
示例:
boolean isGreater = 5 > 3; // true int age = 12; boolean isZero = age == 0; // false boolean isNonZero = !isZero; // true boolean isAdult = age >= 18; // false boolean isTeenager = age >6 && age <18; // true
优先级:(高到低)
!
>
,>=
,<
,<=
==
,!=
&&
||
短路运算:若布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。
三元运算符:b ? x : y (x y类型必须相同)
b为1则计算x,b为0则计算y
字符类型:
一个char保存一个Unicode字符,故一个英文字符和一个中文字符都可以用char类型表示,占两个字节。
另:将char类型字符赋值给int类型,可以显示该字符的Unicode编码,还可以用、u+Unicode编码来表示一个字符。
字符串类型:
字符串类型string是引用类型。
其余用法和c语言一样,不多说。
字符串连接:可以使用+连接字符串和其他类型数据(其他数据类型会先转换成字符串类型)。
如:string s = “I”+"LOVE"+"YOU";
另:字符串可以使用
""" ...//具体字符串 """
表示多行字符串
字符串还有不可变特性。
1.数组所有元素初始化为默认值,整型都是0
,浮点型是0.0
,布尔型是false
;
2.数组一旦创建后,大小就不可改变。
3.数组也是引用类型,具有不可变特性。
4.字符串数组即数组每个元素都是字符串。
5.基本与c言一样,不多说。
输出:一般使用System.out.println()向屏幕输出。(其他与c相同)
输入:
创建Scanner
对象并传入System.in
,System.in代表标准输入流(System.out代表标准输出流)。
有了Scanner
对象后,要读取用户输入的字符串,使用scanner.nextLine()
,要读取用户输入的整数,使用scanner.nextInt()
。Scanner
会自动转换数据类型,也不必手动转换。
用法同c
用法也基本同c,但多了一个option
public class Main { public static void main(String[] args) { int option = 99; switch (option) { case 1: System.out.println("Selected 1"); break; case 2: System.out.println("Selected 2"); break; case 3: System.out.println("Selected 3"); break; default: System.out.println("Not selected"); break; } } }
其中option的值代表着下面的case后面的1 2 3,若option的值不是case后面的任意一个,则执行default;
另:swich还可以匹配字符串,将option换成字符串即可。
swich新语法:
->:
public class Main { public static void main(String[] args) { String fruit = "apple"; int opt = switch (fruit) { case "apple" -> 1; case "pear", "mango" -> 2; default -> 0; }; // 注意赋值语句要以;结束 System.out.println("opt = " + opt); } }
用法更简洁。
yield:可以表示switch语句的返回值。
和c相同,没啥好说的。
另:
while先判断再执行循环。
do-while先执行再判断,即最少执行一次。
同c,多了个for each循环。
for each:for each
循环的变量n不再是计数器,而是直接对应到数组的每个元素。for each
循环的写法也更简洁。但是,for each
循环无法指定遍历顺序,也无法获取数组的索引。
例:
int[] ns = { 1, 4, 9, 16, 25 }; for (int i=0; i但除了数组外,
for each
循环可以遍历所有“可迭代”的数据类型,包括List
、Map
等。break和continue
都同c
break:跳出当前循环,整个循环都不执行了。
continue:提前结束本次循环,直接继续执行下次循环。
数组操作
遍历数组
顾名思义,依次访问数组的元素。
一般用for或for each。
数组排序
常用的排序:冒泡排序、插入排序、快速排序。
多维数组
二维数组:数组的元素还是数组(数组元素的长度可以不同)。
打印二维数组可以使用Arrays.deepToString()函数。
三维数组:数组的元素是二维数组。
高维数组用的少,二维数组用的多。
命令行参数
Java的程序入口的main方法,而main方法可以接受一个命令行参数,他是一个String[]数组。