数据类型
Java是一种强类型语言,必须为每一个变量声明一种类型。在Java中数据类型分为:基本数据类型和引用数据类型。下面讨论Java的8种基本数据类型,4种整型,2种浮点型,1种字符类型char(用于表示Unicode编码的代码单元)和1种表示真值的boolean类型。
标识符:就是给类,方法,变量等起的名字。
整型
整型表示没有小数部分的数值,允许是负数。
在通常情況下,int 类型最常用。但如果想要表示整个地球的居佳人口,就需要使用long 类型了。byte 和short 类型主要用于特定的应用场合,例如,底层的文件处理或者存储空间很宝贵时的大数组 。
public class Hello{
public static void main(String[]args){
int a = 11;
System.out.println(a);
short b = 1;
System.out.println(b);
long c = 9999999L;
System.out.println(c);
byte d = '乐';
System.out.println(d);
}
}
长整型数值有一个后缀L或l,建议写成大写的L。
浮点类型
浮点类型用于表示有小数部分的数值。
double表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值)。在很多情况下,float 类型的精度(6~7位有效数字)并不能满足需求。实际上,只有很少的情况适合使用float 类型,例如,需要单精度数的库,或者需要存储大量数据时。
float类型的数值有一个 后缀F或f(例如3.14F) 。没有后缀F的浮点数值(如3.14)总是默认为double类型。
所有的浮点数值计算都遵循IEEE754规范。具体来说,下面用于表示溢出和出错情况的三个特殊的浮点数值。
正无穷大
负无穷大
NaN(不是一个数)
例如,一个正整数除于0结果为正无穷大,计算0/0或者负数的平方根结果为NaN。
浮点数値不造用于无法接受含入误差的金融汁算。例如,命令Systen.out.println (2. 0- 1. 1)将打印士0. 89999999999,而不是人们期望的0. 9。这种舍入误差的主要原 因是浮点数值来用二进制系统表示,而在二进制系统中无法精确地表示分数 1/10。这 就好像十进制无法精确地表示分数1/3 一样。如果在数值计算中不允许有任何舍入误 差,就应该使用BigDecinal 类,本章稍后将介绍这个类。
public class Hello{
public static void main(String[]args){
float a =11.5F;
System.out.println(a);
double b =18.6;
System.out.println(b);
}
}
char类型
char 类型原本用于表示单个字符。不过,现在情况已经有所变化。如今,有些Unicode 字符可以用一个char值描述,另外 一些Unicode宇符则需要两个char值。
char类型的字面量值要用单引号括起来。例如'A'是编码值为65的字符常量。它与"A"不同,"A"是包含一个字符A的字符串。
除了转义序列\u之外,还有一些用于表示特殊字符的转义序列,请参考表3-3.所有这些转义序列都可以出现在加引号的字符字面量或字符串中。例如,'\u2022'或"hello\n"。转义序列\u还可以出现在加引号的字符常量或字符串之外(而其它所有转义序列不可以)。例如
public static void main(String\u005B\u005D args)
就完全符合语法规则,\u005B和\u005D分别是[和]的编码。
\t(制表符)
在打印的时候,把前面字符串的长度补齐到8,或者8的整数倍。最少补1个空格,最多补8个空格。
public class Hello{
public static void main(String[]args){
System.out.println("name" + \t + "age")
System.out.println("Tom" + \t + "18")
}
}
打印结果
name age
Tom 18
boolean类型
boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。
命名规则
源代码的文件名必须与公共类的名字相同,并用.java作为扩展名。
硬性规定:
1由字母,数字,下划线(_),美元符$组成
2不能以数字开头
3不能是关键字
4区分大小写
小驼峰命名法
用于方法名,变量名
规范一:标识符是一个单词的时候,全部小写
例如:name
规范二:标识符由多个单词组成的时候,第一个单词字母小写,其他单词首字母大写
例如:firstName
大驼峰命名法
用于类名
规范一:标识符是一个单词的时候,首字母大写
例如:Student
规范二:标识符由多个单词组成的时候,每个单词的首字母大写
例如:GoodStudent
命名要见名知意
键盘录入
Java帮我们写好了一个类叫Scanner,这个类就可以接收键盘输入的数字。
步骤一:导包 Scanner这个类在哪
import java.util.Scanner; #导包的动作必须出现在类定义的上面
步骤二:创建对象,表示要开始用Scanner这个类了
Scanner sc = new Scanner(System.in);
#上面这个格式里,只有sc是变量,可以变,其他都不能变
步骤三:接收数据
int i = sc.nextInt();
#这个格式里,只有i是变量,可以变,其他都不可变
下面写一个例子:键盘输入两个数,最后再相加
import java.util.Scanner;
public class Hello{
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数:");
int i = sc.nextInt();
System.out.println("再输入一个数:");
int o = sc.nextInt();
System.out.println(i+o);
}
}
运行结果如下
运算符
算术运算符
加,减,乘,除,取余。在有小数参与时,计算有可能不准确。
+ 加
- 减
* 乘
/ 除
% 取模,取余
练习:键盘输入一个三位数,分别打印个位,十位,百位上的数字到控制台。
import java.util.Scanner;
public class Text{
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int i = sc.nextInt();
System.out.println(i % 10);
System.out.println(i / 10 % 10);
System.out.println(i / 100 % 10);
}
}
“+” 操作的三种情况
数字相加
隐式转换(自动类型提升):把一个取值范围小的数值,转成取值范围大的数据。
取值范围小的,和取值范围大的进行运算,小的会先提升为大的,在进行运算。
byte short char三种类型的数据在运算时都会直接先提升为int,然后再运算。
数据类型不一样,不能进行计算,需要转换成一样的才可以进行计算。
byte<short<int<long<float<double
强制转换:如果把一个取值范围大的数值,赋值给取值范围小的变量是不允许直接赋值的,如果一定要这么做就需要加入强制转换。
格式:目标数据类型 变量名 = (目标数据类型)被强制转换的数据
double a = 12.3;
int b = (int)a;
字符串相加
当“+”操作中出现字符串时,这个“+”是字符串连接符,而不是算术运算符了。
会将前后的数据进行拼接,并产生一个新的字符串。
连续进行“+”操作时,从左到右逐个执行
System.out.println(3+1+"年好学生" + 1 +2); //4年好学生12
int age = 18;
System.out.println("我的年龄是" + age + "岁"); //我的年龄是18岁
System.out.println("我的年龄是" + "age" + "岁"); //我的年龄是age岁
练习:键盘输入一个三位数,分别打印个位,十位,百位上的数字到控制台,并标明位数。
import java.util.Scanner;
public class Hello{
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int i = sc.nextInt();
System.out.println("个位数是:" + i % 10);
System.out.println("十位数是:" + i / 10 % 10);
System.out.println("百位数是:" + i /100 % 10);
}
}
字符相加
当字符 + 字符时,会把字符通过ASCII码表查询到对应的数字在进行计算
当字符 + 数字时,会把字符通过ASCII码表查询到对应的数字在进行计算
自增自减运算符
++和 -- 既可以放在变量的前面,也可以放在变更量的后面
++ 加 变量的值加1
-- 减 变量的值减1
两种用法
++和--无论是放在变量的前面还是放在变量的后面,单独写一行结果是一样的
int a = 10; //先用后加,b=10
int b = a++;
int a = 10; //先加后用,b=11
int b = ++a;
赋值运算符
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | int a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将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,判断a与b的值是否相等,成立为true,不成立为false |
!= | a!=b,判断a与b的值是否不相等,成立为true,不成立为false |
> | a>b,判断a的值是否大于b,成立为true,不成立为false |
>= | a>=b,判断a的值是否大于等于b,成立为true,不成立为false |
< | a<b,判断a的值是否小于b,成立为true,不成立为false |
<= | a<=b,判断a的值是否小于等于b,成立为true,不成立为false |
注意事项:关系运算符的结果都是boolean类型,要么是true,要么是false。
练习:你和你的对象在餐厅约会。键盘录入两个整数,表示你和你对象的时髦程度。(手动录入0~10之间的整数)如果你的时髦程度大于你对象的时髦程度,约会就会成功,输出true,否则输出false。
import java.util.Scanner;
public class Hello{
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入你衣服的时髦程度:");
int myclothes = sc.nextInt();
System.out.println("请输入你对象衣服的时髦程度:");
int your_girlfriend_clothes = sc.nextInt();
boolean result = myclothes > your_girlfriend_clothes;
System.out.println(result);
}
}
逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
& | 逻辑与(且) | 并且,两边都为真,结果才是真 |
| | 逻辑或 | 或者,两边都为假,结果才是假 |
^ | 逻辑异或 | 相同为false,不同为true |
! | 逻辑非 | 取反 |
短路逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 结果和&相同,但是有短路效果 |
|| | 短路或 | 结果和|相同,但是有短路效果 |
短路运算:当左边能确定表达式结果时,就不会运行后面了
练习:数字6是一个伟大的数字,键盘录入两个整数。如果其中一个数字为6,最终结果输出为true。如果他们的和为6的倍数,最终结果输出true,其他情况都是false。
import java.util.Scanner;
public class Hello{
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个数字:");
int a = sc.nextInt();
int b = sc.nextInt();
boolean result = a == 6 | b == 6 | (a+b) % 6 == 0;
System.out.println(result);
}
}
三元运算符(三元表达式)
格式
关系表达式?表达式1:表达式2;
计算规则
首先计算关系表达式的值
如果值为true,表达式1的值就是运算结果
如果值为false,表达式2的值就是运算结果
三元运算符的结果必须使用,可以赋值给一个变量或者打印。
练习:动物园有两只老虎,用键盘录入两只老虎体重,用程序实现体重是否相同。
import java.util.Scanner;
public class Hello{
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入两只老虎的体重:");
double weight1 = sc.nextInt();
double weight2 = sc.nextInt();
String result = weight1==weight2 ? "相同":"不相同";
System.out.println(result);
}
}
运算符优先级
同一级别的运算符按照从左到右的次序进行计算(但右结合运算符除外)。例如,由于&&的优先级比||的优先级高,所以表达式 a&&b||c等价于(a&&b)||c。又因为+=是右结合运算符,所以表达式a+=b+=c等价于a+=(b+=c),也就是a=a+b+c。
原码 反码 补码
原码
原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负。
弊端:利用原码对正数进行计算是不会有为题的。但是如果是负数计算,结果就出错,实际运算的结果,跟我们预期的结果是相反的。
例如
56----->0 0111000 //(符号位+数据)
反码
反码:为了解决原码不能计算负数问题而出现的。
计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变。数值取反,0变1,1变0。
弊端:负数运算的时候,如果结果不垮0,是没有任何问题的,但是如果结果跨0,跟实际结果会有1的偏差。
补码
为了解决负数计算时候跨0的问题出现的。
计算规则:正数的补码不变,负数的补码在反码的基础上+1。另外补码还能多记录一个特殊的值-128,该数据在一个字节下,没有原码和反码。
注意:计算机中的存储和计算都是以补码的形式进行的。
byte类型的10 1个字节 0000 1010
short类型的10 2个字节 0000 0000 0000 1010
int类型的10 4个字节 0000 0000 0000 0000 0000 0000 0000 1010
long类型的10 8个字节 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1010
其他符号运算,计算机底层运算规则
运算符 | 含义 | 运算规则 |
---|---|---|
& | 逻辑与 | 0为false 1为true |
| | 逻辑或 | 0为false 1为true |
<< | 左移 | 向左移动,低位补0 |
>> | 右移 | 向右移动,高位补0或1 |
>>> | 无符号右移 | 向右移动,高位补0 |
逻辑或示例:
左移示例: