Java入门基础知识二
一、关键字与标识符
关键字(keyword)
:被Java语言赋予特殊含义,关键字全部小写。
- 定义数据类型:class、interface、enum、byte、short、int 、long、float、double、char、boolean、void
- 定义流程控制:if、else、switch、case、default、while、do、for、break、continue、return
- 定义访问权限修饰符:private、protected、public
- 定义类,函数,变量修饰符:abstract、final、static、synchronized
- 定义类与类之间关系:extends、implements
- 定义建立实例,引用实例,判断实例:new、this、super、instanceof
-
异常处理:try、catch、finally、throw、throws
包:package、import - 其他修饰符:native、strictfp、transient、volatile、assert
- 数据类型值的字面值:true、false、null
- 保留字(reserver word):被Java保留尚未使用。goto、const
标识符(identifier)
:Java对各种变量、方法、类等的命名。凡是自己可以起名字的地方都叫标识符。
- 英文字母大小写,数字,下划线,$。
- 数字不可以开头。
- 不可使用关键字。
- 严格区分大小写。
- 标识符不能含空格。
-
规范:(1)
包名
全部小写xxxyyzz。(2)
类名
、
接口名
首字母大写XxxYyZz。(3)
变量名
、
方法名
小驼峰除第一个单词小写其他首字母大写xxxYyZz。(4)
常量名
所有字母大写,加下划线。
二、变量
1.基本内容
概念:内存中的一个存储区域。该区域数据可以在同一类型范围变化。变量是程序中最基本存储单元,包含变量类型、变量名和存储的值。
作用:在内存中保存数据。
注意:Java中每个变量名必须先声明,再赋值,再使用。使用变量名访问这块区域的数据。作用域是其定义所在的括号{}中。同一作用域不能重名。
2.整数类型:byte、short、int、long
Java各整数类型有固定的表示数范围和字段长度,不受OS影响,以保障Java可移植性。
整型常量默认为int类型,声明long型常量末尾加”l”或”L”。
byte:1字节=8bit位(-128~127);short:2字节;int:4字节;long:8字节
3.浮点类型:float、double
float单精度浮点数,尾数精确7位有效数字。4字节
double双精度浮点类型,精度是float两倍。8字节
4.字符类型:char
char型数据表示通常意义上的“字符”。单引号括起来的单个字符,允许使用转义字符’’,直接使用Unicode值表示字符型常量。并且可以参与运算。
5.布尔类型:boolean
boolean类型只允许取值true和false。
6.基本数据类型转换
byte、char、short –> int –> long –> float –> double
byte、char、short不会相互转换,计算时首先转换为int类型。boolean类型不能参与数据类型运算。任何数据类型值与字符串String进行连接运算(+)时,基本数据类型自动转化为字符串类型。
7.变量字符串类型:String
String不是基本数据类型,属于引用数据类型。使用方式和基本数据类型一致,String str=“abc”;
一个字符串可以串接另一个字符串,也可以直接串接其他类型数据。
三、进制
所有数字在计算机底层都以二进制的形式存在。
- 二进制(binary):0,1以0b开头、
- 十进制(decimal)、
- 八进制(octal):以数字0开头、
- 十六进制(hex):以0x开头。
二进制的整数类型有三种形式:
原码
,最高位是符号位。
负数的反码
,对原码除符号位外按位取反。
负数的补码
,反码+1。
计算机以二进制补码的形式保存所有的整数。正数的原码补码反码都相同。负数补码是反码+1。
四、运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较。
算术运算符、赋值运算符、比较运算符(关系运算符)、逻辑运算符、位运算符、三元运算符
。
1. 算术运算符
正号(+)、负号(-)、加减乘除(+ – * /)、取模(%)、自增(++)、自减(–)、字符串连接(+)。
注意:负数取模,模数负号忽略,依照被模数。取模运算结果不一定总是整数。
2.赋值运算符
(=)支持连续赋值,赋值两侧数据类型不一致,则转换。
扩展赋值运算符:+=、-=、*=、/=、%=。不会改变数据类型。
3. 比较运算符
==相等、!=不等于、<小于、>大于、<=小于等于、>=大于等于。
int n = 10;
n += (n++) + (++n);
System.out.println(n); //结果为32
4. 逻辑运算符
&–逻辑与、&&–短路与、|–逻辑或、||–短路或、!–逻辑非、^–逻辑异或
逻辑运算符用于连接
布尔类型表达式
。
“&”和“&&”的区别,逻辑与,左边无论真假右边都进行运算;短路与,如果左边为假则右边不参与运算。
“|”和“||”的区别,逻辑或,左右两边都参与运算;短路或,左边为真则右边不参与计算。
“^”异或与“|”的区别,左右都为true时,结果为false。
5. 位运算符
<<左移、>>右移、>>>无符号右移、&与运算、|或运算、^异或运算、~取反运算。
位运算用于
整数的二进制
进行的运算。
- <<左移:空位补0,被移除的高位丢弃
- ‘>>’右移:被移除最高位是0,右移补0;最高位是1,空缺补1。
- ‘>>>’无符号右移:空缺补0,低位丢弃。
- &与运算:二进制进行&运算,只有1&1结果为1,否则为0。
- |或运算:二进制进行|运算,只有0|0结果为0,否则为1。
- ^ 异或运算:相同二进制位进行^运算,结果是0,不同结果为1。
- ~取反运算:正数取反,各二进制按补码各位取反;负数取反,各二进制码按补码各位取反。
6. 三元运算符
(条件表达式)?表达式1:表达式2;
运算符优先级:只有单目运算符、三元运算符、赋值运算符,是从右往左运算的
五、程序流程控制
流程控制语句是用来控制程序中干各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。顺序结构、分支结构、循环结构。
输入语句
:标准格式
import java.util.Scanner;
Scanner sacan = new Scanner(System.in);
int num=scan.nextInt();
1.分支结构
if-else、switch-case
(1)if-else
条件表达式必须是
布尔表达式
(关系表达式或逻辑表达式)、布尔变量。多个条件互斥时,各个语句顺序随意;多个条件有包含关系时,子上父下。
(2)switch-case
switch(表达式)中
表达式的值
必须是:byte、short、char、int、枚举类型、String类型。
case子句中的值必须是常量,不能是变量名或不确定的表达式;
break语句用来在执行完一个case分支后跳出,如果没有break则程序顺序执行到末尾。
default子句是可任选的,当没有匹配的case时执行default.
(3)对比
如果判断的具体数值不多,且符合byte、short、char、int、String、枚举类型,switch语句效率更高。
对区间判断,结果类型为boolean类型判断用if。
2.循环结构
for循环、while循环、do-while循环
初始化部分、循环条件部分、循环体部分、迭代部分。
(1)for循环
for(1初始化部分;2循环条件部分;4迭代部分){
3循环体部分}
执行顺序:1-2-3-4-2-3-4-2-3-4-…-2。
循环条件部分为boolean类型表达式。
(2)while循环
1初始化部分;
while(2循环条件部分){
3循环体部分;
4迭代部分;}
执行顺序:1-2-3-4-2-3-4-2-3-4-…-2。
循环次数不确定时常用while循环
(3)do-while循环
1初始化部分;
do{
3循环体部分
4迭代部分
}while(2循环条件部分);
执行顺序:1-3-4-2-3-4-2-…-2。
do-while至少执行一次循环
3.特殊流程控制语句
(1)break语句
break语句用来终止某个语句块的执行,break语句出现在多层嵌套的语句块中,可以通过标签指明需要终止的是哪一层语句块。
(2)continue语句
continue只能使用在循环结构中,用于跳过其所在循环语句块的一次执行,继续下一次循环。多层嵌套循环语句中,可以通过标签指明跳过哪一层。
(3)说明
break只用于switch语句和循环语句中,continue只用于循环语句中。continue终止本次循环,break终止本层循环。
六、数组
数组(Array)是多个相同类型数据按照一定顺序排列的集合,并什用一个名字命名,通过下标进行管理。
数组常见概念
:数组名、下标、元素、数组长度。
- 数组本身是引用数据类型,数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
- 数组长度一旦确定,无法修改。
1.一维数组声明方式
type var[];
或
type[] var;
声明数组时不能指定其长度。
- 静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
- 动态初始化:数组声明且分配空间与赋值操作分开进行。
数组元素引用
:定义并用运算符new为之分配空间后才可以通过下标访问元素。每个数组都有一个属性length指明长度。
数组元素类型和元素默认初始值
:byte:0、short:0、int:0、long:0L、float:0.0F、double:0.0、char:0或写为’\u0000’、boolean:false、引用类型:null。
2.一维数组的内存解析
栈(stack):局部变量。存放地址
堆(heap):new出来的结构,对象、数组。具体内存位置
方法区:常量池,静态域。
3.二维数组[][]:数组中的数组
静态初始化:
int[][] arr=new int[][]{
{3,8,2},{2,7},{9,0,1,6}};
动态初始化1:
int[][] arr=new int[3][2];
动态初始化2:
int[][] arr=new int[3][];
每个一维数组都是默认初始化值null。
Java中多维数组不必都是规则的矩阵形式。
int[] x,y[];x是一维数组,y是二维数组。
int[][] arr=new int[][3];//非法
4.数组中常见算法
1.数组元素的赋值(杨辉三角、回形数)
2.求数值型数组中元素的最大值、最小值、平均数、总和
3.数组的复制、反转、查找(线性查找、二分法查找)
4.数组元素的排序算法:
选择排序:直接选择排序、堆排序
交换排序:冒泡排序、快速排序
插入排序:直接插入排序、折半插入排序、希尔排序
归并排序
桶排序
基数排序
5.Arrays工具类的使用
java.util.Arrays类即为操作数组的工具类。
boolean equals(int[] a,int[] b); 判断两个数组是否相等
String toString(int[] a); 输出数组信息
void fill(int[] a,int val); 将指定值填充到数组中
void sort(int[] a); 对数组进行排序
int binarySearch(int[] a,int key); 对排序后的数组进行二分法检索
6.数组使用中常见异常
1.数组角标越界异常(ArrayIndexOutOfBoundsException)
访问到了数组中不存在的角标
2.空指针异常(NullPointerException)
arr引用没有指向实体,却在操作实体中的元素
int[] arr=null;
System.out.println(arr[0]);