Java02基础语法
一、Java基础语法(续)
1、变量
变量就是内存中的存储空间,空间中存储着经常发生改变的数据
-
定义格式:
数据类型 变量名 = 数据值;
int salary = 12000; //定义一个整型变量salary,并赋值12000;
注意:代码中等号右边的值给等号左边赋值!!!
-
使用
根据变量名进行使用
salary = 15000; //根据变量名salary修改变量值为15000;
-
注意事项
-
变量名不允许重复定义
-
一条语句可以定义多个变量,中间使用逗号分隔
int a,b; //定义两个整形变量a和b a=5;b=10; //给变量a、b赋值
-
变量在使用之前一定要进行赋值
-
变量的作用域范围
-
2、Debug工具
Debug是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。
Debug调试
又被称为断点调试,断点其实是一个标记,告诉Debug从标记的地方开始查看
-
如何加断点
选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可。
-
如何开启Debug运行
在代码区域右键 Debug 执行
-
点Step Over 这个箭头向下执行一步,也可以直接按 F8
-
点 Stop 结束
-
-
Debug控制台需要关注的信息
-
frames窗口
查看程序中正在执行的方法
-
Variables窗口
查看变量以及变量的变化过程
-
Console窗口
查看程序打印内容
-
-
如何删除断点
如果是多个断点,可以每一个再点击一次。也可以一次性全部删除
3、标识符
标识符就是给类,方法,变量等起名字的符号
-
标识符的命名规则
-
由数字、字母、下划线(_)和美元符($)组成
-
不能以数字开头
-
不能是关键字
-
区分大小写
-
-
标识符的命名规范
-
小驼峰命名
标识符是一个单词的时候,所有字母小写;标识符由多个单词组成的时候,从第二个单词开始,首字母大写
-
大驼峰命名
标识符是一个单词的时候,首字母大写;标识符由多个单词组成的时候,每个单词的首字母大写
-
4、数据类型
基本数据类型(四类8种)
-
整数:byte、short、int、long
-
浮点数:float、double
-
字符:char
-
布尔:boolean
取值范围以及内存占用情况
♥细节补充
所有整数默认int,所有小数默认double;char的取值范围是数值范围,因为根据ASCII编码表(编码表是计算机中字节到字符的一套对应关系)给出了每个字符所对应的底层二进制表示,其值就是将底层表示转换为对应的十进制的值。
使用思路
1、整数类型:首选int,如果发现int装不下了,将类型换成long类型(需要在数值后面加入L的标识)
2、小数类型:首选double,非要定义float类型的变量,需要在数值后面加入F标识
引用数据类型
5、Scanner键盘录入
引入
键盘录入可以使程序中使用的数据更加灵活
使用步骤
1、导包
import java.util.Scanner;
2、创建对象
Scanner sc = new Scanner(System.in);
3、定义变量接收录入的整形数据
int age = sc.nextInt(); //定义定义变量接收录入的整型数据
String name = sc.next(); //定义变量接收录入的字符串
二、运算符
1、运算符
1.1运算符和表达式
-
运算符:对字面量或者变量进行操作的符号
-
表达式:用运算符把字面量或者变量连接起来的符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。
符号 | 作用 | 说明 |
---|---|---|
+ | 加 | 两个数做加法,取和 |
- | 减 | 两个数做减法,取差 |
* | 乘 | 两个数做乘法,取乘积 |
/ | 除 | 两个数做除法,取结果的商 |
% | 取余 | 两个数做除法,取结果的余数 |
注意事项:
-
整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
-
取余运算的结果关乎被除数,被除数为正则结果为正,被除数为负则结果为负
数值拆分(小demo)
需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
分析:使用Scanner键盘录入一个三位数;
-
个位的计算:数值%10
-
十位的计算:数值/10%10
-
百位的计算:数值/10/10%10
类似的千位:数值/10/10/10%10
万位:数值/10/10/10/10%10......
tips:求最高位的时候可以简化计算
最高位是百位:数值/100;最高位是千位:数值/1000;最高位是万位:数值/10000
public class OperatorTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int num = sc.nextInt();
int ge = num%10;
int shi = num/10%10;
int bai = num/10/10%10;
System.out.println("整数"+num+"的个位为:"+ge);
System.out.println("整数"+num+"的十位为:"+shi);
System.out.println("整数"+num+"的百位为:"+bai);
}
}
1.2字符串拼接
当 + 操作中,遇到了字符串,这时 + 就是字符串连接符,而不是算术运算。
public class Test{
public static void main(String[] args) {
System.out.println("年龄为:"+23+1); //运行结果为:年龄231 可以理解成贪吃蛇原理,拼接的部分不断变成身体的一部分。“年龄为”这个字符串就是最开始的蛇蛇,因为是字符串所以后面+号为拼接,拼接23,变成“年龄23”,再遇到+号拼接1
}
}
public class Test{
public static void main(String[] args) {
System.out.println("年龄为:"+(23+1); //运行结果为:年龄24 括号的优先级很高,优先计算括号里,23+1没有字符串,所以是加法运算符,计算结果为24;再去前面的字符串拼接
}
}
2、自增自减运算符
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量自身的值加1 |
-- | 自减 | 变量自身的值减1 |
使用方式
2.1单独使用
++ 和 -- 无论是放在变量的前边还是后边,结果是一样的
2.2参与运算使用
-
变量后
在变量的后面,先拿变量的值进行运算,再对变量的值进行+1或-1
int a = 10; int b = a++; //a为11,b为10
-
变量前
在变量的前边,先对变量进行+1或-1,再拿变量的值进行运算
int a = 10; int b = ++a; //a为11,b为11
注意:++、--只能操作变量,不能操作常量
2.3分析demo
public class OperatorDemo {
public static void main(String[] args) {
int x =3;
//4+4+50
int y = (++x)+(x++)+(x*10);
System.out.println(x); //两次自增结果为5
System.out.println(y); //58 分析:第一个括号++x,先自增再运算,所以x以4参与,第二个括号x++,先运算再自增,x也是以4参加运算,然后自增为5,第三个括号执行时x已经变成5,所以是5*10
}
}
3、类型转换
3.1隐式转换
把一个取值范围小的数值或者变量,赋值给另一个取值范围大的变量
运算过程中的隐式转换
-
取值范围小的数据和取值范围大的数据进行运算,小的会先提升为大的之后,再进行运算
-
byte、short、char 三种数据在运算的时候,都会提升为int,然后再进行运算
public class OperatorDemo1 { public static void main(String[] args) { byte a = 10; byte b = 20; byte c = a+b; //此处byte会报错,因为byte类型做运算时会先提升为int,相当于两个int相加,结果为int类型,不能用byte接 } } public class OperatorDemo1 { public static void main(String[] args) { int a = 1; char b = 'a'; int c = a + b; //结果为98,char类型转成int参与运算的是其对应的ASCII码值,a的ASCII码97 } }
3.2强制转换
把一个取值范围大的数值或者变量,赋值给另一个取值范围小的变量时,不允许直接赋值,需要加入强制转换。
格式:
目标数据类型 变量名 = (目标数据类型)被强转的数据
public class OperatorDemo1 {
public static void main(String[] args) {
double a =12.3;
int b = (int)a;
System.out.println(b); //结果为12
}
}
注意事项:
避免强转,可能会造成精度丢失!!!
int a = 130;
byte b = (byte)a; //结果为-126
3.3类型转换面试题
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2; //报错 b1和b2是两个byte类型, 相加的时候都会提升为int,提升之后就是两个int相加, 相加的结果还是int, 将int类型的结果赋值给byte类型的变量,属于大的给小的赋值, 不允许直接赋值.
/*
解决方案:
方案1: int b3 = b1 + b2;
方案2: byte b3 = (byte)(b1 + b2);
*/
byte b4 = 3 + 4; //正确,不报错
/*
疑惑点: 认为代码会有错误, 3 和 4 是两个字面量, 默认都是int, 相加的结果还是int
回答: 不存在错误, 因为Java存在字面量优化机制
在javac的时候(编译的时候), 就会将3和4相加, 计算出7
字节码文件中(.class)实际代码为byte b4 = 7;
*/
4、关于进制
计算机中存储数据的单位是字节。每个字节在计算机底层,都是以二进制的形式进行体现的。
4.1进制分类及书写规范
-
二进制
-
二进制数据是用0和1两个数码来表示。进位规则是“逢二进一”,借位规则是“借一当二”
-
书写规范:在数值前面带上0b
-
-
十进制
-
由0、1、2、3、4、5、6、7、8、9进行表示。逢十进一,借一当十。
-
书写规范:一般我们所写的都表示十进制,没有特殊标识
-
-
八进制
-
采用0,1,2,3,4,5,6,7八个数字,逢八进1
-
书写规范:在数值前面加上0
System.out.printIn(09); //会报错,0开头表示八进制数,但八进制中没有9
-
-
十六进制
-
用数字0到9和字母A到F(或a~f)表示,其中: a~f 表示10~15,这些称作十六进制
-
书写规范:在数值前面加上0x
-
4.2二进制转十进制
公式法
8421转换法
二进制中, 每一位的1都是代表一个固定数值,把每一位的1代表的十进制数加起来得到的结果就是它所代表的十进制数。
4.3原码反码补码
原码
数据的二进制体现形式,一个字节由 8 个二进制位组成。最左侧的数据为高位,也叫符号位, 0 代表正数,1 代表负数,其余位,表示数值大小。
弊端:遇到负数运算,会出现错误
♥计算机在运算的时候,都是以二进制补码的形式在运算
反码
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外
补码
正数的补码与其原码相同;负数的补码是在其反码的末位加1
5、赋值运算符
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值给a |
-= | 减后赋值 | a-=b,将a-b的值给a |
*= | 乘后赋值 | a=b,将a ×b的值给a |
/= | 除后赋值 | a/=b,将a/b的值给a |
%= | 取余后赋值 | a%=b,将a/b的余数给a |
!!!注意事项:扩展的赋值运算符隐含了强制类型转换
short s = 1;
s = s + 1; //大给小报错
/*
修改方案1:s = (short)(s + 1); 修改方案2:s += 1;
*/
6、关系运算符
符号 | 说明 |
---|---|
== | a==b,判断a和b的值是否相等,成立为true,不成立为false |
!= | a!=b,判断a和b的值是否不相等,成立为true,不成立为false |
> | a>b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于等于b,成立为true,不成立为false |
< | a<b,判断a是否小于b,成立为true,不成立为false |
<= | a<=b,判断a是否小于等于b,成立为true,不成立为false |
!!!注意事项:关系运算符的结果都是boolean类型,要么是true,要么是false,千万不要把==误写成=,两者有本质区别
7、逻辑运算符
逻辑运算符连接布尔类型的表达式,或是值,可以用来整合多个条件为一段整体的逻辑
符号 | 介绍 | 说明 |
---|---|---|
& | 逻辑与 | 并且,遇false则false |
| | 逻辑或 | 或者,遇true则true |
! | 逻辑非 | 取反 |
^ | 逻辑异或 | 相同为false,不同为true |
&& | 短路与 | 作用和&相同,但是有短路效果 |
|| | 短路或 | 作用和|相同,但是有短路效果 |
注意区分
-
单与&和双与&&
-
&:无论左边为true或false,右边都执行
-
&&:如果左边为true,右边执行;如果左边为false,右边不执行
public class Operator { public static void main(String[] args) { int x = 3; int y = 4; //false & false boolean result = ++x > 5 & y-- <4; System.out.println(result); //false System.out.println(x); //4 System.out.println(y); //3 逻辑与两边都要执行,y--变成3 } } public class Operator { public static void main(String[] args) { int x = 3; int y = 4; //false boolean result = ++x > 5 && y-- <4; System.out.println(result); //false System.out.println(x); //4 System.out.println(y); //4 短路与不执行右边,y--不执行 } }
-
-
单或|和双或||
-
|:无论左边为true或false,右边都要执行
-
||:如果左边为false,右边执行;如果左边为true,右边不执行
-
最常用的逻辑运算符:&&、||、!
8、三元(三目)运算符
8.1格式
判断条件 ? 值1 : 值2;
8.2执行流程
首先计算判断条件的值
如果值为true,值**1**就是运算结果
如果值为false,值**2**就是运算结果
8.3求最大值demo
需求:键盘录入三个整数,求出最大值并在控制台打印
public class OperatorDemo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入三个整数:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
int tempMax = num1>num2?num1:num2;
int max = tempMax>num3?tempMax:num3;
System.out.println("最大值为:"+max);
}
}
9、运算符的优先级
优先级 | 运算符 |
---|---|
1 | .(){} |
2 | !、-、++、-- |
3 | *、/、% |
4 | +、- |
5 | <<、>>、>>> |
6 | <<、<=、>、>=、instanceof |
7 | ==、!= |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ?: |
14 | =、+=、-=、*=、/=、%=、&= |
记住一句话:与的优先级大于或!