目录:
一、Java 概述
1. Java体系
2. 常用的DOS命令
3. JDK、JRE、跨平台、Java平台
4. Java代码的编写执行过程
5. 注释
6. 关键字、标识符
7. Java中的数据类型
8. Java中的常量
二、变量和运算符
1. 变量和计算机存储单元
2. 数据类型和常量
3. 数据类型转换
4. 运算符 和 优先级
三、引用数据类型、流程控制语句 和 数组
1. 引用数据类型
2. 流程控制语句
3. 数组
四、方法
1. 引入
2. 语法格式
3. 方法调用
4. 注意事项
5. 方法重载
6. 可变参数列表
一、Java 概述
1. Java体系
java是一个体系,包含:
java语言
运行在各种平台上的虚拟机
class字节码文件格式
java api(jdk中提供的api),类库
商业的或者三方优秀开源类库
Java体系
2. 常用的DOS命令
常用的DOS命令
3. JDK、JRE、跨平台、Java平台
- JDK:它是Java开发运行环境,在程序员的电脑上当然要安装JDK;
JDK = JRE + 开发工具集(例如Javac编译工具等)
- JRE:Java Runtime Environment它是Java运行环境,如果你不需要开发只需要运行Java程序,那么你可以安装JRE
JRE = JVM + JavaSE标准类库
JDK 包含 JRE 包含 JVM
跨平台特性
平台指的是操作系统 (Windows,Linux,Mac)。
Java程序可以在任意操作系统上运行,一次编写到处运行
实现跨平台需要依赖Java的虚拟机 JVM (Java Virtual Machine)
为什么可以跨平台?因为JAVA程序运行依赖虚拟机,而针对不同操作系统有不同版本的虚拟机Java语言是跨平台的,Java虚拟机不是跨平台的
Java平台
Java SE (桌面程序)标准版
Java EE (Web程序)企业版
Java ME(移动设备)微型版 -- Android,IOS兴起后就很少使用了
4. Java代码的编写执行过程
- 源文件:编写Java源文件(我们也称之为源代码文件),它的扩展名为.java;
- 编译:然后通过编译器把源文件编译成字节码文件,字节码文件扩展名为.class;
为什么要编译?JAVA程序是由虚拟机运行的,我们所写的代码虚拟机不认识,我们要把自己写的代码翻译成虚拟机所认识的语言 - 运行:最后使用解释器来运行字节码文件。
Java代码的编写执行过程
5. 注释
定义:用来解释和说明程序的文字,注释是不会被执行的
分类:
单行注释: //注释内容
多行注释: /注释内容/
文档注释: /*注释内容/
注意:
对于单行和多行注释,被注释的文字,不会被JVM解释执行
对于文档注释,可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档
单行注释可以嵌套使用,多行注释不能嵌套使用
6. 关键字、标识符
关键字
定义:是被Java语言赋予特殊含义,具有专门用途的单词,比如之前接触的class,int,double均为Java已经预设好的
特点:字母全部小写, 注意String不是关键字
注意事项:goto 与 const 是Java中的保留字,即没有赋予特殊含义却仍被Java占用的单词
标识符
定义:就是给类,接口,方法,变量等起名字时使用的字符序列
组成规则(只能包含下面的内容,不能有其它内容):
英文大小写字母
数字字符
$和_
注意事项:
数字不能开头
不可以使用关键字
严格区分大小写,不限制长度
起名时,尽量达到见名知意
标识符中常见的命名规则(这些规定是不受语法约束的):
包名:多单词组成时所有字母均小写,使用.连接,域名反写 aaa.bbb.ccc
类名&接口名:大驼峰式 Aaa AaaBbbCcc
变量名&方法名:小驼峰式 aaa aaaBbbCcc
常量名:多单词组成是所有字母均大写,使用_连接 AAA_BBB_CCC
7. Java中的数据类型
为什么有数据类型?
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型
Java中数据类型的分类
基本数据类型: 基本数据类型是Java语言中内置的类型,分别是整数类型、小数类型、字符类型、布尔类型。这四类基本类型是最简单、最基础的类型。
引用数据类型: 是强大的数据类型,它是基于基本数据类型创建的。
JavaSE中提供了一个超级类库,类库中包含了近万种引用数据类型。
基本类型:类 接口 数组 枚举
8. Java中的常量
- 定义:常量就是不变的数据量, 在程序执行的过程中其值不可以发生改变
- 整形常量默认是 int类型
在Java中,定义长整形数据如果值超过int取值范围后面要+
L
,否则是错误的
- 小数常量默认是 double类型
D
后缀为double,F
后缀为float
定义float类型的数据后面要 +f
,否则默认是double
常量分类:
整数类型
十进制表示方式:正常数字。 如 13、25等
二进制表示方式:以
0b(0B)
开头。 如0b1011 、0B1001十六进制表示方式:以
0x(0X)
开头。 数字以0-9及A-F组成 如0x23A2、0xa、0x10八进制表示方式:以
0
开头。 如01、07、0721小数类型:如1.0、-3.15、3.168等
布尔类型:true、false ,注意严格区分大小写
字符类型:
如 'a','A', '0', '家'
字符必须使用
''
包裹,并且其中只能且仅能包含一个字符字符串类型:
字符串String类型是一种引用类型,我们先了解作为常量类型的使用方式
如 "我爱Java","0123","","null"
字符串必须使用
""
包裹,任意长度在计算机内,有符号数有3种表示法:原码、反码和补码。所有数据的运算都是采用 补码 进行的
原码: +8: 0 000 1000 -8: 1 000 1000
就是二进制定点表示法,即最高位为符号位,0表示正,1表示负,其余位表示数值的大小。
- 反码: +8: 0 000 1000 -8: 1111 0111
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
- 补码: +8: 0 000 1000 -8: 1111 1000
正数的补码与其原码相同;负数的补码是在其反码的末位加 1
二、变量和运算符
1. 变量和计算机存储单元
变量是内存中装载数据的小盒子,你只能用它来存数据和取数据
变量名是标识符,这说明只要是合法的标识符都可以用来做变量名。
变量使用的注意事项
变量定义后可以不赋值,使用时再赋值。不赋值不能使用
变量使用时有作用域的限制。(局部变量和全局变量)
变量不可以重复定义
计算机存储单元
计算机中储存和运算的最小单位:一个字节,也就是1个字节(byte)
常用储存单位1B(字节) = 8bit(比特位)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
2. 数据类型和常量
- 四类八种
byte: 1个字节 : -128~127 (数据表示范围)
short: 2个字节: -32768~32767
int: 4个字节: -2147483648~2147483648
long: 8个字节: -263~263-1
float: 4个字节: -3.403E38~3.403E38
double: 8个字节: -1.798E308~1.798E308
char: 2个字节: 表示一个字符,如('a','A','0','家')
boolean: 1个字节: 只有两个值true与false
- 变量必须要有明确的类型,什么类型的变量装载什么类型的数据
- 数据类型范围从小到大排序:
byte < char < short < int < long < float < double,
布尔类型boolean不能参与类型转换
3. 数据类型转换
- 自动类型转换:表示范围小的数据类型转换成范围大的数据类型,这种方式称为自动类型转换
自动类型转换格式:范围大的数据类型 变量 = 范围小的数据类型值;
默认转换:byte、short、char —> int —> long —> float —> double
byte、short、char 相互之间不转换,他们参与运算首先转换为 int类型
- 强制类型转换:表示范围大的数据类型转换成范围小的数据类型,这种方式称为强制类型转换
强制类型转换格式:
范围小的数据类型 变量 = (范围小的数据类型) 范围大的数据类型值;
4. 运算符 和 优先级
算数运算符
+ - * / % ++ --
+: 正号、加、连接字符串
++,--运算符后置时,先使用变量a原有值参与运算操作,运算操作完成后,变量a的值自增1或者自减1;
++,--运算符前置时,先将变量a的值自增1或者自减1,然后使用更新后的新值参与运算操作。
注意事项:
加法运算符在连接字符串时要注意,只有直接与字符串相加才会转成字符串。
除法当两边为整数时,取整数部分,舍余数。当其中一边为浮点型时,按正常规则相除。
% 为整除取余符号,小数取余没有意义。结果符号与被取余符号相同。
整数做被除数,0不能做除数,否则报错。
小数做被除数,整除 0 结果为 Infinity,对 0 取模结果为 NaN
赋值运算符
*+= -= = /= %=
- *+=, -=, =, /=这样的赋值运算符包含了一个 强制转换 的操作,会将左右两边运算后的结果,强制类型转换后赋值给左边
- 注意:赋值运算符左边必须是变量
int n = 10;
byte by = 20;
by += n; // 运算完毕后,by的值为byte类型30, 相当于代码 by = (byte)(by + n);
比较运算符
== != < > <= >=
- 结果只能是true 和 false
- 字符间的比较,比较的是其 ASCII 值
- 浮点数 与 整数 比较,只要值相等,就返回 true
逻辑运算符
&与-----false&true-----False
|或-----false|true-----True
异或-----trueflase-----True
!非-----!true-----Flase
&&短路与-----false&&true-----False
||短路或-----false||true-----True
- && : 又叫短路运算符,A&&B,如果A为假,不会去计算B的值,直接得到结果为 false
& : A & B,即使A为假,也会计算B的值。 - || : 也是短路运算符,A || B,如果A为真,不会去计算B的值,直接得到结果为 true
| : A | B,即使A为真,也会计算 B 的值。 - 异或^ : 左右两边条件结果相同,结果就为false,左右两边条件结果不同,结果就为true;
三目运算符
- 语法:
布尔表达式 ? 表达式1 : 表达式2
- 当布尔表达式的值为true,则返回表达式1的值,否则返回表达式2的值
运算符优先级
优先级 描述 运算符
1 括号 ()、[]
2 正负号 +、-
3 自增自减,非 ++、--、!
4 乘除,取余 、/、%
5 加减 +、-
6 移位运算 <<、>>、>>>
7 大小关系 >、>=、<、<=
8 相等关系 ==、!=
9 按位与 &
10 按位异或 ^
11 按位或 |
12 逻辑与 &&
13 逻辑或 ||
14 条件运算 ?:
15 赋值运算 =、+=、-=、=、/=、%=
16 位赋值运算 &=、|=、<<=、>>=、>>>=
位运算符
位运算符
位运算是直接对 二进制 进行运算
在位运算中,操作数必须是 整型
位异或运算符的特点:
一个数据对另一个数据位异或两次,该数本身不变。
任何数和自身异或,结果为0
任何数和0异或,结果为本身
<< 左移一位,相当于乘以2: 3 << 2 = 12 --> 322=12
>> 右移一位,相当于除以2: 3 >> 1 = 1 --> 3/2=1
3 >>> 1 = 1 --> 3/2=1
同样的运算,位运算的效率高于算术运算
三、引用数据类型、流程控制语句 和 数组
1. 引用数据类型
引用数据类型的变量定义及赋值格式:
数据类型 变量名 = new 数据类型();
调用该类型实例的功能:
变量名.方法名();
Scanner类:
导包:
import java.util.Scanner;
创建对象实例:
Scanner sc = new Scanner(System.in);
调用方法:
int i = sc.nextInt(); //用来接收控制台录入的数字
String s = sc.next(); //用来接收控制台录入的字符串
- 随机数类Random
- 方法简介
public int nextInt(int maxValue) //产生 [0,maxValue) 范围的随机整数,包含0,不包含maxValue;
public double nextDouble() //产生 [0,1) 范围的随机小数,包含0.0,不包含1.0。
Random使用方式:
- import导包:
import java.util.Random
- 创建实例格式:
Random 变量名 = new Random();
- 赋值:
a = 变量名.nextInt(maxValue);
2. 流程控制语句
1. if
2. if...else...
3. if...else if...else...
4. while
5. for
6. do...while...
7. switch case default break
//case 穿透性:如果多个case条件后面的执行语句是一样的,则该执行语句只需书写一次即可,这是一种简写的方式
break语句
作用:跳出所在的循环体
使用方式
无法单独使用,必须将break关键字置于 switch 或 循环语句 中
运行规律
不需要判断任何条件,只要遇到break变直接跳出执行后续代码。会完全跳出选择或者循环结构
只能跳出 最近的 代码块,不能跨越多级代码块
标记
当break语句出现在嵌套循环中的内层循环时,它只能跳出内层循环,如果想使用break语句跳出外层循环则需要对外层循环添加标记
使用方式:在外层循环外的某行前边使用,后边跟有冒号:的标识符,即定义完毕。
使用时当在内层循环使用 break 或 continue 时后边紧跟之前定义的标号即可
itcast: for (i = 1; i <= 9; i++) { // 外层循环,itcast是标记
for (j = 1; j <= i; j++) { // 内层循环
if (i > 4) { // 判断i的值是否大于4
break itcast; // 跳出外层循环
}
}
continue语句
- 作用:提前结束本次循环,继续进行下次循环
- 使用方式: 无法单独使用,必须将continue关键字置于 循环语句 中
- 运行规律: 不需要判断任何条件,只要遇到continue变直接跳出本轮循环进行下次循环
return 、break、continue 跳出控制语句的区别
- break:结束当前整个循环,执行当前循环下边的语句。
- continue:结束本次循环,继续进行下次循环
- return: 用于结束一个方法,返回给上层调用者,如果位于main方法内,相当于结束了程序。
return也可以用于结束循环,因为return用于结束一个方法,如果方法中有循环的话,不管return嵌套于多少层循环之内,循环都结束。
不会再执行循环后面的语句
3. 数组
一维数组
概述:长度不可变、元素类型相同
一组数据的集合,数组中的每个数据被称作'元素'
在数组中可以存放'任意类型'的元素
但'同一个数组'里存放的元素类型必须一致。
数组是'恒定, 定长的
数组的定义1
格式:
数据类型[] 数组名 = new 数据类型[长度]; int[] x = new int[100];
使用属性:
数组名.length
数组的最小索引是
0
, 最大索引是数组.length-1
数组的定义2
数组初始化:在定义数组时只指定数组的长度,由系统自动为元素 赋初值 的方式称作动态初始化。
格式:
数据类型[] 数组名 = new 类型[长度]; int[] arr = new int[4];
类型[] 数组名 = new 类型[]{元素,元素,……}; int[] arr = new int[]{1,2,3,4};
类型[] 数组名 = {元素,元素,元素,……}; int[] arr = { 1, 2, 3, 4 };
JVM内存划分
- 寄存器:内存和CUP之间
- 本地方法栈: JVM调用了系统中的功能
- 方法和数据共享: 运行时期class文件进入的地方
- 方法栈:所有的方法运行的时候进入内存
- 堆:存储的是容器和对象
数组中常见的异常
- 数组的索引越界异常
- 空指针异常
二维数组
- 定义格式
//第一种定义格式
//相当于定义了一个3*4的二维数组,即二维数组的长度为3,二维数组中的每个元素又是一个长度为4的数组
- int[][] arr = new int[3][4];//不推荐
//第二种定义格式
//第二种方式和第一种类似,只是数组中每个元素的长度不确定,必须要new:arr[0] = new int[5];...
int[][] arr = new int[3][];
//第三种定义格式
//二维数组中定义了三个元素,这三个元素都是数组,分别为{1,2}、{3,4,5,6}、{7,8,9}
int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
二维数组内存
- 比如:
int[][] arr = new int[3][2];
- 外层数组长在内存开辟连续的3个大的内存空间,每一个内存空间都对应的有地址值
- 每一个大内存空间里又开辟连续的两个小的内存空间.
打印数组
//打印一维数组五种方法
Arrays.toString(arr)
for(int n: arr)
System.out.println(n+", ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + ", ");
}
System.out.println(Arrays.asList(arr));
Arrays.asList(arr).stream().forEach(s -> System.out.println(s));//java8
//打印二维数组三种
for(int i=0;i
四、方法
1. 引入
为什么要有方法:提高代码的复用性
什么是方法:完成特定功能的代码块
2. 语法格式
- 访问修饰符:方法允许被访问的权限范围。( public,protected,private,无修饰符 )
- 返回类型:void、任何数据类型
- 方法名:同变量名规则。小写;多个单词,第一个单词首字母小写,其余首字母大写 。myMethod
- 参数列表:可以省略。参数类型 + 参数名,...
3. 方法调用
可以使用 对象名 调用方法,静态方法是使用 类名 调用的
方法包括在类中,调用时先创建包含方法的类的对象,然后用对象再去调用方法。
创建对象:类名 对象名 = new 类名();
调用:对象名.方法名();
4. 注意事项
- 方法参数是 基本类型 ,传递的是值。(包含String类型),形式参数的改变对实际参数不影响
- 方法参数是 引用类型,传递的是内存地址值。(String类型除外),形式参数的改变对实际参数有影响
- 方法的定义只能放在类里面,不能嵌套定义。故而不能在主方法内直接定义方法
- 方法返回值是void,方法中可以省略return
- 方法一般在主方法的前面定义
- 调用方法的时候,返回值是void, 不能写在输出语句中
5. 方法重载
方法的重载:在同一个类中,方法名相同,参数列表不同。与返回值类型无关。
参数列表不同:
参数个数不同
参数类型不同
参数的顺序不同(算重载,但是在开发中不用),注意:必须是不同数据类型。相同类型不存在顺序不同
方法重载注意事项
重载和参数变量名无关
重载和返回值类型无关如void method(int x)与int method(int y)不是方法重载,不能同时存在
重载和修饰符无关
重载看 方法名 和 参数列表
6. 可变参数列表
- 例:
public void sum(int... n){}
- 参数列表中如果有两个以上的参数,可变参数一定在最后
- 可以将数组传递给可变参数列表
- 数组作为参数时,不能将多个值传递给数组的
- 一个方法的形式参数列表,只能有一个可变参数列表
- 方法名相同,一个参数是可变参数,一个参数是一维数组,这两个方法不是重载,因为 一个可变参数等价于相应类型的一维数组
就可以对可变参数列表,进行相应的数组操作,比如求长度 - 可变参数列表所在的方法,是最后被执行访问的
- 方法重载的时候,既可以定义有可变参数的同名方法,也可以定义有确定参数个数的方法,jvm调用方法时,会优先调用 有确定参数个数 的方法