三、Java之基本数据类型
一、变量
1.1 变量的概念
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)
1.2 变量的使用
int a;
a = 60; // 把 60 赋给 a
public class HelloWorld { public static void main(String[] args) { int a; a = 2; System.out.println("a = " + a); // a = 2 int b = 3; System.out.println("b = " + b); // b = 3 } }public class Var01 { public static void main(String[] args) { int age = 29; double score = 99.5; char gender = '男'; String name = "王勇"; System.out.println(name); System.out.println(gender); System.out.println(age); System.out.println(score); } }
1. 变量表示内存中的一个存储区域(不同的变量,类型不同,占用的空间大小不同。比如: int 4个字节, double 8个字节), 该区域有自己的名称(变量名)和类型(数据类型)
2. 变量必须先声明,后使用
3. 该区域的数据(值)可以在同一类型范围内不断变化
4. 变量在同一个作用于不能重名
5.变量 = 变量名 + 值 + 数据类型,这就是变量的三要素
public class Var01 { public static void main(String[] args) { System.out.println(100 + 200); // 300 System.out.println("100" + 200);//100200 System.out.println(100 + "200");//100200 System.out.println(100 + 200 + "300");//300300 System.out.println("100" + 200 + 300);//100200300 } }1. 当左右两边都是数值型时,则做加法运算
2. 当左右两边有一方是字符串时,做字符串拼接运算
3. 运算顺序,从左往右
1. java 数据类型分为两大类 基本数据类型, 引用类型
2. 基本数据类型有8种数值型:(byte , short , int , long , float ,double), 字符型:char, 布尔型:boolean
3. 引用类型(类, 接口, 数组)
3.1 整数类型(byte, short, int, long)
byte n1 = 10; short n2 = 10; int n3 = 10;//4 个字节 long n4 = 10L; //8 个字节
1. Java各整数类型有固定的范围和字段长度,不受具体OS的影响,以保证java的可移植性。
2. Java的整型常量(具体指)默认为int类型,声明long型常量需要加 "l" 或者 "L"
3. Java程序中变量常声明为int类型,除非不足以表示大数, 才使用long
4. bit: 计算机的最小存储单位, byte: 计算机的基本存储单元 1byte = 8bitpublic class Var02 { public static void main(String[] args) { int a = 4; // int b = 8L; // 错误 long c = 8; long d = 8L; System.out.println("a = " + a + " c = " + c + " d = " + d); // a = 4 c = 8 d = 8 } }
3.2 浮点类型(float, double)
3.2.1 基本介绍
Java 的浮点类型可以表示一个小数,比如 123.4 ,7.8 ,0.12 等等
float f = 3.14f; double d = 5.12;
1. 关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位
2. 尾数部分可能丢失,造成精度损失(小数都是近似值)。
3. 具体的存储原理可以参考: https://www.cnblogs.com/wangyong123/articles/13997795.html#_label0
1. 与整数类型类似, Java复现类型也有固定的范围和字段长度, 不受具体的OS的影响。float是4个字节,double是8个字节
2. Java的浮点型常量默认为double类型,声明float类型常量,需要在后面加上"f"或者"F"
3. 浮点型常量的两种表示方法
1): 十进制数形式: 5.12 512.0f .512(必须有小数点)
2): 科学计数法形式: 5.12e2(5.12*10^2) 5.12E-2(5.12*10^-2)
4. 通常情况下, 使用double类型,因为比flaot更加精确
double num = 2.1223456576
5. 注意浮点数精度陷阱public class FloatDouble { public static void main(String[] args) { // 1. Java浮点型默认是 double型 // float num1 = 1.1; 错误 float num2 = 1.1F; double num3 = 1.1; double num4 = 1.1F; // 可以 // 2. 十进制数形式与科学技术法形式 double num5 = .123; // = 0.123 System.out.println(num5); // 0.123 System.out.println(5.12E2); // 512.0 System.out.println(5.12E-2); // 0.0512 // 3. 通常情况下,使用double类型 double num6 = 2.1234567851; float num7 = 2.1234567851F; System.out.println(num6); // 2.123456785 System.out.println(num7); // 2.1234567 // 4. 浮点数的陷阱 double num8 = 2.7; double num9 = 8.1 / 3; System.out.println(num8); // 2.7 System.out.println(num9); // 2.6999999999999997 接近 2.7 的一个小数,而不是 2.7 //得到一个重要的使用点: 当我们对运算结果是小数的进行相等判断是,要小心 //应该是以两个数的差值的绝对值,在某个精度范围类判断 if (num8 == num9) { System.out.println("num8 == num9 相等"); // 不会打印出来的 } // 正确的写法 if (Math.abs(num8 - num9) < 0.000001) { System.out.println("差值非常小, 认为相等..."); // 差值非常小, 认为相等... } } }
3.3 字符类型(char)
字符类型可以表示单个字符,字符类型是 char,char 是两个字节(可以存放汉字)。
char c1 = 'a'; char c2 = '\t'; char c3 = '韩'; char c4 = 97;
1. 字符常量是用单引号' ' 括起来的字符。
2. Java中国还有许使用'\'来将气候的字符转变为特殊字符型常量.
3. 在Java中,char本质上是一个整数,在输出时,采用unicode编码对应的字符
4. 可以直接给char赋值一个整数,然后输出时,会按照对应的unicode字符输出。如 97 -- a;
5. char类型是可以进行运算的,相当于一个整数,因为它都对应的unicode码public class CharVar { public static void main(String[] args) { // 在java中,char本质上是一个数字,采用unicode编码 char c1 = 97; System.out.println(c1); // a char c2 = 'a'; // 输出a对应的数字 System.out.println((int)c2); // 97 char c3 = '王'; System.out.println((int)c3); // 29578 char c4 = 29578; System.out.println(c4); // 王 // char 类型是可以参与数字运算的, 因为它都对应有 Unicode 码. System.out.println('a' + 10); // 107 char c5 = 'a' + 20; System.out.println(c5); // u System.out.println((int)c5); // 117 } }1. 字符型存储到计算机中,需要将字符对应的码值(整数)找出来, 比如 'a' 存储: 'a'==>码值97==》二进制(1100001)==>存储
2. 字符和码值的对应关系是通过字符编码实现的
ASCII: 一个字节表示,一共128个字符,实际上一个字节可以表示256个字符,只使用了128个。缺点是不能表示所有字符。
Unicode: 固定大小的编码,使用两个字节来表示字符,字母和汉字统一都是占用两个字节,将世界上所有的符号都纳入其中,每个字符都给予一个独一无二的编码,使用Unicode编码没有乱码的问题,缺点是一个英文和汉字都占用两个字节,比较浪费空间。2^16==65536,所以最多编码65535个字符, 0-127的字符和ASCII编码是一样的,因此Unicode编码兼容ASCII码。
UTF-8:UTF-8是在互联网上使用最广的一种Unicode的改进的实现方式,UTF-8是一种边长的编码方式,它可以使用1-6个字节表示符号,根据不同的符号二牛鞭花字节长度,使用1个字节表示字母,3个字节表示汉字。
3.4 布尔类型(boolean)
3.4.1 基本介绍
1. boolean类型数据只允许取值true或者flase,没有null的存在。
2. boolean类型占 1 个字节
3. boolean类型适用于逻辑运算,一般用于流程控制中使用。
public class BooleanVar { public static void main(String[] args) { boolean isPass = true; if (isPass) { System.out.println("正确"); // 正确 } else { System.out.println("错误"); } } }
四、基本数据类型转换
4.1 自动数据类型转换
Java程序进行赋值或者运算时, 精度小的类型自动转换成精度大的类型,称为自动类型转换。
1. 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
2. 当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换。
3. (byte,short)和char之间不会互相自动转换
4. byte, short, char 他们三种可以计算,在计算时首先转成int类型。
5. 自动提升原则: 表达式结果的类型自动提升位操作数中最大的类型
6. boolean不参与转换public class AutoConvert { public static void main(String[] args) { // 1. 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。 int n1 = 10; // float d1 = n1 + 1.1; // 错误 n1+1.1是double类型 double d1 = n1 + 3.1; float d2 = n1 + 3.1F; // 2. 当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换。 // int n2 = 1.1; // 错误, double -> int // 3. (byte,short)和char之间不会互相自动转换 // 当把整数赋给byte, 先判断该数是否在byte范围内,如果在就可以 byte b1 = 10; int n2 = 10; // byte b2 = n2; 错误, 因为 n2是int,如果是变量赋值,先判断类型,在判断范围 // char c1 = b1; 错误, byte不嫩改自动转换成char // 4. byte, short, char 他们三种可以计算,在计算时首先转成int类型。 byte b2 = 1; byte b3 = 2; short s1 = 1; // short s2 = b2 + s1; 错误, b2 + s1 => int int s2 = b2 + s1; // byte b4 = b2 + b3; 错误, b2 + b3 => int // 5. 自动提升原则: 表达式结果的类型自动提升位操作数中最大的类型 byte b4 = 1; short s3 = 100; int num1 = 1; float num2 = 1.1F; double num = b4 + s3 + num1 + num2; // 6. boolean不参与转换 boolean pass = true; // int num = pass; 错误, 不嫩改进型类型转换 } }
4.2 强制数据类型转换
public class ForceConvert { public static void main(String[] args) { int i = (int)1.9; System.out.println("i = " + i); // i = 1 精度损失 int j = 1000; byte b = (byte)j; System.out.println("b = " + b); // b = -24 随机数 } }
1. 当使用的数据从 大 ---> 小, 可以使用强制类型转换
2. 强转符号只会针对最近的操作数有效,所以一般使用()来提升优先级。
3. char类型可以保存int类型的常量值,但不能保存int类型的变量值, 需要强转。
4. byte,short,char类型进行运算时,当做int类型来处理。public class ForceConvert { public static void main(String[] args) { // 1.强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级 // int x = (int)10 * 3.5 + 6 * 1.5; 错误, double --> int int x = (int)(10 * 3.5 + 6 * 1.5); System.out.println(x); // 44 // 2. char类型可以保存int类型的常量值,但不能保存int类型的变量值, 需要强转。 char c1 = 100; int m = 100; // char c2 = m; 错误 char c3 = (char)m; System.out.println(c3); // d, 100对应的字符 } }
// 判断下面是否能够编译通过,不能通过说明理由 short s = 12; // s = s - 9; int -> short byte b = 10; // b = b + 11; int -> byte b = (byte)(b + 11); char c = 'a'; int i = 16; fload d = .314; double result = c + 1 + d; byte e = 16; short f = 14; // short t = s + b; int -> short
4.4 基本数据类型与String类型的转换
public class BasicToString { public static void main(String[] args) { int n1 = 100; float n2 = 1.1F; double n3 = 3.14; boolean b1 = true; String str1 = n1 + ""; String str2 = n2 + ""; String str3 = b1 + ""; System.out.println(str1 + " " + str2 + " " + str3); // 100 1.1 true } }
public class StringToBasic { public static void main(String[] args) { String s = "123"; int num1 = Integer.parseInt(s); double num2 = Double.parseDouble(s); float num3 = Float.parseFloat(s); long num4 = Long.parseLong(s); byte num5 = Byte.parseByte(s); short num6 = Short.parseShort(s); boolean b = Boolean.parseBoolean("true"); System.out.println(num1);//123 System.out.println(num2);//123.0 System.out.println(num3);//123.0 System.out.println(num4);//123 System.out.println(num5);//123 System.out.println(num6);//123 System.out.println(b);//true // 字符串转换成字符char, 只能得到某一个字符 System.out.println(s.charAt(0)); // 1 System.out.println(s.charAt(1)); // 2 System.out.println(s.charAt(2)); // 3 } }
五、键盘输入语句
Input.java , 需要一个 扫描器(对象), 就是Scanner
1. 导入该类的所在包, java.util.*
2. 创建该类对象(声明变量)
3. 调用里面的功能
import java.util.Scanner; // 1. 导入 Scanner类所在包, 表示简单文本扫描器 public class Input { public static void main(String[] args) { // 2. 创建 Scanner 对象 Scanner scanner = new Scanner(System.in); // 3. 接收用户的输入 System.out.println("请输入名字"); String name = scanner.next(); // 接收用户输入字符串 System.out.println("请输入年龄"); int age = scanner.nextInt(); // 接收用户的输入的int System.out.println("请输入薪水"); double salary = scanner.nextDouble(); // 接收用户的输入的double System.out.println("人的信息如下:"); System.out.println("name = " + name + " age = " + age + " salary = " + salary); } }