第二章 Java基础语法(上)
第一节 标识符
定义:Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
凡是自己可以起名字的地方都叫标识符。
**关键字:**被Java赋予了特殊含义的单词
保留字:现有Java版本中尚未使用,但以后版本可能会用作关键词使用,如goto、const
1、命名的规则(必须遵守,若不遵守编译不能通过)
①只能有字母 a-z A-Z ,数字 0-9,特殊字符 “_” 下划线 和 "$"美元符
②数字不能开头
③名字之间不能包含空格
④不能使用关键字和保留字,但是可以包含关键字和保留字
⑤Java 严格区分大小写,但是长度无限制
2、命名的规范(可以不遵守,但是会受到鄙视)
①包名:所有字母都小写。如:xxxyyyzzz
②类名、接口名:若有多个单词,每个单词的首字母都大写。如:XxxYyyZzz
③方法名、变量名:若有多个单词组成,第一个单词首字母小写,其余单词首字母都大写。
如:xxxYyyZzz
④常量名:所有字母都大写,每个单词之间以"_"隔开。 如:XXX_YYY_ZZZ
第二节 变量
**作用:**保存数据
“局部变量” & 成员变量
1、变量的格式:数据类型 变量名 = 值;
2、变量的概念:
①在内存中开辟一块内存空间
②该空间有类型(数据类型)有名称(变量名)
③在指定的范围内不断的变化
3、变量的注意:
①同一个作用域内变量名不能重复
②作用域:变量作用在所属的那对 {} 内
③先声明,后使用
④局部变量在使用前必须赋值
**练习:**编写一个Variable类,main方法中声明两个变量var1和var2并赋值,声明var3变量,
保存var1和var2之积,然后打印输出var3的值。
public class Variable{
public static void main(String[] args) {
int var1 = 10;
int var2 = 20;
int var3 = var1 * var2;
System.out.println(var3);
System.out.println(var1 * var2);
}
}
第三节 进制与位运算
一、进制的转换
对于整数,有四种表示方式:
**二进制:**0,1 ,满2进1.以0b或0B开头。
**十进制:**0-9 ,满10进1.
**八进制:**0-7 ,满8进1.八进制数被冠以0来表示。
**十六进制:**0-9及A-F,满16进1.十六进制数被冠以0X来表示(字母大小写均可)
如: 0x3f20(十六进制) 0732 (八进制)
十-十六-二进制间的转换
•十六进制->十进制 :乘16 的操作
–0X 23C -> 512+48+12 = 572
•十进制->十六进制 :除16的操作
–572 -> 0X23C
572 / (16*16) = 2 余数 60
60 / 16 = 3 余数12 (0xC)
•十六进制<->二进制
–0X 23C -> 001000111100
八进制 <-> 二进制
1 000 111 100
2 01074
练习:
1、将以下十进制数转换为十六进制和二进制
123 256 87 62
2、将以下十六进制数转换为十进制和二进制
0x123 0x25F 0x38 0x62
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-el7wzmhx-1589173274652)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200422202552233.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdpD4rxk-1589173274656)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200422202610785.png)]
二、原码、补码、反码
所有数字在计算机底层都以二进制形式存在。
计算机以补码的形式保存所有的整数。
正数的原码、反码、补码都相同
负数的补码是其反码加1。
**原码:**直接将一个数值换成二进制数。
**反码:**除符号位以外,对反码其他位取反。
**补码:**反码+1
Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;当是long类型时,二进制默认占64位,第64位是符号位
位运算符 | ||
---|---|---|
运算符 | 运算 | 范例 |
<< | 左移 | 3 << 2 = 12 --> 3*2*2=12 |
>> | 右移 | 3 >> 1 = 1 --> 3/2=1 |
>>> | 无符号右移 | 3 >>> 1 = 1 --> 3/2=1 |
& | 与运算 | 6 & 3 = 2 |
| | 或运算 | 6 | 3 = 7 |
^ | 异或运算 | 6 ^ 3 = 5 |
~ | 取反 | ~6 = -7 |
例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-41n6p9k7-1589173274659)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200422191954213.png)]
位运算符的细节 | |
---|---|
<< | 空位补0,被移除的高位丢弃,空缺位补0。 |
>> | 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 |
>>> | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& | 二进制位进行&运算,只有1&1时结果是1,否则是0; |
| | 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; |
^ | 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1 |
~ | 正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反 |
例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0MStYNHR-1589173274663)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200422191939098.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZIYvT04-1589173274666)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200422191954213.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUaq68LK-1589173274669)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200422192146254.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ncry2phG-1589173274671)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200422192208378.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VjArAqQU-1589173274672)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200422192229450.png)]
负数的位表示
负数的位表示为正数取反加一
例如: 63 = 0x3F -> 0011 1111
-63 = 0xC1 ->1100 0001
在用位表示负数时,最高位为符号位,1表示负数
第四节 变量的数据类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w48F9MNB-1589173274674)(C:\Users\Wang\AppData\Roaming\Typora\typora-user-images\image-20200424205805001.png)]
基本数据类型(8种):
整型:byte(8位) short(16位) int(32位)-默认的类型 long(64位)
浮点型:float(32位) double(64位)-默认类型
字符型:char(2个字节-16位)
布尔型:boolean
引用数据类型:
|-- 类(class) ------ String
|–接口(interface)
|–数组([])
java的整型常量默认为 int 型,声明long型常量须后加‘l’或‘L’
类 型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节=8bit位 | -128 ~ 127 |
short | 2字节 | -215 ~215-1 |
int | 4字节 | -231 ~ 231-1 |
long | 8字节 | -263 ~ 263-1 |
class VariableTest1 {
public static void main(String[] args) {
//1. 变量的格式:数据类型 变量名 = 值;
//整型:byte(8位) short(16位) int(32位)-默认的类型 long(64位)
byte b1 = 123;
short s1 = 12345;
int i1 = 1235467;
System.out.println(b1);
System.out.println(s1);
System.out.println(i1);
//注意:声明 long 型变量时,值后必须加 L 或 l
long l1 = 12423124356L;
System.out.println(l1);
//浮点型: float(32位) double(64位)---默认类型
//注意:声明 float 型变量时,值后必须加 F 或 f
//注意:声明 double 型变量时,值后可以加 D 或 d
float f1 = 15.6f;
double d1 = 15.63d;
System.out.println(f1);
System.out.println(d1);
//字符型:char(2个字节-16位) --- 以 Unicode 编码存储的(包含了 ASCII、中文、日文、特殊字符等)
//char 型变量用于存储单个字符, char 变量的值必须使用单引号
char c1 = 'a';
char c2 = '中';
char c3 = '$';
char c4 = '1';
char c5 = ' ';
System.out.println((int)c1);
System.out.println((int)c2);
System.out.println((int)c3);
System.out.println((int)c4);
System.out.println((int)c5);
//转义字符
char c6 = '\n';
char c7 = '\t';
char c8 = '\u0006';
System.out.println(c6);
System.out.println(c7 + "===");
System.out.println(c8);
//boolean 布尔值,只存储两个值,true 和 false
//true 代表真
//false 代表假
boolean boo1 = true;
boolean boo2 = false;
System.out.println(boo1);
System.out.println(boo2);
//String : 字符串
//注意:声明 String 型变量时,值必须使用双引号
String str = "我大尚硅谷威武!";
System.out.println(str);
System.out.println("HelloWorld!");
}
}
二、数据类型之间的转换
自动类型转换(自动升级):小容量转大容量。系统自动完成
①byte short char —> int —> long —> float —> double
②byte short char 三者之间不进行计算,若计算都将自动升级为 int 再做运算
③boolean 不参与运算
④String 与任何基本数据类型使用 + 连接符,都将自动串接成 String强制类型转换:大容量转小容量。需要使用强转符"(需要转换的类型)"可能损失精度。
class VariableTest2 {
public static void main(String[] args) {
//自动类型转换(自动升级)
/*byte b = 123;
short s = b; //自动升级
System.out.println(s);
int i1 = 100;
int res = i1 + b; //自动类型转换
System.out.println(res);
//注意:
long l1 = 123L;
float f1 = 15.6E2F;
float f2 = l1 + f1;
System.out.println(f2);
char c1 = 'a';
short s2 = 10;
int i2 = c1 + s2;
System.out.println(i2);
char c2 = 'A';
char c3 = 'B';
int i3 = c2 + c3;
System.out.println(i3);*/
//强制类型转换
/*int i1 = 266;
byte b1 = (byte)i1;
System.out.println(b1);*/
int a = 10;
boolean b = false;
double d = 15.6;
float f = .22f;
String str = "哈哈哈";
String newStr = str + a + b + d * f;
System.out.println(newStr);
String str2 = a + d + str + b + f;
System.out.println(str2);
String str3 = "";
}
}
练习:
1、改进Variable类,main方法中使用double类型声明var1和var2变量,然后用var2保存var1与var2之商。
2、声明字符串变量str,用str串接的形式表示上述计算并打印输出结果。
class VariableExer1 {
public static void main(String[] args) {
/*double var1 = 15.6;
double var2 = 22.22;*/
double var1 = 15.6, var2 = 22.22;
var2 = var1 / var2;
String str = "var1 / var2 = " + var2;
System.out.println(str);
}
}
第五节 运算符
算术运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | b=4; -b | -4 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
***** | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模 | 7%5 | 2 |
++ ++ | 自增(前):先运算后取值 自增(后):先取值后运算 | a=2;b=++a; a=2;b=a++; | a=3;b=3 a=3;b=2 |
- - - - | 自减(前):先运算后取值 自减(后):先取值后运算 | a=2;b=- -a a=2;b=a- - | a=1;b=1 a=1;b=2 |
+ | 字符串相加 | “He”+”llo” | “Hello” |
class VariableTest3 {
public static void main(String[] args) {
int a = 12;
int b = 5;
//除法
int res = a / b; //
System.out.println(res);
System.out.println(1234 / 1000 * 1000);
//取模(求余)
System.out.println(a % b);
System.out.println(1 % 5);
}
}
赋值运算符
赋值运算符:= += -= *= /= %=
比较运算符
运算符 | 运算 范例 结果 |
---|---|
== | 相等于 4==3 false |
!= | 不等于 4!=3 true |
< | 小于 4<3 false |
> | 大于 4>3 true |
<= | 小于等于 4<=3 false |
>= | 大于等于 4>=3 true |
instanceof | 检查是否是类的对象 “Hello” instanceof String true |
逻辑运算符
a | b | a&b | a|b | !a | a^b | a&&b | a||b |
---|---|---|---|---|---|---|---|
true | true | true | true | false | false | true | true |
true | false | false | true | false | true | false | true |
false | true | false | true | true | true | false | true |
false | false | false | false | true | false | false | false |
【面试题】&& 与 & 的区别? || 与 | 的区别?
&& : 称为短路与,当左边表达式结果为 false 时,右边表达式将不再计算
&:是位运算符,当用于逻辑运算时,无论左边表达式结果为 true 还是false ,右边表达式都计算
class VariableTest4 {
public static void main(String[] args) {
/*int a = 10;
a += 5; //相当于 a = a + 5;
System.out.println(a);//15
a %= 3; //相当于 a = a % 3;
System.out.println(a);*/
//【面试题】
/*short s = 5;
//s = s + 1; //编译?NO 运行?
s += 1; //s = (short)(s+1);编译?YES
System.out.println(s);*/
//比较运算符(关系运算符):运算结果都为 boolean 值
/*int a = 20;
int b = 20;
boolean boo = a == b;
System.out.println(boo);
System.out.println(a != b);*/
//逻辑运算符: 运算结果都为 boolean 值
//需求:判断一个数是不是大于10 小于 20
int a = 9;
//错误的写法
//boolean boo = 10 < a < 20;
/*boolean boo = a > 10 && a < 20;
System.out.println(boo);*/
/*boolean b1 = true && true;
boolean b2 = true && false;
boolean b3 = false && true;
boolean b4 = false && false;
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);*/
/*boolean b1 = true || true;
boolean b2 = true || false;
boolean b3 = false || true;
boolean b4 = false || false;
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);*/
/*boolean b = !true;
System.out.println(b);*/
/*boolean b = a > 10 & a++ < 20;
System.out.println(b);
System.out.println(a);*/
boolean b1 = true ^ true;
boolean b2 = true ^ false;
boolean b3 = false ^ true;
boolean b4 = false ^ false;
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);
}
}
三元运算符
三元运算符(三目运算符):
格式:
条件表达式 ? 表达式1 : 表达式2;
注意:
①表达式1 和 表达式2 结果的数据类型必须保持一致!
②条件表达式结果为 true 时,执行表达式1,否则执行表达式2
class VariableTest5 {
public static void main(String[] args) {
int a = 10;
int b = 20;
/*int res = a > b ? a - b : a + b;
System.out.println(res);*/
//System.out.println(a > b ? a-b : "哈哈哈");
//获取两个数的较大值
int max = a > b ? a : b;
System.out.println(max);
}
}
练习:
1、使用三元运算符,获取两个数中的较大数
2、使用三元运算符,获取三个数中的较大数
class VariableExer2 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
/*int max = a > b ? a : b;
System.out.println(max);
max = max > c ? max : c;
System.out.println(max);*/
int max = (a > b) ? (a > c ? a : c) : (b > c ? b : c);
System.out.println(max);
}
}
ps.运算符的优先级
. () {} ; , | |
---|---|
R—>L | ++ – ~ !(data type) |
L—>R | * / % |
L—>R | + - |
L—>R | << >> >>> |
L—>R | < > <= >= instanceof |
L—>R | == != |
L—>R | & |
L—>R | ^ |
L—>R | | |
L—>R | && |
L—>R | || |
R—>L | ? : |
R—>L | = *= /= %= |
+= -= <<= >>= | |
>>>= &= ^= |= |