Java 基本语法
1.标识符
标识符的命名规则
- 可以又大小的英文字母,0-9的数字,下划线,美刀$
- 数字不能作为开头
- 不能使用java中的50个关键字和保留字go/const,3个特殊值true/false/null
- 严格区分大小写
- 不能使用空格
标识符的命名规范
- 包:所有字母都小写,xxx.yyy.zzz
- 类名/接口名:所有单词的首字母大写,XxxYyyZzz
- 变量名/方法名:第一个单词的首字母小写,其余大写,xxxYyyZzz
- 常量名:所有字母都大写,每个单词用_连接。XXX_YYY_ZZZ
2.变量
概念
- 代码一块内存空间,使用变量名来访问和使用这块空间
变量的特点和作用
- 概念:一块内存中的数据存储空间的标识
- 特点:里面的内容可以修改,一个变量只能存储一个值,有数据类型、变量名、值三部分组成,缺一不可。
- 作用:保存数据
如何声明和使用
- 声明的格式:数据类型 变量名
- 变量的赋值:变量名 = 值(常量、变量、表达式)
- 使用:直接用变量名即可
注意事项
- 先声明后使用
- 变量要有初始值
- 变量有作用域
3.数据类型
基本数据类型
整型
- byte:一个字节,范围-128~127
- short:两个字节,范围-32768~32767
- int:四个字节,范围大概十位数
- long:八个字节,须在数字后面加L,123456799L
浮点型
- float:四个字节,小数的十进制科学计数法,大概小数点后6~7位
- double:八个字节,小数的十进制科学计数法,大概小数点后15~16位
字符型
-
char:2个字节,因为是2个字节,所以一个中文汉字,也可以表示一个字符 char c = ‘中’;Java中使用Unicode值来表示每一个字符,至于这个Unicode值在底层怎么存,这个要和与具体的编码方式相结合,编码方式有:GBK,UTF-8,ISO8859-1等。
-
注意:
-(1)字符常量需要使用单引号’’,单引号中有且只能有一个字符。如果有多个字符,就需要使用"",变成字符串类型,就是String类型。字符型 char c = ‘a’;char c =’’;(错误)字符串类型 String str = “hello”;双引号中,需要0~n个字符,String str = “”;空字符串。 -
(2)字符还可以转义字符,无法用一个字符表示的符号,回车 \r,换行 \n,退格 \b,制表位 \t。
-
在Java中有特殊意义的标点符号,单引号 ’
-
双引号 "
-
斜杠本身 \
-
(3)字符的表示可以使用Unicode值 \u000a
布尔型
- boolean 只有两个值true和false
引用数据类型
- 类 String,System
- 接口 interface
- 数组 ArrayList
数据类型的转换
-
基本数据类型的转换
-
自动类型转换
-
存储容量小的值或变量赋值给存储容量大的,或者存储容量小的与存储容量大的进行混合运算,出现存储容量小的会自动转成存储容量大的类型
-
byte,short,char --> int --> long -->float -->double
-
因为float和double类型的存储方式不一样,因此8个字节的long可以转成float而不会溢出
-
float和double 存储是分为:符号位,指数部分,尾数部分
-
强制类型转换
-
把存储容量大的常量值/变量/表达式的值赋值给存储容量小的变量时
-
需要使用强制类型转换符()
-
强制类型转换有风险:溢出,损失精度
4.运算符
算术预算符
- 、正号 + int a = 10;
-
负号 -
- 加法 + int c = a + b;
- 减法 - int c = a - b;
- 乘法 *
- 除法 / 特殊:两个整数相除,只保留整数部分;两个整数相除时,除数不能为0,否则报错;两个浮点数相除时,除数为0的话,结果是Infinity。
- 取模 % 求余数,特殊:模数的负号会被忽略
- 自增 ++ 运算的规则:1、对于自增变量本身来说,无论++在前还是在后,自增变量本身都会自增1;2、但是对于自增表达式来说,++在前还是在后的结果是不同1)a++ 这个表达式的值与a自增之前的值相同;2)++a 这个表达式的值与a自增之后的值相同
- 自减 – 类似于自增
逻辑运算符
- 逻辑与 & true & true才为true,其他的都为false
- 逻辑或 | 左右两边有一个为true,结果就为true
- 逻辑非 ! !true为false , !false为true
- 逻辑异或 ^ 左右两边必须是一个为true,一个为false,结果采为true,否则为false
- 短路与 && 如果&&的左边的值为false,右边的就不看了,结果直接为false
- 短路或 || 如果||的左边的值为true,右边的就不看了,结果直接为true
- 逻辑运算符的操作数,必须是布尔值
赋值运算符
- 基本赋值运算符 = 表示把=右边的值赋值给左边的变量
- 扩展赋值运算符 += 把左边的变量的值,与右边整个表达式的值相加,最后赋值给左边的变量,如果左右两边的类型不一致,会隐含有类型转换。
- -= *= /= %= 同上
比较运算符
- 大于 >
- 小于 <
- 大于等于 >=
- 小于等于 <=、
- 等于 == 注意和赋值运算符区分
- 不等于 != 注意:比较表达式的结果一定布尔值,要么为true,要么为false
- 如果要表示 a变量在[0,100] 0<=a<=100,0<=a && a<=100
条件运算符
- 三元运算符: 条件表达式 ? 结果表达式1 : 结果表达式2
- 如果条件表达式的结果为true,那么整个表达式的结果就取 “结果表达式1”的值,否则就取“结果表达式2”的值
位运算符
- 左移 << 右边补0
- 右移 >> 左边补什么,看最高位,最高位是0,补0,最高位是1,补1
- 无符号右移 >>> 左边直接补0
- 按位与 1 & 1结果才为1,其他都是0
- 按位或 0 | 0结果采为0,否则都是1
- 按位异或 1 ^ 0 或 0 ^ 1是1,其他都是0
- 位取反 1就是0,0就是1
- 常用于底层对数据的操作,运算数度快。
上述的运算都是针对基本数据类型的,有三个比较特殊的运算符。
-
- 可以用于字符串的拼接,java在底层做了运算符的重载。为了保证代码的简洁和安全性,自己不能去定义运算符的重载。
- == 可以用于引用数据类型的“地址”的比较,在没有重写toString方法时,equals就是用 == 实现的比较功能。
- = 可以用于引用数据类型变量的赋值
运算符的优先级
- ( ) >算术运算符 >关系运算符>逻辑运算符>三元运算符>赋值运算符
- 在自己不确定优先级的时候,一律使用()进行显示的区分,不要炫耀技术,写一些复杂的一连串的运算,除了骗自己,你是骗不了编译器,这和高级语言设计的初衷背道而驰,这无疑是浪费时间(这都和某浩强的c语言书籍学的吗?)
5.流程控制
顺序
- 程序从上往下执行
分支
if
-
单分支,语法:语法:if(条件){语句}
1) 执行顺序:判断条件是否成立,如果成立执行后面的语句。
2) 条件一般是: boolean的变量、关系表达式、逻辑表达式 , 最终结果肯定是 true|false -
双分支 语法:if(条件){语句1}else{语句2}
1)执行顺序: 判断条件是否成立,如果成立执行语句1,否则 执行语句2
2) 条件一般是: boolean的变量、关系表达式、逻辑表达式 , 最终结果肯定是 true|false -
多重分支 语法: if(条件1 ){语句1} else if(条件2){语句2} 。。。else{语句n}
1)执行顺序:先判断条件1,如果成立执行语句1,否则判断条件2 ,如果成立执行语句2,以此类推,如果都不成立执行 语句 n
2) 条件一般是: boolean的变量、关系表达式、逻辑表达式 , 最终结果肯定是 true|false
3)注意事项: else 可以省略,但不能提到前面 -
嵌套if 语法:if(条件){ if(条件){}}else{if(){}}
1)执行顺序:先判断外层if的条件,如果成立,才去判断内部if的条件
2)if、else if、else后面的大括号都可以省略,默认执行第一句,只是不建议省略,可读性差
switch
-switch(变量或表达式){
case 常量值1: 语句1;break;
case 常量值2: 语句2;break;
…
default: 语句n;break;
}
-
先去判断switch变量或表达式的值,依次从上往下和各个case去匹配,如果有匹配的,执行对应的后面的语句,直到遇见break为止。如果没有匹配的,则执行default后面 的语句,直到遇见break为止。
-
1.常量值不能重复
-
2.switch判断 的变量类型 只能是 int或char、short、byte、枚举、String(jdk1.7以后)
-
3、default可以省略,也可以提到前面
-
4、break可以省略
if 和 switch 的对比
- 能用switch的,肯定能用if,反之,能用if的,不一定能用switch。条件: 等值判断、类型必须满足switch所需类型、多重分支
循环
优点
- 1.代码简洁,优雅
- 2.易修改
四要素
- 循环变量初始化
- 循环条件
- 循环操作(循环体)
- 循环变量更新
分类
- while
1)语法
循环变量初始化
while(循环条件){
循环操作
循环变量更新
}
2)执行顺序
循环变量初始化 ①
while(循环条件){ ② ⑤
循环操作 ③
循环变量更新 ④
}
-
do while
1)语法
循环变量初始化
do{
循环操作
循环变量更新
}while(循环条件);2)执行顺序
循环变量初始化 ①
do{
循环操作 ② ⑤
循环变量更新 ③ ⑥
}while(循环条件); ④ ⑦
-
for
1)语法
for(循环变量初始化; 循环条件; 循环变量更新){
循环操作
}
2)执行顺序
① ② ⑤ ④
for(循环变量初始化; 循环条件; 循环变量更新){循环操作 ③
}
3)注意点:
1、两个分号必不可少
2.三个表达式 可以省略,但有可能造成死循环
3.表达式1可以有多个变量声明,但必须是同一类型,但用逗号隔开
表达式3可以有多个变量更新,用逗号隔开
for(int i=0,double j=6;😉{错误的!!!!
}
-
增强for
1)语法
for(元素数据类型 变量:数组或者Collection集合){使用变量即可}{
循环操作
}
2)注意:增强for不会对原来的数组或是集合进行操作,而是对自定义的变量进行操作。即,不能不会改变源数据的内容,适合在读取数据操作。 -
嵌套循环
一个循环中又嵌套了另一个完整的循环结构
三种循环中,都可以嵌套另外一种任意的循环结构
先执行外层循环,然后执行内层循环
二维图形题,如 等腰三角形
案例
- 1.1-100求和
1、for循环
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("1到100累加的和为:" + sum);
2、while循环
int sum = 0;
int i = 1;
while (i <= 100) {
sum += i;
i++;
}
System.out.println("1到100累加的和为:" + sum);
3、do...while循环
int sum = 0;
int i = 1;
do {
sum += i;
i++;
} while (i <= 100);
System.out.println("1到100累加的和为:" + sum);
-
- 水仙花数
* 需求:在控制台输出所有的”水仙花数”
* 所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
* 举例:153就是一个水仙花数。
* 153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153
分析:
1,100 - 999
2,获取每一个位数的值,百位,十位,个位
3,判断各个位上的立方和是否等于这个数,如果等于打印
*/
class Test3_Flower {
public static void main(String[] args) {
for (int i = 100;i <= 999 ;i++ ) { //获取100到999之间的数
int ge = i % 10; //123 % 10
int shi = i / 10 % 10; //12 % 10;
int bai = i / 10 / 10 % 10; //1 % 10
if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
System.out.println(i);
}
}
}
}
- 3.统计顾客年龄
public class homework01 {
public static void main(String[] args) {
double xia =0;
double shang=0;
double bili;
double bili1;
for(int i=1;i<=10;i++){
Scanner input=new Scanner(System.in);
System.out.println("请输入第"+i+"位顾客的年龄:");
int age=input.nextInt();
if (age<=30) {
xia++;
}else{
shang++;
}
//bili表示30岁以下的比例,bili1表示30岁以上的比例
}
bili=xia/10*100;
bili1=shang/10*100;
System.out.println("30岁以下的比例"+bili);
System.out.println("30岁以上的比例"+bili1);
}
}
- 4.不断输入姓名,直到输入 q 停止
while (true) {
Console.WriteLine("请输入学生姓名");
string a = Console.ReadLine();
if (a == "q") {
Console.WriteLine("结束");
break;
}
}
Console.WriteLine("请输入学生姓名");
string a = Console.ReadLine();
while (a != "q") {
Console.WriteLine("请输入学生姓名");
a = Console.ReadLine();
}
Console.WriteLine("请按任意键退出");
Console.ReadKey();
- 5.1-100 的偶数打印
public class Cto {
public static void main(String[] args) {
System.out.println("1~100所有的偶数为:");
//遍历1~100
for(int i=1; i<=100; i++){
if (i%2 == 0) {
System.out.println(i);
}
}
}
}
跳转
- break 只能 用在switch或循环中,用于跳出所在的最近的循环或switch
- continue 只能用在循环中,结束本次循环,继续下一次循环
- return 用于跳出所在的方法