基本数据类型:
在java语言中、数据类型是非常重要的一个章节、今天主要学习基本数据类型:
描述 | 类型 | 占用字节 | 取值范围 |
---|---|---|---|
字节 | byte | 1/8bit | -128~127 |
短整数 | short | 2/16bit | -32768~32767 |
整型 | int | 4/32bit | -2147473648~2147483648 |
长整型 | long | 8/64bit | –9223372036854775808~9223372036854775807 |
单精度 | float | 4/32bit | 1.4E-45~3.4028235E38 |
双精度 | double | 8/64bit | 4.9E-324~1.7976931348623157E308 |
字符型 | char | 2/16bit | 表示世界范围内所有语言相关的字符 |
布尔型 | boolean | 1bit | true/false |
public class PrimitiveDataTypeMain{
public static void main(String [] args){
// byte 类型
// byte numberBtye = 128; // 编译出错 byte类型的变量所能够存储的值在-128~127之间
byte numberByte = 127;
// shor 类型
//short numberShort = 32768;// 编译出错 short类型的变量所能够存储的值在-32768~32767之间
short numberShort = 32767;
// int 类型
//int numberInt = 2147483648; // 编译出错 int类型的变量所能够存储的范围在-2147473648~2147483648之间
int numberInt = 2147483647;
// long类型
//long numberLong = 3200000000; // 编译出错 由于整型常量默认是int类型的,需要对整型常量转换为long类型的数据类型。
long numberLong = 3200000000L; // 编译通过 在整型常量后加上l或L即可进行转换、但一般使用大写的L、因为小写l容易被误解 不好识别
// 进制问题
// 十进制 默认十进制 不需要做任何的进制转换
int number = 10;
System.out.println("十进制:"+number);
// 八进制 八进制的整数需要在整数前加0进行进制转换
int number8 = 010;
System.out.println("八进制:"+number8);
// 十六进制 十六进制的整数需要在整数前加0X或0x进行进制转换
int number16 = 0x10;
System.out.println("十六机制:"+number16);
// 二进制 二进制的整数需要在整数前加0b或0B进行进制转换
int number2 = 0b10;
System.out.println("二进制:"+number2);
// flaot类型 需要注意浮点类型的小数不要用作比较,因为它们并不精确,比较的结果或许会影响后面的程序正常运行哦
// float numberFloat = 3.14; // 编译出错、浮点型常量默认类型是double、double类型占8个字节、而float类型占4个字节 所以double的浮点数是无法赋值给float的。
float numberFloat = 3.14F;// 编译通过 在整型常量后加上F或f进行类型转换后即可成功赋值
float pi = 3.141592658F;// 编译通过 但运行会有问题 原因是float会损失精度 小数多的建议使用double double的精度是float的两倍
// char类型
//char a = 'ABC';// 编译报错 char类型只能使用''符号对字符常量进行包裹 并且只能是单个字符
char a = 'A'; // 编译通过 该字符只能够存储单个字符 char类型也能够表示Unicode编码表中任意的字符
// boolean类型
//boolean flag = 'A';// 编译报错 因为boolean类型只能有两个取值true/false表示真假 需要注意的是true和false也是常量
boolean flag = true;// 编译通过 该类型的变量只有两个取值 非true即false。
}
}
常用的运算符:
算数运算符:
算数运算符用于执行操作数的加减乘除的数学运算
描述 | 用途 | 符号 |
---|---|---|
加法运算符 | 对操作数进行加法运算 | + |
减法运算符 | 对操作数进行相减运算 | - |
乘法运算符 | 对操作数进行相乘运算 | * |
除法运算符 | 对操作数进行除法运算 | / |
取模运算符 | 对操作数进行取模运算 | % |
自增运算符 | 对操作数自增运算 | ++ |
自减运算符 | 对操作数自减运算 | - - |
public class Main{
public static void main(String [] args){
int a = 10;
int b = 5;
int c = a+b; // 加法运算
System.out.println(c);
int d = a-b; // 减法运算
System.out.println(d);
int e = a*b; // 乘法运算
System.out.println(e);
int f = a/b; // 除法运算
System.out.println(f);
int g = a%3;// 取模运算
System.out.println(g);
int h = a++;// 自增运算
System.out.println(h);// 我们会发现和预料的结果不相同 a自增后应该是11 将a的值赋给h后,h的值也应该是11 结果却是10 原因 int h = a++ 会先将a的值赋给h后、a再进行自增的、此时a的自增与h并产生任何的关系。
int i = a--;// 自减运算
System.out.println(i);// 与上面产生的问题相同
// 如果需要将自增的变量赋值给其他变量 则需要改变一下写法
int j = ++a;
System.out.println(j); // a会先进行自增运算 得到结果后赋值给变量j
int k = --a;
System.out.println(k); // a会进行自减运算 得到结果后赋值给变量k。
}
}
赋值运算符:
赋值运算符用于对变量进行赋值。
描述 | 符号 | 用法举例 | 等价表达式 |
---|---|---|---|
赋值运算符 | = | a = 5 | 无 |
加等运算符 | += | a += b | a = a + b |
减等运算符 | -= | a -= b | a = a - b |
乘等运算符 | *= | a *= b | a = a * b |
除等运算符 | /= | a /= b | a = a / b |
模等运算符 | %= | a %= b | a = a % b |
public class Main{
public static void main(String [] args){
int a = 10;
int b = 5;
a = b; // 赋值运算
System.out.println(a);// result = 5
a+=b; // 加等运算符 等价于 a = a + b : a = 5 + 5
System.out.println(a);// result = 10
a-=b;// 减等运算符 等价于 a = a - b : a = 10 - 5
System.out.println(a);// result = 5
a*=b;// 乘等运算符 等价于 a = a * b : a = 5 * 5;
System.out.println(a);// result = 25
a/=b;// 除等运算符 等价于 a = a / b : a = 25 / 5
System.out.println(a); // result : 5
a%=2; // 模等运算符 等价于 a = a % 2 : a = 5 % 2
System.out.println(a); // result : 1
}
}
关系运算符:
关系运算符用于进行比较运算、关系运算符运行后的结果只能是布尔值、即结果非true即false。
当结果为真则返回true、当结果为假则返回false。
=号是赋值运算符、==号是比较两个操作数是否相等
==、!= 所有数据类型都能够使用(引用数据类型、基本数据类型)
<、>、<=、>=仅针对数值类型(包括char)的变量进行操作。
符号 | 含义 | 示例 | 解读 |
---|---|---|---|
== | 等等于 | a==b | a等于b吗? |
!= | 不等于 | a!=b | a不等于b吗? |
< | 小于 | a<b | a小于b吗? |
> | 大于 | a>b | a大于b吗? |
<= | 小于等于 | a<=b | a小于或等于b吗? |
>= | 大于等于 | a>=b | a大于或等于b吗? |
逻辑运算符:
逻辑运算符的操作数和运算后的结果都必须是boolean类型
描述 | 符号 | 说明 |
---|---|---|
与 | & | 两个操作数都是true,结果才是true,否则是false |
或 | | | 两个操作数有一个是true,结果就是true,两个操作数都是false则为false |
与(短路) | && | 两个操作数有一个是false,结果就是tfalse,两个操作数都是true则为true |
或(短路) | || | 两个操作数有一个是true,结果就是true,两个操作数都是false则为false |
非 | ! | 操作数是true则为false,操作数是false则为true |
异或 | ^ | 两个操作数结果相同则为false,不同则为true |
public class Main{
public static void main(String [] args){
boolean a = true;
boolean b = true;
boolean c = false;
System.out.println(a&b);// 结果为true 因为两个操作数运算后的结果都是true 返回的结果也是true
System.out.println(a&c);// 结果为false 因为两个操作数有一个是false 运算结果必然也是false
System.out.println(a|c);// 结果为true 因为两个操作数只要有一个是true 运算结果即是true
System.out.println(!a);// 结果为false a操作数本身是true 进行运算取反后a的结果变成了false
System.out.println(a^b);// 结果为false 两个操作数相同则为false 不同则为true
// 短路功能 && 和 || 所谓的短路功能实际上是根据已知条件(得到必然的结果)后就无需再进行运算了 提高程序的效率
System.out.println(a&&b); // 结果为true 如果第一个操作数为false 则不会继续执行b的逻辑运算了 因为&的条件必须是两个操作数都为true才能true
System.out.println(a||b); // 与&&同理
// 测试短路功能
System.out.println(1>2&2>(1/0)); // 没有使用短路& 在1>2为false的情况下,2>(1/0)仍然会被运算 如果它被运算的话必然会出现异常
System.out.println(1>2&&2>(1/0));// 使用了短路& 在1>2为false的情况下、2>(1/0)不会被运算 所以没有出现异常情况
}
}
三元运算符
三元运算符常用于替代简单的if else 条件判断的运算、基本语法为:
x ? y : z
x : 必须为boolean类型的表达式
y : 当x的表达式为true的时候返回的结果
z : 当x的表达式为false的时候返回的结果
public class Main{
public static void main(String [] args){
int score = 60;
String result = score>=60 ? "及格":"不及格"; // 如果条件为true则返回"及格"的字符串常量、否则返回"不及格"的字符串常量
System.out.println(result);
}
}
类型转换:
自动类型转换
自动类型转换指的是将容量小的数据类型的操作数自动转换为容量大的数据类型、需要注意的是这里提到的容量大小并非指数据类型所占用的字节大小、而是指转换后的数据类型所表述的值范围是否大于转换前的数据类型所表述的值范围。
如long类型占用8个字节、float占4个字节、long类型的值可以自动转换成float类型、因为float所表述的值范围要大于long所表述的值范围、但转换的时候会损失一定的精度。
红色实线表示能够自动类型转换、并且数据精度不会丢失。
蓝色虚线表示在自动类型转换的时候、数据精度存在丢失的情况。
public class Main{
public static void main(String [] args){
short numberShort = 10; // 整型常量默认是int类型的 而正好整型常量的值正好在short的表述范围之内 所以编译通过也能够通过 类型转换成功
long numberLong = 20;
float numberFloat = numberLong; // 能够转换成功 因为float表述范围大于long
long numberLong2 = numberFloat; // 编译出错 原因与上述的相同 duble类型的也是同理
}
}
强制类型转换:
强制类型转换顾名思义就是将操作数的数据类型强制性转换成指定的数据类型、需要注意的是强制类型转换必然是会造成数据的精度丢失或溢出的情况。语法:
数据类型 变量名 = (需要转换的数据类型)变量名
public class Main{
public static void main(String [] args){
double x = 3.14;
int number = (int)x; // 编译通过 强制类型转换 会丢失精度 number = 3;
char s = 'a';
int a = s+1;
System.out.println(a); // 98
System.out.println((char)a); // b
// 数据溢出的问题
int money = 1000000000;// 10亿
int year = 20; // 20年
int total = money*20; // 得出的结果应该是200亿
System.out.println(total); // -1474836480 出现溢出的情况 因为超出了int的表述范围
long total1 = money*year; // 使用long类型进行接收一下
System.out.println(total1);// 但结果仍然是-1474836480 因为money 和 year都是int类型 它们的运算后的结果已经发生溢出情况了 所以赋值给long类型的total1依旧是溢出后的结果
long total2 = money*((long)year);// 将一个操作数进行强制类型转换 我们知道两个操作数有一个是long那它的运算结果必然也是long
System.out.println(total2);// 结果是 20000000000
}
}
Scanaer:
它位于java.util包下、使用的时候需要将该包引入到当前类中才能够使用、它是java5的新特性、通过它能够获取控制台中键盘输入的内容。
import java.util.*; // 导入java.util包下的所有 * 代表所有任意
public class Main{
public static void main(String [] args){
Scaner scaner = new Scaner(System.in);// 创建Scaner对象 并将输入流传到该对象的构造器中进而获取控制台输入的内容
// 信息提示输入
System.out.println("请输入您的姓名:");
// 获取键盘输入的一行内容
String name = scanner.nextLine();
System.out.println("请输入您的年龄:");
// 获取键盘输入的int值
int age = scanner.nextInt();
System.out.println("请输入您的月薪:");
double salary = scanner.nextDouble();
System.out.println("===============================");
System.out.println("您叫:"+name);
System.out.println("您今年"+age+"岁");
System.out.println("您现在是"+(salary>10000 ? "小康家庭":"贫困家庭"));
}
}