目录
一. 变量
1. 变量的定义
●在程序运行期间可以改变的量
●定义变量的两种方式
a.先定义再赋值
数据类型 变量名;
变量名 = 对应类型的值;
b.定义并且直接赋值
数据类型 变量名 = 对应类型的值;
//声明变量并赋值: 数据类型 变量名 = 值; int num1 = 10; System.out.println(num1);//10 num1 = 5; System.out.println(num1);//5 //先声明后赋值 ///数据类型 变量名; //变量名 = 值; int num2; num2 = 77; System.out.println(num2);//77
2. 变量名的命名要求
●变量名是由 英文字母、下划线_、$符号,数字组成,其中数字不能做开头,
●小驼峰命名法 uesrName 见名知意
●不能使用Java关键字作为变量名.例如:public static do while for void等.
二. 基本数据类型
在 Java 中定义了 8 种基本数据类型:
● 数值型
整数类型: byte , short , int , long
浮点数类型: float , double
● ⾮数值型
字符类型: char
布尔类型: boolean
不同的数据类型占用的字节数不一样,Java基本数据类型占用的字节数
1. 整型
//数据类型 变量名 = 值; //数据类型: 基本数据类型: 整数 (byte short int long) // 浮点数 (float 4 double 8) // 布尔 boolean // 字符 char // 引用数据类型: 字符串 //变量名: 数字 字母 下划线 $符号组成,不能以数字开头,不能是关键字 // 小驼峰命名法 uesrName 见名知意 //注意事项: 同范围内变量名不能重复 byte b=-128;//byte -- 1字节 -128~127 System.out.println(b); short s= 2;//short -- 2字节 2^16 -2^15~2^15-1 System.out.println(s); int i = 2147483647;//int -- 4字节 2^32 -2^31~2^31-1 System.out.println(i); long lo = 2147483648L;//long -- 8字节 2^64 -2^63~2^63-1 System.out.println(lo);//long类型的变量值后加L
[注]:对于long类型,需要加上l或L后缀,由于l与数字1相近似,所以一般都采用L后缀
2. 浮点型
// float - 4 // double - 8 float f = 3.14f;// 后面要加F,声明为float类型 float f1 = 3.14e38f; System.out.println(f); System.out.println(f1); double d = 3.1415926; double d1 = 3.1415926e21; System.out.println(d); System.out.println(d1);
3. 字符型
// char -- 2字节 0~65535 char c = '天'; System.out.println(c);//天 char c1 = 'A'; System.out.println(c1);//A char c2 = 97; System.out.println(c2);//a
4. 布尔类型
布尔类型 boolean 只有 true 和 false 两个值,布尔类型通常是关系运算的计算结果。
// 布尔类型 boolean // boolean类型被编译成int类型来使用 占用4个byte // boolean数组被编译成byte数组 每个boolean数组成员占用一个byte boolean b1 = true; boolean b2 = false; System.out.println(b1);//true System.out.println(b2);//false // 保存关系运行后的结果 boolean b3 = 10 > 8; System.out.println(b3);//true int age = 77;// 定义变量参与运算 boolean b4 = (age >= 70); System.out.println(b4);//true
三. 引用数据类型(字符串)
除了上述8种基本数据类型以外,其余类型均为“引用数据类型”。最常见的引用数据类型是String字符串,用于保存若干个字符:
// 引用数据类型 ---字符串(值用引号引起来的内容叫做字符串) String s1 = "白日依山进"; String s2 = s1; System.out.println(s1);// 白日依山进 System.out.println(s2);// 白日依山进 System.out.println(s1.charAt(0));// 白
四. 常量
定义变量的时候,如果加上 final 关键字,这个变量就变成了常量。常量在定义时,必须进 ⾏初始化赋值,之后就不可再次赋值,再次赋值会导致编译错误。
// final 修饰变量 ----变成常量 值不可发生变化(基本数据类型) // 常量命名建议使用大写字母 final double PI = 3.14; System.out.println(PI);
五. 数据类型转换
(数值、字符)数据是不同的数据类型之间进行相互转换操作
1. 自动类型转换
小范围--->大范围不需要任何特殊操作,直接进行转换就行
//数据类型转换:(数值、字符)数据是不同的数据类型之间进行相互转换操作 //自动类型转换:小范围--->大范围不需要任何特殊操作,直接进行转换就行 //强制类型转换:大范围--->小范围 byte b = 10; int i = b;//byte类型变量可以直接存储到int类型中 System.out.println(i);//10 short s = 255; i = s;//short类型变量可以直接存储到int类型中 System.out.println(i);//255 long lo = 1222L; float f = lo;//long->float System.out.println(f);//1222.0 char c = '中'; i = c;//char-->int System.out.println(i);//20013
如图所示,实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
2. 强制类型转换
●大范围--->小范围
●小范围数据类型 变量名 = (小范围数据类型) 大范围的值;
●用于强制的转换一个数值的类型,可能造成精度降低或溢出。
//强制类型转换:大范围--->小范围 //小范围数据类型 变量名 = (小范围数据类型) 大范围的值; //溢出 //精度丢失 int i = -129; byte b = (byte)i;//可能存在溢出 System.out.println(b);//127 溢出 float f = 12.0F;//float-->int 可能存在的问题 精度丢失 int num = (int)f; System.out.println(num);//12
2.1 溢出
// 进行强制类型过程中可能会产生的问题 // 溢出 // 精度丢失 // 整数 -- 整数 溢出 int i = 128; byte b = (byte) i; System.out.println(b);//-128 // 浮点数 --整数,超过其取值范围 结果为最大值 或最小值 float f = -4.3e16F; int num = (int) f; System.out.println(num);//-2147483648
2.2 四舍五入
//对浮点数进行四舍五入取整操作 double d = 12.53; //方式1: System.out.println(Math.round(d));//13 //方式2: int num = (int)(d+0.5); System.out.println(num);//13
2.3 字符
//97--a 65--A 48--0 int num = 97; char ch = (char)num; System.out.println(ch);//a float f1 = 65.9F; char ch1 = (char)f1; System.out.println(ch1);//A
2.4 布尔类型
boolean类型不能参与类型转换
//boolean类型不能参与类型转换 boolean b = true; int i =(int)b;
六. 运算符
1. 算术运算符
1.1 基本四则运算符
//单目:+ - //双目:+ - * / % //不同的数据类型进行运算得到的结果为 大范围的数据类型 int a = 10; double b= 3; int add = (int)(a+b); System.out.println(add);//13 System.out.println(a-b);//7.0 System.out.println(a*b);//30.0 System.out.println(a/b);//浮点数进行除法运算得到 浮点数 System.out.println(a%b);//1.0
[注]:整数的除法对于除数为0时运行时将报错,但编译不会报错。
1.2 char也可以参与运算
//不同的数据类型进行运算后结果为大范围的数据类型 char c = 'a'; char c1 = (char)(c+1); System.out.println(c1);//b byte b = 12; int b1 = b+10; System.out.println(b1);//22
1.3 类型提升
//1.byte short char 在进行运算的时候会进行类型提升 提升到int类型 byte b1 =126; byte b2 =2; int b3 = b1+b2; byte b4 = (byte)(b1+b2); System.out.println(b3);//128 System.out.println(b4);//-128 //2.javac编译的时候完成了加法运算 // .class字节码文件中存储的是 byte num = 14 byte num = 12+2; System.out.println("num的值为"+num);//num的值为14
1.4 溢出
由于整数存在范围限制,如果计算结果超出了范围,就会产生溢出,而溢出不会出错,会得到一个奇怪的结果,例如:
//溢出 整数范围限制 超过范围溢出的问题产生 int a = 2147483647; int b = 1; int add = a + b; System.out.println(add);//-2147483648 //浮点数溢出 double d1 = 0.0 / 0;//NaN not a number System.out.println(d1); double d2 = 10.0 / 0;//Infinity System.out.println(d2); double d3 = -10.0 / 0;//-Infinity System.out.println(d3);
1.5 浮点数
// 浮点数运算的时候需要注意 double x = 10 - 9.9; double y = 1.0 - 9.0 / 10; System.out.println(x);// 0.09999999999999964 System.out.println(y);// 0.09999999999999998 System.out.println(x == y);// false // 浮点数相等一般用误差来判断 System.out.println(Math.abs(x - y) < 0.00001);// true
2. 赋值运算符
//1.注意先运算等号右边的值 再进行赋值运算 //2.自带强制类型转换 byte a = 10; a += 2;// a=(byte)(a+2); a -= 2;// a=a-2; System.out.println(a);// 10 a *= 2 + 1;// a=a*(2+1); System.out.println(a);// 30 a /= 2 + 1;// a=a/(2+1); System.out.println(a);// 10 a %= 3;// a=a%3; System.out.println(a);// 1
3. 自增/自减运算符
//1.只能用在变量上,不能用在常量上 //2.单独使用++ --,在变量前或者变量后,结果一致。 //3.混合使用: //++(+1) --(-1)在变量的前面,先执行+1或者-1操作,再赋值给其他变量 //++(+1) --(-1)在变量的后面,先赋值,再执行+1或者-1操作 int a = 10; a++;// a= a+1; ++a;// a= a+1 a--;// a= a-1 --a;// a= a-1 System.out.println(a);// 10 // a的值为10 int b = --a; System.out.println(b);// 9 System.out.println(a);// 9 System.out.println("==========="); int num = 100; int c = num--; System.out.println(c);// 100 System.out.println(num);// 99
[注] ++写在前面和后面计算结果是不同的,
++n表示先加1再引用n,
n++表示先引用n再加1。
4. 关系运算符
●关系运算符: >,>=,<,<=,==,!=
●关系运算符用于计算 数值 与 数值 之间的大小等值关系,计算结果为boolean值
//关系运算符: >,>=,<,<=,==,!= boolean flag = 5==3.0; System.out.println(flag);//false int score = 99; System.out.println(score>=99);//true char c='&';//字符也可以参与运算 System.out.println(c>=97);//false
5. 逻辑运算符
● &与左右两边都为真的时候结果才为真,其他为false
●&&--短路与
●|或左右两边有真则为真,全假则为假
● ||--短路或
●! --取反操作●逻辑运算符用于计算boolean值与boolean值之间的与或非逻辑关系,计算结果为boolean值
System.out.println(true & true);//true System.out.println(false & true);//false System.out.println(true & false);//false System.out.println(false & false);//false System.out.println("==========="); System.out.println(true | true);//true System.out.println(false | true);//true System.out.println(true |false);//true System.out.println(false | false);//false
●如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。因为false && x的结果总是false,无论x是true还是false,因此,与运算在确定第一个值为false后,不再继续计算,而是直接返回false。
●同理,对于||运算,只要能确定第一个值为true,后续计算也不再进行,而是直接返回true:
int num1 = 1; int num2 = 0; System.out.println((num1<num2)&&(num1>num1/num2));//false // System.out.println((num1<num2)&(num1>num1/num2));//报错 算术异常 System.out.println((num1>num2)||(num1>num1/num2));//true // System.out.println((num1>num2)|(num1>num1/num2));报错 算术异常
6. 位运算
位运算是按照整数的二进制位进行移位、与、或、非、异或的运算,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等数据类型(浮点型不能进行位运算)。
6.1 与运算 &
与运算的规则是,必须两个数同时为1,结果才为1:
// 位运算操作对象二进制 int a = 5; int b = 6; // &按位与两个都为1,结果为1 System.out.println("与 " + (a & b));// 4
6.2 或运算 |
或运算的规则是,只要任意一个为1,结果就为1:
// |按位或两个有1则,结果为1 System.out.println("或 " + (a | b));// 7
6.3 非运算 ~
非运算的规则是,0和1互换(反转):
System.out.println("非"+(~a));//-6
6.4 异或运算 ^
异或运算的规则是,如果两个数不同,结果为1,否则为0:
// ^按位异或只要两边不相同就为1 System.out.println("异或 " + (a ^ b));// 3
6.5 移位运算 << 或 >>
// <<移动指定的数字次数,每移动1次,在原来的基础上扩大2倍 // >>移动指定的数字,每移动1次,在原来的基础上缩小一半 System.out.println("左移 " + (a << 1));// 10 System.out.println("右移 " + (b >> 1));// 3
简单来理解:左移实际上执行乘法,右移实际上执行除法
6.6 用途
6.6.1 两数交换
原理: a^0=a; a^a=0;
//对两数进行交换 int a =5; int b =6; // //方式1:设置一个第三方的临时变量 // int temp =b; // b=a; // a=temp; // System.out.println(a); // System.out.println(b); //方式2: 位运算 异或进行两数的交换 a=a^b; b=a^b; a=a^b; System.out.println(a); System.out.println(b);
6.6.2 判断奇偶数
○ a&1 == 0 偶数
○ a&1 == 1 奇数//判断某个数字是否为奇偶数 int a = 11; boolean b = a % 2 == 0; System.out.println("是否为偶数:" + b);//false System.out.println("是否为偶数:" + ((a & 1) == 0));//false System.out.println("是否为奇数:" + ((a & 1) == 1));//true
6.6.3 求平均值
求平均值,防止溢出:(x&y)+((x^y)>>1)
原理:
①x&y 是取相同的位与,这个结果是x和y相同位的和的一半;
②x^y 是取x和y的不同位,这个结果相当于x和y不同位的和,然后右移1位,相当于对这个和除以了2;
③最后这两部分相加,就得到了x和y的平均数;
// 求两数之间的平均值 int a = 2147483647; int b = 2147483647; // 溢出 System.out.println((a + b) / 2); // 位运算 (x&y)+((x^y)>>1) System.out.println((a & b) + ((a ^ b) >> 1));
7. 条件运算符
Java还提供一个三元运算符b ? x : y。首先计算b,如果b为true,则只计算x,否则,只计算y。此外,x和y的类型必须相同,因为返回值不是boolean,而是x和y之一。
//条件表达式:表达式1?表达式2:表达式3 //表达式1一定为布尔类型 int a =10; String result =(a&1)==0?"是偶数":"是奇数"; System.out.println(result);//是偶数 //60以下 ---c //[60 - 80) --B //>=80 --A int score =59; String result1 = score>=80?"A":(score>=60?"B":"C"); System.out.println(result1);//c
七. 一些练习
1.请编写程序,输出最大值、最小值、中间值。
int x =12,y=8,z=39; int max =(x>y)?(x>z?x:z):(y>z?y:z); int min =(x<y)?(x<z?x:z):(y<z?y:z); int sum =x+y+z; int mid =sum-max-min; //方法2 // int mid1 = x>y?(x<z?x:(z>y)?z:y):(y<z?y:(z<x)?x:z); // System.out.println(mid1); System.out.println(max);//39 System.out.println(min);//8 System.out.println(mid);//12
2.请编写程序,检查年份year,并按照下述判断条件,获取该年份的检查结果。
要求:使用三元运算符实现
●普通闰年:能被4整除但不能被100整除的年份。例如:2004年
●世纪闰年:能被400整除。例如:2000年
●普通平年:不满足闰年条件。int year = 2024; String result = year % 4 == 0 ? (year % 100 == 0 ? "世纪闰年" : "普通闰年") : "普通平年"; System.out.println(result);//普通闰年
3.变量ch是一个英文字母,如果此字母是小写,请将小写转大写,如果此字母是大写,请将大写转小写,并输出
char ch = 'A'; char result = (ch >= 'a' && ch <= 'z') ? (char) (ch - 32) : (char) (ch + 32) ; System.out.println(result);