一、变量
1.1 概念
在程序运行中,可以发生改变的量。
在内存中,需要一个空间,临时存储数据。
1.2 变量的组成及定义
-
数据类型 变量名 值
-
声明的同时并赋值
- 数据类型 变量名 = 值;
-
先声明,后赋值
- 数据类型 变量名; 变量名 = 值
-
多个同类型的变量声明与赋值。
- 数据类型 变量名1,变量名2,变量名3;
- 变量名1 = 值;变量名2 = 值;变量名3 = 值;
-
代码实现:
-
public class VarTest{ public static void main(String[] args){ //1.声明同时 赋值 int a = 10; System.out.println(a); //2.先声明,后赋值 int b; b = 20; System.out.println(b); //3.同类型的声明与赋值(了解) int c = 30,d,e; //c = 30; //d = 40; e = 50; System.out.println(c); System.out.println(d); System.out.println(e); } }
1.3 变量的使用注意事项
public class VarTest1{ public static void main(String[] args){ //1.变量不初始化,不能使用 int a = 20; System.out.println(a); //2.在相同作用域({}作用域)中,不能定义重名的变量 //int a = 30; //System.out.println(a); //3.变量在使用时,可以与""字符串拼接 int b = 20; int c = 30; int d = 40; //+在Java中,任何变量与字符串相加,实为拼接。 System.out.println("b="+b+",c="+c+",d="+d); //b=20,c=30,d=40 //4.变量在作用域中,可以更改值 d = 128; System.out.println("d="+d); } }
-
二、数据类型
2.1 概念
- 不同的数据,分配不同的空间,来存储数据。避免空间的不足、空间的浪费。
- 基本数据类型:
- 4类8种
- 整数型:byte 1字节、short 2字节、int 4字节、long 8字节
- 浮点数型:float 4字节、double 8字节
- 字符型:char 2字节
- 布尔型:boolean 1字节
- 引用数据类型:
- 基本数据类型以外的全是引用数据类型
2.2 计算机存储单位
- 字节->kb->mb->gb->tb->pb
- 以上单位都是1024进制。
- bit(位)->字节 8个bit ->1字节
- 0111 1111
2.3 整数类型
/*
byte 1 -2^7 ~ 2^7-1 -128 ~ 127
short 2 -2^15 ~ 2^15-1
int 4 -2147483648~2147483647
long 8 -922京 ~ 922京
1、int是Java中整数的默认类型。 超过int类型,则提示过大的整数
2、超过int范围的数字,要存储在long里,要加l/L的标识
*/
public class IntTest{
public static void main(String[] args){
byte b = 127;
System.out.println("b="+b);
short s = 32767;
System.out.println("s="+s);
int i = 21_4748_3647;
System.out.println("i="+i);
long l = 2147483648L;
System.out.println("l="+l);
}
}
2.4 浮点数类型
/*
float: 4 单精度
double: 8 双精度
符号位 指数位 尾数位
float 1 8 23 838_8608 = 7位精确小数
double 1 11 52 4503_5996_2737_0496 16位精确小数 最高
1、浮点数的默认类型是double
2、存储float类型的数据,要加f/F的标识
3、能精确模拟的小数,就不会保留多余的位数
4、要用小数做运算的场景,不会用float和double,BigDecimal
5、浮点数类型的范围>整数类型。
*/
public class DoubleTest{
public static void main(String[] args){
float f = 3.14F;
System.out.println("f="+f);
double d = 3.14;
System.out.println("d="+d);
double dd = 3.111111111111111111111111111;
System.out.println(dd);
double d1 = 0.1;
double d2 = 0.2;
System.out.println(d1+d2);//0.30000000000000004
double d3 = 0.3;
System.out.println(d3);
double score = 99.5;
}
}
2.5 字符类型
/*
char 表示单个字符 0101 ASCII 本质存储的是字符的编码值
1、Java中char存储的unicode编码 所有的国家的文字都可以表示
2、char可以存储字符,字符会转换为编码值,也可以直接存储编码值
3、char不能直接存储空字符'' '\0'可以 空格也可以。
*/
public class CharTest{
public static void main(String[] args){
//0 1 男 女
//char c7 = ' ';
char c7 = '\0';
System.out.println("c7="+c7);
char c = 'A';
System.out.println("c="+c);
char c2 = 'の';
System.out.println("c2="+c2);
char c3 = '你';
System.out.println("c3="+c3);
char c4 = 65;
System.out.println("c4="+c4);
char c5 = 20320;
System.out.println("c5="+c5);
//了解
char c6 = '\u4f60';
System.out.println("c6="+c6);
}
}
转义字符:
/*
转义字符:
\:将普通字符转换为特殊的符号
将特殊符号转换为普通字符
\n:换行
\t:一个水平制表位 大空格
\":将字符串的"转换为普通符号
\': 字符的符号转换为普通符号
\b:退格
\r:回车 回到开头
*/
public class CharTest2{
public static void main(String[] args){
System.out.println("白日依山尽,\n黄河入海流。");
System.out.println("白日依山尽,\t黄河入海流。");
System.out.println("\"白日依山尽,\"\t黄河入海流。");
System.out.println("白日依山尽,'黄河入海流。");
System.out.println("白日依山尽,\b黄河入海流。");
System.out.println("白日依山尽,\r黄河入海流。");
char c = '\'';
System.out.println(c);
}
}
2.6 boolean类型 布尔
/*
boolean 类型 取值 true false
*/
public class BooleanTest{
public static void main(String[] args){
boolean b = true;
b = false;
System.out.println("b="+b);
//做为判断的结果
System.out.println(3 > 2);
}
}
2.7 String 引用数据类型
-
String代表的是字符串,不属于基本数据类型,属于引用数据类型,类型是String,本质上是一个类,但是String类型定义赋值的时候,而是和基本数据类型一样。
-
public class StringTest{ public static void main(String[] args){ String s = "我是一个好人!"; System.out.println(s); System.out.println("s="+s); System.out.println("请输入菜单的选项:"); System.out.println("1:注册"); System.out.println("2:登录"); } }
三、进制(了解)
3.1 进制的转换
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | a或A |
11 | 1011 | 13 | b或B |
12 | 1100 | 14 | c或C |
13 | 1101 | 15 | d或D |
14 | 1110 | 16 | e或E |
15 | 1111 | 17 | f或F |
16 | 10000 | 20 | 10 |
3.2 二进制存储
/*
无论是什么进制,最终计算机存储的都是二进制
二进制是如何表示整数的:
1.二进制存储的是补码 最高位 是符号位 0正数 1 负数
2.正整数 三码合一 原码、 反码、补码是一样的。
3.负整数
原码:10进制转换为2进制 且最高位是1
反码:最高位不变 其余位取反
补码:反码+1
-6
原码:1000 0110
反码:1111 1001
补码:1111 1010 计算机存储的
-25
原码:1001 1001
反码:1110 0110
补码:1110 0111 计算机存储的
byte = 1字节 = 8位
1000 0000
0000 0000 0000 0000
*/
public class DataTest{
public static void main(String[] args){
System.out.println(100);
System.out.println("二进制:");
System.out.println(0b110);
System.out.println(0B110);
System.out.println("八进制");
System.out.println(0110);
System.out.println("十六进制");
System.out.println(0x11);
}
}
四、数据类型转换
4.1 数据类型转换概念
- 数据类型转换发生在7个基本数据类型里,除了boolean。
- 等号左右两侧的类型不一致时,就会发生数据类型转换。
4.2 自动类型提升
/*
byte 1 水杯
short 2 水壶
char 2 水壶
int 4 水桶
float 4 水缸
long 8 水池
double 8 大河
自动类型提升:
1.小的数据类型的值赋值给大的数据类型
2.如果多个类型的值做运算,结果是最大的类型
3.特殊:任何数据类型和String做+拼接时,结果都是String类型。
*/
public class ConvertTest{
public static void main(String[] args){
//System.out.println(9+7+"HelloWorld");
System.out.println(9+"HelloWorld"+7);
//2.如果多个类型的值做运算,结果是最大的类型
float result = 30+20L+3.14F;
System.out.println(result);
//1.将小的数据类型的值赋值给大的数据类型
byte b = 10;
int i = b;
System.out.println(i);
char c = 'c';//99
int i2 = c;
System.out.println(i2);
int i3 = 200;
float f = i3;
System.out.println(f);
long l = 300;
float f2 = l;
System.out.println(f2);
}
}
4.3 强制类型转换
/*
byte 1 水杯
short 2 水壶 -32768 ~ 32767
char 2 水壶 无符号 0~65535
int 4 水桶
float 4 水缸
long 8 水池
double 8 大河
自动类型提升:
1.小的数据类型的值赋值给大的数据类型
2.如果多个类型的值做运算,结果是最大的类型
3.特殊:任何数据类型和String做+拼接时,结果都是String类型。
强制类型转换:
1.将大的数据类型的值赋值给小的数据类型
小数据类型 变量名 = (小数据类型)大的数据类型值;
2.小数转换为整数时,没有四舍五入,将小数位全部舍掉
*/
public class ConvertTest2{
public static void main(String[] args){
//128 64 8
int i5 = 200;//0000 0000 1100 1000
//-128 64 8 =
byte b2 = (byte)i5;//1100 1000
System.out.println(b2);
//较大的整数转换为较小的整数,会发生数据截断和符号位发生改变
int i4 = 128;
byte b = (byte)i4;
System.out.println(b);
//整数转换为字符,在编码范围内的,不会丢失
int i3 = 65555;
char c = (char)i3;//超过取值范围,会发生数据截断。
System.out.println(c);
//1.小数转整数,小数位丢失
double d = 3.99;
int i = (int)d;
System.out.println(i);
float f = 9.6F;
int i2 = (int)f;
System.out.println(i2);
}
}
4.4 表达式运算结果类型提升
/*
常量值运算不会发生数据类型提升。
byte、short、char类型的变量参与运算,结果都会提升为int
*/
public class ConvertTest3{
public static void main(String[] args){
//后边表达式是值与值的运算,
byte b = 10 + 10;
System.out.println(b);
/*
byte b2 = 10;
byte b3 = b2 + 10;
System.out.println(b3);
*/
char c = 'A'+1;
System.out.println(c);
char c2 = (char)(c+1);
System.out.println(c2);
//String str1 = 4; //判断对错: 错
String str2 = 3.5f + ""; //判断str2对错:对 任意类型与字符串+都为拼接
System.out.println(str2);
System.out .println(3+4+"Hello!"); //输出:7Hello
System.out.println("Hello!"+3+4); //输出:Hello!34
System.out.println('a'+1+"Hello!"); //输出: 98Hello!
System.out.println("Hello"+'a'+1); //输出:Helloa1
}
}
五、运算符
5.1 算数运算符
算术运算符(7个) +、-、*、/、%、++、–
/*
* 算数运算符:
* +
* 加法运算
* 字符串拼接
* 正号
* -
* 减法运算
* 负号
* *
* 乘法
* /
* 除法
* %
* 模运算
* 取余数
* */
public class OperatorTest1 {
public static void main(String[] args) {
System.out.println("********* % *********");
System.out.println(5 % 2);//1
System.out.println(5 % -2);//1 以被除数为准
System.out.println(-5 % -2);
System.out.println("********* + *********");
int a = 10;
int b = 20;
System.out.println(a + b);
int c = +30;
System.out.println("c = " + c);
System.out.println(9 + 6 + "HelloWorld");//拼接
System.out.println("********* - *********");
System.out.println(5 - 2);
System.out.println(-20);
System.out.println(5 - 2.5);
System.out.println("********* * *********");
System.out.println(2 * 3);
System.out.println(2.5 * 2);
System.out.println("********* / *********");
// 表达式中,整数与整数运算,除不尽时,只保留整数。小数位直接舍掉
System.out.println(5 / 2);
// System.out.println(5 / 0);//会报错:除数不能为0
System.out.println(5.0 / 2);
}
}
/*
* ++
* 前++
* ++a : 先+1,再运算
* 后++
* a++ : 先运算,再加1
* --
*
* */
class OperatorTest3{
public static void main(String[] args) {
int a= 5;
// System.out.println(--a);
// int result = --a + a + a--;
// System.out.println("result = " + result);
}
}
public class OperatorTest2 {
public static void main(String[] args) {
int a = 5;
// System.out.println(++a); 6
// System.out.println(a++);
// System.out.println(a);
// 5 6
// int result = a++ + a;
// 6 6
// int result = ++a + a;
// System.out.println("result = " + result);
++a;
System.out.println(a);
}
}
5.2 赋值运算符
赋值运算符 | 符号解释 |
---|---|
= | 等号右边的值,赋值给等号左边的变量 |
+= | 将符号左边的值 和右边的值 进行相加 操作,最后将结果赋值给左边的变量 |
-= | 将符号左边的值 和右边的值 进行相减 操作,最后将结果赋值给左边的变量 |
*= | 将符号左边的值 和右边的值 进行相乘 操作,最后将结果赋值给左边的变量 |
/= | 将符号左边的值 和右边的值 进行相除 操作,最后将结果赋值给左边的变量 |
%= | 将符号左边的值 和右边的值 进行取余 操作,最后将结果赋值给左边的变量 |
/*
* 赋值运算符
* =
* +=
* -=
* *=
* /=
* %=
* 注意:不会更改原有的数据类型,在编译后,如果接受的变量的是小类型 会自动强转
* */
public class FuZhiTest {
public static void main(String[] args) {
int a = 10;
// a = a + 10;
a +=10;
System.out.println("a = " + a);
a-=5;//a = a-5;
System.out.println("a = " + a);
a*=10;// a= a* 10;
System.out.println("a = " + a);
a/=10;// a = a/10;
System.out.println("a = " + a);
a%=2;
System.out.println("a = " + a);
System.out.println("===========万恶的分割线=========");
byte b = 20;
// b = (byte)(b + 10);
b +=10;
System.out.println("b = " + b);
char c = 'A';
// c = c + 32;
c +=32;
System.out.println("c = " + c);
}
}
5.3 关系/比较运算符
/*
* 关系/比较运算符
* ==
* !=
* >
* <
* <=
* >=
* 注意:关系运算符,比较的结果都是boolean类型
* */
public class CompareTest {
public static void main(String[] args) {
int a = 20;
int b = 10;
System.out.println(a == b);//false
System.out.println(a != b);//true
System.out.println(a > b);//true
System.out.println(a < b);//false
System.out.println(a <= b);//false
System.out.println(a >= b);//true
}
}
5.4 逻辑运算符
/*
*逻辑运算符:
* & :前后都为true,结果才为true
* | :有true,结果就为true
* ! :非 取反 true为false。 false为true
* ^ :相同为false 不同为true
*
* */
public class LogicTest {
public static void main(String[] args) {
boolean b1 = true;
boolean b2 = true;
boolean b3 = false ,b4 = false;
System.out.println("-------- &与 ---------");
System.out.println(b1 & b2 & b3);
System.out.println("-------- |或 ---------");
System.out.println(b1 | b2 | b3);
System.out.println(b1 | b4 | b3);
System.out.println("--------- !非 --------");
System.out.println(!b1);//取反 false
System.out.println(!b3);//取反 true
System.out.println(!(b1 | b4 | b3));//false
System.out.println("--------- ^异或 --------");
System.out.println(b1 ^ b2);
System.out.println(b1 ^ b3);
System.out.println(b3 ^ b4);
System.out.println("============ ");
System.out.println(3 > 2 & 1>3);//false
System.out.println(3 > 2 | 1>3);//true
System.out.println(3 > 2 ^ 1>3);//true
}
}
开发原则:逻辑的判断用&& ||
/*
*逻辑运算符:
* & :前后都为true,结果才为true
* &前面的表达式为false,后续的仍会执行
* | :有true,结果就为true
* |前面的表达式是true,后续的仍然会执行
* ! :非 取反 true为false。 false为true
* ^ :相同为false 不同为true
* ------------------
* &&:短路与
* 如果&&前面的表达式是false,则后续的不再执行。
* ||:短路或
* 如果||前面的表达式是true,则后续的不再执行
* */
public class LogicTest2 {
public static void main(String[] args) {
boolean b1 = true;
boolean b2 = true;
boolean b3 = false ,b4 = false;
System.out.println("-------- && 短路与 --------");
// System.out.println(b1 && b2 && b4);//false
int m = 10,n=20;
// boolean result = m > n & ++m < n;
boolean result = m > n && ++m < n;
System.out.println("result = " + result+",m="+m);
System.out.println("---------- || 短路或 ---------");
// System.out.println(b3 | b4 | b1);
int a = 10,b=20;
// boolean flag = a<b | ++a >b; //不短路
boolean flag = a<b || ++a >b; //短路
System.out.println("flag = " + flag+",a="+a);
}
}
5.5 条件运算符
/*
* 条件运算符/三元运算符/三目运算符
* 表达式1?表达式2:表达式3;
* x?y:z
* y :true --->x
* z :false ---> x
* */
public class TjTest {
public static void main(String[] args) {
int age = 16;
// x y z
// boolean表达式 true false
String result = age > 18 ? "已成年" : "未成年";
System.out.println("result = " + result);
boolean isMarry = true;
// String str = isMarry == true ?"已婚":"未婚";
String str = isMarry ? "已婚" : "未婚";
System.out.println("str = " + str);
int a = 100;
int b = 200;
int max = a > b ? a : b;
System.out.println("max = " + max);
}
}
小练习
public class TjTest2 {
public static void main(String[] args) {
/*
* 求三个数中 最大的。
* */
int a = 1000, b = 200, c = 50;
//获取前两个数中最大值。
/*int max1 = a>b? a:b;
//再用最大值和第三个值做比较
int max2 = max1 > c?max1:c;
System.out.println("max2 = " + max2);*/
int max = a > b ? (a > c ? a : c) : (b > c ? b : c);
System.out.println("max = " + max);
}
}
5.6 位运算符
/*
* &:上下都为1,结果为1
* |:上下有1,则为1
* ^:上下相同为0,不同为1
* ~:1变0 0变1 取反 补码
* 负整数先算出来补码, 正整数的三码合一
*
* &
* 1.前后都是boolean 是逻辑运算符
* 2.前后都是整数,是位运算符
*
* */
public class BitTest {
public static void main(String[] args) {
/*
* 1 0 1
* 0 1 1
* &
* ------
* 0 0 1 = 1
* */
System.out.println(5 & 3);
/*
* 1 0 1
* 0 1 1
* |
* ------
* 1 1 1 = 7
* */
System.out.println(5 | 3);
/*
* 1 0 1
* 0 1 1
* ^
* ------
* 1 1 0 = 6
* */
System.out.println(5 ^ 3);
/*
* 0000 0101
* 1111 1010 = -6
* */
System.out.println(~5);
/*
* 1000 0101 原码
* 1111 1010 反码
* 1111 1011 补码
* 0000 0011
* 0000 0011 3
* */
System.out.println(-5 & 3);
}
}
/*
* << 左移 *2^位移数方
* >> 右移 /2^位移数方 正数空缺位补0 负数空缺位补1
*
* >>> 无符号右移 :无论正负数,空缺位都补0
* 0
* 1
* */
public class BitTest2 {
public static void main(String[] args) {
System.out.println("-------- << --------");
System.out.println(4);//0100
System.out.println(4 << 1);//1000
System.out.println(4 << 2);//0001 0000
System.out.println(4 << 3);//0010 0000
System.out.println("-------- >> --------");
System.out.println(16);//10000
System.out.println(16 >> 1);//1000
System.out.println(16 >> 2);//100
System.out.println(16 >> 3);//10
//1110 1111 1111 0000
System.out.println(-16 >> 1);//1111 0000 >> 1111 1000
System.out.println(-16 >> 3);
System.out.println("--------- >>> ---------");
//0000 0000 0000 0000 0000 0000 1001 0000
System.out.println(0b00000000000000000000000000010000);
//10000000000000000000000000010000
//11111111111111111111111111101111
//11111111111111111111111111110000
System.out.println(0b11111111111111111111111111110000);
//11111111111111111111111111110000 >>> 1
//01111111111111111111111111111000
System.out.println(0b01111111111111111111111111111000);
System.out.println(-16 >>> 1);
}
}
5.7 运算符优先级
优先级 | 运算符说明 | Java运算符 |
---|---|---|
1 | 括号 | () 、[] 、{} |
2 | 正负号 | + 、- |
3 | 单元运算符 | ++ 、-- 、~ 、! |
4 | 乘法、除法、求余 | * 、/ 、% |
5 | 加法、减法 | + 、- |
6 | 移位运算符 | << 、>> 、>>> |
7 | 关系运算符 | < 、<= 、>= 、> 、instanceof |
8 | 等价运算符 | == 、!= |
9 | 按位与 | & |
10 | 按位异或 | ^ |
11 | 按位或 | ` |
12 | 条件与 | && |
13 | 条件或 | ` |
14 | 三元运算符 | ? : |
15 | 赋值运算符 | = 、+= 、-= 、*= 、/= 、%= |
16 | 位赋值运算符 | &= 、` |
package com.atguigu.a_operator;
/*
* 运算符优先级:不要记那些运算符优先。
* 想优先执行的,加()
* ()会提高代码的可读性
* 注意:表达式不要太长!
* */
public class OperatorYxjTest {
public static void main(String[] args) {
int num = 6;
int result = num + (10 >> 1);
System.out.println("result = " + result);
int a = 1000, b = 200, c = 50;
int max = a > b ? (a > c ? a : c) : (b > c ? b : c);
System.out.println("max = " + max);
}
}