Java基础知识2-Java基本语法
数据类型
1.Java程序的基本组成
- 关键字:被Java语言赋予特定含义的单词,不能作标识符,如private。
- 标识符:由数字、字母、$和_组成的字符串,用于引用变量。且首字母不能是数字。
- 变量:程序执行过程中,在某个范围内其值发生改变的量。
- 常量:在执行过程中其值不发生改变,分为字面值常量和自定义常量,如3.14。
- 表达式:Java中使用的是中缀表达式。如 double a +(b-c)/2。
2.基本数据类型:
类型 | 占用存储空间 | 值域 |
byte | 1字节 | -128~127 |
short | 2字节 | -2^15~2^15-1 |
int | 4字节 | -2^31~2^31-1 |
long | 8字节 | -2^63~2^63-1 |
float | 4字节 | -3.403E~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
类型转换:
- 默认转换:byte,short,char—>int—>long—>float—>double.其中byte,short,char相互之间不能转换,他们参与运算首先转换成int类型。若强行将计算的赋值表达式与变量运算,则会发生编译失败。如
- 强制转换:目标类型 变量名 = (目标类型)(被转换的数据);转换成二进制进行考虑。比如要打印 byte a = 130,可以利用强制转换来实现。
3.运算符
运算符优先级表
(1)算术运算符(+,-,*,/,%,++,--)
A:+的用法
a:加法
b:正号
c:字符串连接符 (对+进行了重载)
B:/和%的区别
a: / 整数之间的相除,结果是整数。
向0取整
如果想得到小数,*1.0即可。
b: %
判断一个数是否是奇数
a % b = a - (a / b) *b
取余运算是一个很耗时的操作,在性能比较关键的时候最好不要使用
D:++和--的用法
a:他们的作用是自增或者自减
b:使用
**单独使用
放在操作数据的前面和后面效果一样。
a++或者++a效果一样。
**参与操作使用
放在操作数的前面:先自增或者自减,再参与操作
放在操作数的后面:先参与操作,再自增或者自减
c:底层原理:
a = a++;
int temp = a;
a++;
a = temp;
(2)赋值运算符(=,+=,-=,*=,/=,%=等)
A:=叫做赋值运算符,也是最基本的赋值运算符
int x = 10; 把10赋值给int类型的变量x。
a = b = 10;
赋值运算符是从右向左结合的。
赋值表达式有值的,值等于=右边表达式的值。
B:扩展的赋值运算符的特点
隐含了自动强制转换。
面试题:
short s = 1;
//s = s + 1;
short s = 1;
s += 1;
请问上面的代码哪个有问题?
(3)比较运算符( ==,!=,>,>=,<,<=,instanceof)
A:无论运算符两端简单还是复杂最终结果是boolean类型。
B:千万不要把==写成了=
(4)逻辑运算符(&,|,^,!,&&,||)
A:逻辑运算符用于连接boolean类型的式子
B:结论
&: 有false则false
|: 有true则true
^: 相同则false,不同则true。
情侣关系。
!: 非true则false,非false则true
&&: 结论和&是一样的,只不过有短路效果。左边是false,右边不执行。
||: 结论和|是一样的,只不过有短路效果。左边是true,右边不执行。
推荐使用 &&,||
(5)位运算符 (&, |, ^, ~, <<, >>, >>>)
A:结论:
&:同时为1,才为1,否则为0
|:同时为0,才为0,否则为1
^: 相同为0,不同为1;
a ^ b = b ^a;
a ^ 0 = a;
a ^ a = 0;
~: ~0为1,~1为0;
<<: 移除的高位丢弃,低位补0;
左移n个单位,相当于乘以 2 ^ n;
>>: 移除的低位丢弃,如果符号位是0,则高位补0,如果符号位是1,则高位补1;
右移n个单位,相当于除以2 ^ n;
>>>: 移除的低位丢弃,高位补0;
注意事项:如何移动的单位a超过了字长m, 则实际移动
a mod m (数学中的取余运算)
B:面试题
a: 判断一个数是否是奇数 a & 1 == 1;
b: 对2 ^ n 取余。 a & (2^n - 1);
c: 如何判断一个数是否是2^n a & (a-1) == 0
d: 两个整数之间的交换;
e: 有一堆数,都是成对出现的,只有一个单独的,找出这个单独的数
f: 用最有效率的方式求2 * 8的值 2 << 3;
(6)三元运算符
A:格式
比较表达式 ? 表达式1 : 表达式2;
B:执行流程:
首先计算比较表达式的值,看是true还是false。
如果是true,表达式1就是结果。
如果是false,表达式2就是结果。
C:案例:
a:比较两个数据是否相等
b:获取两个数据中的最大值
c:获取三个数据中的最大值
int max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
int max = a > b ? (a > c ? a : c) : (b > c ? b : c);
语句
1.声明语句
创建某种类型的变量并用标识符为其命名,Java是一种强类型的语言,编译器会检查类型的一致性。所以在首次使用变量时一定要声明。如 int a,b;
2.赋值语句
如 c = 5,是将5这一int型常量赋值给变量c,赋值语句的左侧必须是单个变量,右侧可以是能够得到相应类型值的任意表达式。
3.条件语句
根据制定的条件执行分支代码块之一,有if和swich两种语句结构
if语句
if(<boolean expression>)
{
<block statements1>
}else
{
<block statements2>
}
switch语句
switch(<boolean expression>)
{
case value1:
<block statements1>
break; //可以结束switch语句
case value2:
<block statements2>
break;
…
default: //当所有情况都不匹配的时候,就执行该处的内容
<block statements>
break;
}
- if的关系表达式的结果必须是boolean类型
- switch的关系表达式的取值可以是:byte,short,int,char
- JDK5以后可以是枚举,JDK7以后可以是String
- case后面只能是常量,不能是变量。default,break均可以省略,但不建议
- break 与 continue 语句
- break:立即从循环中退出
- continue:立即开始下一轮循环
4.循环语句
while语句:
while(<boolean expression>)
{
<block statements>
}
循环语句中的代码段称为循环体。
for语句:
以一种更紧凑的方式来表达while的循环
for(<initialize>; <boolean expression>; <increment>)
{
<block statements>
}
5.跳转控制语句
break 中断
- 使用场景:选择结构的switch语句,循环语句,其他场景无意义,会报错
- 作用:跳出单层循环(若有多层,只跳出内层),跳出多层循环,则需要标签语句的配合
continue 继续
- 使用场景:循环语句
- 作用:退出这次迭代,开始下次迭代(循环的一次)
return 返回
- 结束一个方法,一旦遇到return,方法不会再继续往后执行
数组
1.概念:
- 数组是存储同一种数据类型多个元素的集合
2.静态初始化:
- 给出值,系统在Java中的数组必须先初始化,才能使用,一般需要三步(声明数组的名字和类型,创建数组,初始化数组元素)
3.动态初始化:
- 只给长度,系统给出默认值。如 double[] a = new double[N]; //等号左侧声明数组,右侧创建了数组。此时默认初始值是0.0。
编译时将数组初始化。如int[] a = { 1, 1, 2, 5, 8};
4.二维数组:
- 二维数组就是一维数组的数组,如 double[][] a = new double[M][N];
方法
含义:
就是完成特定功能的代码块,在Java中,类似于其他语言中的函数,被称为方法。格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
方法体;
return 返回值;
}
修饰符:目前就用 public static。后面再详细讲解其他修饰符
返回值类型:就是功能结果的数据类型
方法名:就是起了一个名字,方便我们调用该方法。
参数类型:就是参数的数据类型
参数名:就是变量名
参数分类:
实参:调用方法时,传递的参数
形参:定义方式时,定义的参数。
方法体语句:就是完成功能的代码块
return:结束方法,并把计算结果返回给调用者。
返回值:就是功能的结果,由return带给调用者。
3.性质:
方法的参数按值传递:
- 在方法中参数变量的使用方法和局部变量相同,唯一不同的是参数变量的初始值是由调用方提供的。方法处理的是参数的值,而非参数本身。这种方式产生的结果是在静态方法中改变一个参数变量的值对调用者没有影响。
方法名可以被重载:
- 所谓重载,指的是在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数、参数类型,参数顺序不同。
- 方法重载与返回值类型无关,只看方法名和参数列表(调用时虚拟机通过参数列表的不同来区分同名的方法)
方法只能返回一个值,但是可以包含多个返回语句:
- 一个Java方法只能返回一个值,它的类型是方法签名中声明的类型,如double,int等等。任何静态方法每次都只会返回一个值,即被执行的第一条返回语句的参数。
方法可以产生副作用:
- 方法的返回值可以是void,这表示该方法没有返回值。方法的组后一条语句执行完毕后控制权将会返回给调用方。我们称void类型的静态方法会产生副作用(接受输入,产生输出,修改数组或者改变系统状态)。