Day02 java的基本语法
1.关键字和保留字
2.标识符
3.变量
- 基本数据类型
- 基本数据类型与String 间转换
- 进制间转换
4.运算符
5.流程控制
1.关键字与保留字
- 特点:关键字中的所有字母都是小写
用于定义数据类型的关键字
class | inteface | enum | byte | short |
---|---|---|---|---|
int | long | float | double | char |
boolean | void |
用于定义流程控制的关键字
if | else | switch | case | default |
---|---|---|---|---|
while | do | for | break | continue |
return |
用于定义访问权限修饰符的关键字
public | protected | private |
---|
…
保留字
goto | const |
---|
2.标识符
java对各种变量,方法类等元素命名的时候使用的字符序列就称为标识符
技巧:凡是你自己去命名的地方就叫标识符
- 定义合法的标识符规则
- 由26个字母大小写,0~9,_或&组成
- 数字不能作为开头
- 不能使用关键字或保留字,但是能包含关键字和保留字
- java中严格区分大小写,长度无限制
- 标识符中间不能有空格
- java中的名称命名规范(日常用到)
- 包名(package):多单词组成的时候,所有字母都小写:xxxyyyzzz
- 类名(class)和接口名(interface):多单词组成的时候 ,所有单词的首字母大写:XxxYyyZzz
3.变量
- 变量的概念
- 内存中一个存储区域
- 该区域中的数据可以在同一类型范围内不断变化
- 变量是程序中最基本的存储单位,包括变量的类型,变量名字和变量的值
- 变量的作用
- 用于在内存中保存数据
- 变量的注意事项
- java中每个变量必须先声明,再使用
- 使用变量名来访问该区域的数据
- 作用域:其定义的一对{}里面
- 变量只有在其作用域中才有效
- 同一作用域,不能定义同名的变量
- 变量的声明:
- 语法:<数据类型><变量名称>
- int abc;
- 变量的赋值
- 语法:<变量名称><值>
- 声明和赋值变量
- 语法:<数据类型><变量名><值>
- int abc = 10;
变量的分类–按数据类型
变量的分类–按声明的位置
- 在方法体外,类体内声明的变量是成员变量
- 在方法体内声明的变量是局部变量
- 注意:二者在初始化值方面的异同:
- 同:都有生命周期
- 异:局部变量除了形参外,所有变量都要有初始值
- 在java中,除了形式参数外,所有的变量都要有初始值
整数的类型:byte short int long
- java中整型常量默认是int,如果声明long必须在常量后面加‘|’或者是‘L’
- java的整型变量通常声明为int,除非不足以表示较大的数,才使用long
类型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节=8bit位 | -128~127(2的7次方) |
short | 2字节 | -32768~32767(2的15次方) |
int | 4字节 | -2147483648~2147483647(2的31次方) |
long | 8字节 | 2的63次方 |
浮点类型
类型 | 长度 |
---|---|
float | 单精度,7位有效数字 |
double | 双精度,是float的两倍 |
- Java的浮点型常量默认是double 声明float常量须在常量后加 f F
- double不能作为money的类型 使用BigDecimal()
字符型:char
- 2字节
(了解)
Unicode编码:将世界上所有符号都纳入其中,每个符号都有一个独一无二的编码,所以没有乱码问题,存储空间存在浪费问题
ASCLL码:8个二进制位 = 1个字节 128个字符的编码
UTF-8:是Unicode的实现方式之一,支持中文
3种表达方式
- ‘ ’单引号括起来的单个字符 char a = ‘你’;
- \ char a = ‘\n’ 这里的a是换行的意思
- ‘\uXXXX’ XXXX代表的是十六进制整数 \u4f60表示 你
char是可以参与运算,因为它有对应的Unicode码
布尔类型Boolean
Boolean类型用于判断逻辑条件,用在程序的流程控制
- if条件控制语句
- while循环控制语句
- do-while循环控制语句
- for循环控制语句
Boolean类型只有true和false无null无0,1
- 不能使用0或者非0整数来替代true和false,这点跟C语言不同
- JVM没有专门给Boolean值用的字节码指令,java中所代表出来的Boolean值,是在编译之后使用JVM的int数据类型来替代:true用1来表示,false用0来表示
基本数据类型转换
- 自动类型转换(小转大):容量小的类型自动转换成容量大的数据类型
- byte,short,char 之间不会互相转换,他们3个在计算的时候首先都会转换成int类型
- Boolean不能与其他数据类型运算(布尔表达式)
- 但任意的和数据类型与字符串(string)进行连接运算(+),基础数据类型都会自动转化成字符串(string)类型
字符串类型(引用类型):String
-
String不是基本数据类型,属于引用数据类型
-
使用方式与基本数据类型一致,String str = “abc”;
str = str +"XYZ" int n = 100; str = str + n;
//练习1
String str1 = 4; no
String str2 = 3.5f +""; yes
System.out.println(str2); 3.5
System.out.println(3+4+"Hello"); 7Hello
System.out.println("Hello"+3+4); Hello34
System.out.println('a'+1+"Hello"); 98Hello
System.out.println("Hello"+'a'+1); Helloa1
强制类型转换
- 属于自动类型转换的逆过程,将容量大的数据类型转成容量小的数据类型,使用时记得加上强制额酷炫转换符号:(),但可能会有精度降低或溢出
- 通常,字符串不能直接转换成基础数据类型,但可以通过基本类型的包装类将字符串转换成基本数据类型
- String a = “43”;int i = Integer.parsenInt(a);
- boolean类型不可以转换成其他的数据类型
//练习2
1.
short s = 5; s = s -2
2.
byte b = 3;b = b + 4; b = (byte)(b + 4);
3.
char c = 'a';
int i = 5;
float d = .314f;
double result = c+i+d;
4.
byte b = 5;
short s = 3;
short t = s + b;
4.运算符
算术运算符
赋值运算符
比较运算符(关系运算符)
逻辑运算符
位运算符
三元运算符
算术运算符
运算符 | 运算 | 例子 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | b=3;-b | -3 |
+ | 加 | 1+1 | 2 |
- | 减号 | 1-1 | 0 |
* | 乘 | 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” |
算术运算符应注意以下问题
- 如果对负数取余,可以把负数的负号忽略不计,如:5 % - 2 = 1,但被取余的数是负数则不可以被忽略,- 5 % 2 = -1 此外,取余运算的结果不一定总是整数
- 对于除号/,它的整数除和小数除是有区别的:整数做除法,只保留整数部分,舍弃小数
int x = 3510;
x = x / 1000 * 1000;
//x的结果是3000
- “+”
System.out.println("5+5="+5+5);
//打印结果是? 5+5=55
//练习1
public class SignTest {
public static void main(String[] args) {
int i1 = 10;
int i2 = 20;
int i =i1;
i1= i1+1;
System.out.println("i="+i); 10
System.out.println("i1="+i1);11
i1 = i1+1;
i = i1;
System.out.println("i="+i);12
System.out.println("i1="+i1);12
i = i2;
i2 = i2 - 1;
System.out.println("i="+i);20
System.out.println("i2="+i2);19
i2 = i2 -1;
i = i2;
System.out.println("i="+i);18
System.out.println("i2="+i2);18
}
}
练习2:
随意给出一个整数,打印显示它的个位数,十位数,百位数的值
格式如下:
数字XXX的情况如下:
个位数: 十位数: 百位数:
例如:
数字153的情况如下:
个位数:3 十位数:5 百位数:1
153 除以 10 = 15.....3 第一次操作
15 除以10 = 1....5 第二次操作
1 除以10 = 0 ....1 第三次操作
赋值运算符
- 符号 =
- 当=两侧的数据类型不一致,可以使用自动类型转换或使用强制类型转换原则进行处理
- 支持连续赋值
- 拓展: += -= *= /= %=
//思考1:
short s = 3;
s = s + 2;
s += 2;
//思考2:
int i = 1;
i *=0.1;
System.out.println(i);
i++;
System.out.println(i);
//思考3:
int m = 2;
int n = 3;
n *= m++; -> n=n*m; m=m+1;
System.out.println("m=" + m);
System.out.println("n=" + n);
//思考4(自行理解):
int n = 10;
n += (n++) + (++n); //n = n + (n++) + (++n) ; 加前 n1 加后 n2
//n = n1 + (n++) + (++n) ;
System.out.println("n=" + n);
比较运算符
运算符 | 运算 | 例子 | 结果 |
---|---|---|---|
== | 相等于 | 4 == 3 | false |
!= | 不等于 | 4 != 3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
instanceof | 检查是否是类的对象 | “Hello” instanceof String | true |
-
比较运算符的结果都是boolean型,也就是要么是true,要么是false
-
比较运算符 == 不要误写成 =
思考1:
boolean b1 = false;
if (b1 = true)
//区分好 == 和 = 的区别
System.out.println("结果为真");
else
System.out.println("结果为假");
逻辑运算符
&逻辑与 |逻辑或 !逻辑非
&&短路与 ||短路或 ^逻辑异或
a | b | a&b | a&&b | a|b | a||b | !a | a^b |
---|---|---|---|---|---|---|---|
T | T | T | T | T | T | F | F |
T | F | F | F | T | T | F | T |
F | T | F | F | T | T | T | T |
F | F | F | F | F | F | T | F |
-
逻辑运算符用于连接布尔表达式,在Java中不能写成3<x<6,应该写成 x>3 & x<6
-
“&” 和 "&&"的区别
- 单&时,左边无论真假,右边都要运算
- 双&时,如果左边为真,右边参与运算,如果左边为假,右边不参与运算
-
“|” 和"||"同理, ||表示:当左边为真,右边不参与运算
-
异或(^)和或(|)的区别:当左右都是true时,结果为false
int x = 1 , y = 1;
if (x++==2 & ++y==2){
x=7;
}
System.out.println("x="+x+"y="+y);
int x=1,y=1;
if(x++==2 && ++y==2){
x=7;
}
System.out.println("x="+x+"y="+y);
int x=1,y=1;
if(x++==1 | ++y==1){
x=7;
}
System.out.println("x="+x+"y="+y);
int x=1,y=1;
if(x++==1 || ++y==1){
x=7;
}
System.out.println("x="+x+"y="+y);
面试题(程序输出):
class Test{
public static void main(String args[]){
boolean x = true;
boolean y = false;
short z = 42;
if ((z++==42)&&(y=true)) z++;//44
if ((x=false)||(++z==45))z++;
System.out.println("z="+z);//46
}
}
运算符:位运算符(现阶段了解就行)
运算符 | 运算 | 例子 |
---|---|---|
<< | 左移 | 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 |
- 位运算是直接对整数的二进制进行运算
0110 & 0011 0010
0110 | 0011 0111
0110 ^ 0011 0101
~0110 (取反)–>1001(补码变原码)–> 1111 (二进制转十进制) --> -7
1111 (原码变补码)1000+1
1111 1111 1111 1111 1111 1111 1111 1001
>> 1111 1111 1111 1111 1111 1111 1111 1100
>>>0111 1111 1111 1111 1111 1111 1111 1100
三元运算符
格式:(条件表达式)?表达式1:表达式2;
-
条件表达式为true运算结果为1;
-
条件表达式为false运算结果为2;
int a = (false)?1:2; a=2
if else与三元运算符的区别
1.三元运算符可以简化if else
2三元运算符要求必须返回一个结果
3.if后的代码块可有多个结果
练习
假设有两个整数a,b(请自行给值)
用整数max来获取两个之间的较大值
public class Max{
public static void main(String[] args){
int a =11,b=13;
int max=(a>b)?a:b;
System.out.println("较大值为:"+max);
}
}
5.流程控制
在这之前,先讲一个键盘输入
//声明我们需要用到键盘输入
Scanner scanner = new Scanner(System.in);
// 1.告诉控制台,我们需要int类型的数据 2.将用户输入的值给到a
int a = scanner.nextInt();
程序流程控制流程
顺序结构
分支结构
循环结构
顺序结构
- 程序从上到下逐行执行,之间没有任何的条状或判断
java中定义成员变量时采用和发的前向引用
//正确的形式
public class Test{
int num1 = 12;
int num2 = num1 + 10;
}
//错误的形式
public class Test{
int num2 = num1 + 10;
int num1 = 12;
}
分支结构:
- 根据条件,选择性的执行代码
- if…else和switch-case两种分支语句
IF语句
if语句的三种格式
//形式1:
if (条件表达式) {
执行代码块;
}
//形式2:
if (条件表达式){
执行代码块1;
}else{
执行代码块2;
}
//形式3:
if (条件表达式1){
执行代码块1;
}else if (条件表达式2){
执行代码块2;
}....
else{
执行代码块n;
}
-
条件表达式必须是布尔表达式(关系表达式或逻辑表达式)或布尔变量
boolean a = true; if (a){ 执行代码块1; }
-
语句块只有一条执行语句时,{}可以省略,但是建议保留
-
if-else语句结构可以根据需要进行嵌套使用(参考形式3)
-
当if-else语句结构是形式3时,最后的else是可选项,根据需要可以省略
-
当多个条件是"互斥"关系时,条件判断语句的顺序无所谓
-
当多个条件是"包含"关系时,条件判断语句顺序是"小上大下/子上父下"
练习1: 需求如下: 小明去参加Java考试,他跟父亲大明达成承诺: 成绩为100分,奖励一张3080 成绩为(80,99]时,奖励一张3070 当成绩为(60,80]时,奖励一本<大话设计模式> 其它时,什么奖励都没有 请从键盘输入小明的期末成绩,并加以判断
switch-case结构
switch (表达式){
case 常量1:
语句1;
//break;
case 常量2:
语句2;
//break;
.....
case 常量n:
语句n;
//break;
default:
语句;
//break;
}
-
switch中表达式的值必须是下列的类型之一:byte,short,int,enum(jdk 5.0),String(7.0)
-
case子句的值必须是常量,不能是变量名或不确定的表达式值;
-
同一个switch语句所有的case子句的常量值互不相同
-
break是用来执行完一个case分支后使程序跳出switch语句块,如果没有break,程序会执行到switch结尾
-
default是可选的,同时位置也是灵活的,当没有匹配到case时,执行default
两种分支结构的对比
-
如果判断的具体数值不多,而且符合 byte short char int String Enum等类型 虽然两种语句都可以,但是建议是用switch 效率稍高
-
其他情况:如果对于区间的判断,对结果都是boolean的类型进行判断,使用if,if的使用范围更广
-
其实使用switch-case都是转变成if-else,反之不成立
循环结构:
- 根据循环的条件,重复性的执行某段代码
- 有while do…while for 三种循环语句
- JDK1.5后提供了foreach循环,方便遍历集合与数组元素
在某些特定的条件下,反复执行某段代码
for
while
do-while
循环语句有4个组成部分
- 初始化部分 init_statement
- 循环条件部分 test_exp
- 循环体部分 body_statement
- 迭代部分 alter_statement
for循环
for (1初始化部分;2循环条件部分;4迭代部分){
3循环体部分
}
执行过程:1-2-3-4-2-3-4-2-3-4-…-2
说明:
- 2循环条件部分为boolean类型表达式,当值为false时,退出循环
- 1初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
- 4迭代部分可以有多个变量更新,用逗号分隔
//1+2+3+.....+100 = 5050
int result = 0;
for (int i = 1;i<=100;i++){
result += i;
}
System.out.println("result="+result)
输入两个正整数m和n,用循环来求最大公约数和最小公倍数
比如 2 3 最大公约数=1 最小公倍数=6
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int max = (m>n)?m:n;
int GCD = 0;
int LCM = 0;
//最大公约数
for (int i = 1;i<=max;i++){
if (m%i==0 && n%i==0){
GCD = i;
}
}
//最小公倍数
for (int i = m*n;i>=max;i--){
if (i%m==0 && i%n==0){
LCM = i;
}
}
System.out.println(GCD+""+LCM);
While
1初始化部分
while(2循环条件部分){
3循环体部分;
4迭代部分;
}
执行过程:1-2-3-4-2-3-4-2-3-4-…-2
- 注意不要忘记声明4迭代部分,不然会陷入无限循环
- for和while可以相互转换
do-while循环
1初始化部分
do{
3循环体部分;
4迭代部分;
}while(2循环条件部分);
执行过程:1-3-4-2-3-4-2-3-4-…-2
- do-while循环至少执行一次循环体
while(true)
for(;;)
嵌套循环
for (int i=0;i<10;i++){
for (int j=0;j<10;j++){
if (true){
break;//此处的break将影响循环j
}
}
break;//此处的break将影响循环i
}
- 假设外层循环次数是n次,内层是m次,那么内层实际执行了n*m次
break continue的使用
break | continue |
---|---|
中止某个语句块的执行 | 跳过当前这一次循环,进入下一次循环 |
-
return:用来结束一个方法
-
return与break和continue不同的是,return会结束整个方法,不管这个return处于多少层循环中
-
break只能用于switch和循环
-
continue只能用于循环
-
break终止本层循环,continue跳过本次循环执行下一次循环
-
Java中没有goto
练习1:
100000000以内的所有质数
//最外层是需要找的质数
for (int i = 2;i <= 100;i++){
for (int j = 2;j <=Math.sqrt(i); j++){
if (i%j == 0) {
break;
}
}
if (j == i) sout(i);
}