变量详解、数据类型及转换、运算符、Scanner
变量
- 变量型的数据在计算机中的存储原理——按照二进制进行存储
- 计算机表示数据的最小单元:一个字节(byte,简称B,是使用8个二进制位组成的)
二进制、八进制、十进制、十六进制
- 二进制:0B||0b开头
int a1 = 0B01100001;
System.out.println(a1);
- 八进制:0开头
int a2 = 0141;
//1->001,4->100,1->001;141->001100001
//但1字节由八个(二进制)位构成,故001100001->01100001->97
System.out.println(a2);
- 十六进制:0X或0x开头
int a3 = 0XFA;
//F(15)->1111,A(10)->1010;FA->11111010
//1byte = 8bit,故11111010->250
System.out.println(a3);
数据类型
基本数据类型
数据类型种类 | 具体数据类型 | 字节数 | 数据范围(不需要记住具体的数值) |
---|---|---|---|
整型 | byte(字节型) | 1B | -128~127 |
整型 | short(短整型) | 2B | -3w+~3w |
整型 | int(整型)默认 | 4B | -2e9~2e9 |
整型 | long(长整型) | 8B | 19位数 |
浮点型 | float(单精度) | 4B | |
浮点型 | double(双精度)默认 | 8B | |
字符型 | char | 2B | 0~6w+ |
布尔型 | boolean | 1B | true || false |
引用数据类型(以后再详讲)
- String字符串类型
String userName = “Achooyo”;
/**
* 数据类型:基本数据类型(4大类8种) && 引用数据类型
*/
public class VariableDemo2 {
public static void main(String[] args) {
//TODO 基本数据类型(4大类8种)
//1.整型:byte,short,int,long
byte b = 127;
// byte b1 = 128;//越界
short s = 13244;
int i =422566;//整型字面量默认是int类型的。
/*符合long的取值范围
但由于整型字面量默认是int类型的,此处越界int型,故报错
long lg = 9876543210;*/
//如果希望随便写一个整型字面量默认是long类型的,需要在后面加上L/l
long lg1 = 9876543210L;
//2.浮点型:float,double
//注意:随便写浮点型字面量,默认是double,如果希望浮点型为float,后面加上F/f
float f = 3.14F;
double d = 114.514;
//3.字符型:char 0 - 60000+ 取值范围全是正数
char ch1 = 'a';
char ch2 = '中';
char ch3 = ' ';
//char ch4 = ''; 不能为空
//4.布尔型:boolean (true || false)
boolean flag1 = true;
boolean flag2 = false;
//TODO 引用数据类型
String name = "张三";
System.out.println(name);
}
}
类型转换
- 不同类型变量,互相存在赋值转换的问题
1.自动类型转换
- 自动类型转换:类型范围小的变量,可以直接赋值给类型范围大的变量(小字节转换成大字节)
/**
* 基本数据类型的的类型自动转换机制
*/
public class TypeConversionDemo1 {
public static void main(String[] args) {
//自动类型转换:类型范围小的变量,可以直接赋值给类型范围大的变量(小字节转换成大字节)
byte a = 12;//00001100
int b = a;//00000000 00000000 00000000 00001100
System.out.println(a);
int i = 100;
double d = i;
System.out.println(d);
/*
char 取值 0 - 60000+ 全为正数
而byte short 存在负数,固不可与char进行转换
char c = 55;
short s = c;
byte b1 = 2;
c = b1;*/
}
}
2.表达式的自动类型转换
-
表达式中的最终结果类型是由里面最高的数据类型决定的,最高数据类型是什么,最终结果的数据类型就是什么
-
注意事项:
1.表达式的最终结果由表达式的最高类型决定
2.在表达式中,byte,short,char是直接转换成int类型参与计算
/**
* 表达式的自动类型转换机制
*/
public class TypeConversionDemo2 {
public static void main(String[] args) {
byte a = 10;
int b = 20;
long c = 30;
long rs = a + b + c;
System.out.println(rs);
double rs2 = a + b + 1.0;
System.out.println(rs2);
byte i = 10;
short j = 30;
/* TODO 注意:在表达式中,byte、short、char是直接转换成int类型参与运算的
short rs3 = i + j; 报错:需要提供short,但实际提供int*/
int rs3 = i + j;
System.out.println(rs3);
//TODO 面试笔试题:
byte b1 = 10;
byte b2 = 30;
/* TODO 注意:在表达式中,byte、short、char是直接转换成int类型参与运算的
报错:需要提供byte,但实际提供int
byte b3 = b1 + b2;*/
int b3 = b1 + b2;
// b1 = b1 + 10; 一式报错,byte接收int;
// b1 += 10; but二式自加不报错,因为扩展赋值运算符 += 隐含强制类型转换转成byte
// 即 b1 += 10; <--> b1 = (byte)(b1 + 10);
// todo 此处可看operator包中OperatorDemo3 笔记
System.out.println("b1 = " + b1);
}
}
3.强制类型转换
- 大范围类型的变量不可以直接赋值给小范围变量,如果一定要赋值,必须进行强制类型转换。
- 注意:
1.强制类型转换可能造成数据(丢失)溢出;
2. 浮点型转成整型,直接丢掉小数部分,保留整数部分返回
/**
* 强制类型转换
*/
public class TypeConversionDemo3 {
public static void main(String[] args) {
//强制类型转换:强行将类型范围大的变量的数据赋值给类型范围小的变量,后果自己负责噢
int a = 20;//00000000 00000000 00000000 00010100
byte b = (byte) a;// 00010100
byte b1 = (byte)(a+1000);
byte b2 = (byte) a;//alt + enter 强制类型转换
System.out.println(b);
int i = 1500;//00000000 00000000 00000101 11011100
byte j = (byte)i;// 11011100 其中第一个1代表负数
System.out.println(j);
double d = 99.5;
int m = (int) d;
System.out.println(m);
//TODO 注意:
// 1. 强制类型转换可能造成数据(丢失)溢出;
// 2. 浮点型转成整型,直接丢掉小数部分,保留整数部分返回
}
}
运算符
1.算术运算符、+ 作连接符
-
算术运算符:+、-、*、/、%
-
“+” 符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串
技巧:从左往右,能算则算,不能算则连在一起
/**
* 掌握基本的算术运算符的使用 && 掌握使用 + 符号作连接符的情况
*/
public class OperatorDemo1 {
public static void main(String[] args) {
//TODO 目标1:掌握基本的算术运算符的使用
int a = 10;
int b = 2;
System.out.println(5/2);//表达式最终结果为int 故2.5 -> 2 直接舍弃小数点往后
System.out.println((double)(5/2));//(double)2 -> 2.0
System.out.println((double)5/2);// 5.0 / 2 -> 2.5
int i = 5;
int j = 2;
System.out.println(1.0 * i / j);//2.5
//TODO 目标2:掌握使用 + 符号作连接符的情况
// “+” 符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串
// 技巧:从左往右,能算则算,不能算则连在一起
int a2 = 5;
System.out.println("abc" + a2);//"abc5"
System.out.println(a2 + 5 );//10
System.out.println("itheima" + a2 + 'a');//"itheima5a"
System.out.println(a2 + 'a' + "itheima");//"102itheima"
}
}
2.自增自减运算符
- ++变量名、变量名++、–变量名、变量名–
- 注意之能作用于变量而不能作用于字面量,
- 以及 ++变量名 是先+后算,变量名++ 是先算后+;–同理
public class OperatorDemo2 {
public static void main(String[] args) {
//TODO 目标:自增自减
// 比较简单,不写了
}
}
3.赋值运算符
- =、+=、-=、*=、/=、%=
- 格式: byte a = 10;a += 10; <==> byte a = 10; a = (byte)(a+10);//因为10默认为int,故需要强制类型转换
public class OperatorDemo3 {
public static void main(String[] args) {
//TODO 目标:掌握扩展赋值运算符的使用
/*格式:
a += b <--> a = (a的数据类型)(a+b);
即隐含强制类型转换*/
//todo 此处type包TypeConversionDemo2
byte x= 10;
byte y = 30;
// x = x + y; 报错:需要byte 提供int
// x = (byte) (x+y); √
x += y; //与上行等效
System.out.println(x);
}
}
4.关系运算符
- ==、>=…
- 判断数据是否满足条件,最终会返回一个判断的结果,这个结果是布尔类型的值
public class OperatorDemo4 {
public static void main(String[] args) {
//TODO 目标:掌握关系运算符的使用
//判断数据是否满足条件,最终会返回一个判断的结果,这个结果是布尔类型的值
//比较简单,不写了
}
}
5.逻辑运算符
- 把多个条件放在一起运算,最终返回布尔类型的值
- 逻辑与&:多个条件必须都是true,结果才是true;有一个是false,结果就是false
- 逻辑或|:多个条件中只要有一个是true,结果就是true
- 逻辑非!:就是取反,!true == false,!false == true
- 逻辑异或^:前后条件的结果相同,就直接返回false,前后条件的结果不同,返回true
- 短路与&&:判断结果与‘&’一样,过程不同
- 短路或||:判断结果与‘|’一样,
public class OperatorDemo5 {
public static void main(String[] args) {
//TODO 目标:掌握逻辑运算符的使用
//把多个条件放在一起运算,最终返回布尔类型的值
//逻辑与&:多个条件必须都是true,结果才是true;有一个是false,结果就是false
//逻辑或|:多个条件中只要有一个是true,结果就是true
//逻辑非!:就是取反,!true == false,!false == true
//逻辑异或^:前后条件的结果相同,就直接返回false,前后条件的结果不同,返回true
//短路与&&:判断结果与‘&’一样,过程不同
//短路或||:判断结果与‘|’一样,
}
}
6.三元运算符
-
语法:
条件表达式 ? 值1 :值2
执行流程:若条件表达式返回true,则返回值1,反之返回值2
public class OperatorDemo6 {
public static void main(String[] args) {
//TODO 目标:掌握三元运算符的使用
/*
语法:
条件表达式 ? 值1 : 值2;
执行流程:首先计算条件表达式的值,若为true,返回值1,若为false,返回值2
*/
//及格
double score = 98.5;
String rs = score >= 60 ? "及格" : "不及格";
System.out.println(rs);
//最大值
int a = 10;
int b = 5;
int max = a > b ? a : b;
System.out.println(max);
}
}
Scanner
-
步骤:
-
导包
import java.util.Scanner;
-
抄写代码,整体含义:得到一个键盘扫描器对象(东西)
-
Scanner sc = new Scanner(System.in);
3. 开始 调用sc的功能,来接收用户键盘输入的数据
int age = sc.nextInt();//执行到这,会开始等待用户输入一个整数,直到用户按了enter键,才会拿到数据
完整代码:
import java.util.Scanner;
public class ScannerDemo1 {
public static void main(String[] args) {
//1.导包
//2.抄写代码,整体含义:得到一个键盘扫描器对象(东西)
Scanner sc = new Scanner(System.in);
//3.开始 调用sc的功能,来接收用户键盘输入的数据
System.out.println("请输入您的年龄:");
int age = sc.nextInt();//执行到这,会开始等待用户输入一个整数,直到用户按了enter键,才会拿到数据
System.out.println("您的年龄是:" + age);
System.out.println("请输入您的名字: ");
String name = sc.next();//执行到这,会开始等待用户输入一个字符串,直到用户按了enter键,才会拿到数据
System.out.println(name + "欢迎您进入系统");
/* Scanner i = new Scanner(System.in);
int a = i.nextInt();
System.out.println(a);*/
}
}