数据类型和运算符
1.进制
1.1文件存储单位
任何数据在计算机中都是以二进制的形式存在的,二进制早期由电信号开关演变而来 。
一个电信号或者一个二进制位统称为Bit位,8个Bit位为一组组成一个字节Byte 。
一个bit位表示的数的范围:0和1
一个byte表示的数的范围:256个数
无符号数:0-255(28-1) 256个数
有符号数:-128(-27)-- 127(27-1) 还是256个数
1.2 常见的进制介绍
- 2进制(计算机能够识别的),逢二进一
用0和1来表示
- 8进制,逢八进一
用0-7来表示
注意:8进制以0b开头
- 10进制(人类最常见的进制),逢十进一
用0-9来表示
- 16进制,逢十六进一
用0-9和ABCDEF来表示
注意:16进制以0x开头
2.常量和变量
2.1关键字与保留字
java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构。
2.2 标识符
标识符是用于给java程序中的变量、类、方法、包等命名的符号。
标识符需要遵守一定的规则:
1)标识符必须以字母(A-Z和a-z)、数字(0-9)、下划线“_”、美元符号“$”组成。
2)标识符不能以数字开头,其它部分可以是字母、下划线、美元符和数字的任意组合。
3)Java 标识符大小写敏感,且长度无限制。
4)标识符不可以是Java的关键字。
标识符的使用规范: 表示类名的标识符应首字母大写,并且采用驼峰式命名法则。
例如:Person, GoodStudent
表示方法和变量的标识符应首字母小写,并且采用驼峰式命名法则。
例如:int userName; public void eatFood(){}
注意:Java不采用通常语言使用的ASCII字符集,而是采用unicode这样的标准的国际字符集。因此,这里的字母的含义不仅仅是英文,还包括汉字等等。但是不建议大家使用汉字来定义标识符!
2.3 变量(Variable)与常量(Constant)
变量声明语法:数据类型 变量名;
变量的特点:在于“变”字,声明变量所开辟的内存空间可以多次赋值。
常见问题总结:
- 在方法中声明的变量,必须是赋值之后才能使用。
- 先声明后赋值,没用声明的变量名什么都不是。
- 变量名必须是合法的标识符,采用首字母小写的驼峰式命名。
- 赋值的数据类型必须和声明变量类型一致。
- 在同一个方法中,不能声明多个同名的变量。
常量语法:final 数据类型 常量名 = 数据值
Final float PI = 3.1415926f;
【注意事项】
- 常量只能被赋值一次,赋值完毕后就不能再更改值。
- 常量名一般由大写字母组成,多个单词可以用下划线分割,例如:
final int MAX_VALUE = 100;
3 .基本数据类型
- java是一种强类型语言,每个变量都必须声明其类型。
- java的数据类型分为两大类:基本类型(primitive type)和引用类型(reference type)。
3.1 整数型
【注意事项】
- 注意数据类型的表数范围,避免出现超出表数范围精度丢失的情况。
- 整型常量默认为int类型,声明long型常量可以加“l”或“L”,建议使用“L”。
3.2浮点型
小数类型在Java中称为浮点类型 。
浮点类型分为float类型和double类型
【注意事项】
- 浮点型常量默认为double类型。
- 浮点型常量赋值给float类型,需要在常量后面添加“f”或 “F”。
- 避免直接比较两个浮点数的大小,这样比较可能会出现问题。
3.3布尔型
- boolean类型有两个值:true和false。true代表真,false代表假。
- boolean类型用来判断逻辑条件,常用于程序流程控制。
boolean类型占用几个字节:没有具体的规定
1个bit
理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。
1个字节
理由是虽然编译后1和0只需占用1位空间 ,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。
3.4字符型
- 字符型在内存中占有2个字节,在Java中使用单引号包裹起来的一个字符称之为字符常量。例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串。
- char类型和int类型的联系和区别
联系:char类型常量在内存中存储的就是Unicode编码值,例如:'A'— 65, '1'— 49。在一定范围内,char类型和int类型是可以通用的
区别:
1. 分配的内存空间不同,int类型占4个字节,char类型占用2个字节。
2.数值表示的范围不同,int类型标识的范围比char类型更大,并且int类型还可以表示负数
4. Scanner键盘输入
java.util.Scanner是java5的新特征,主要功能是获取控制台输入的数据
4.1导入Scanner包
import java.util.Scanner;
4.2初始化Scanner对象
Scanner input = new Scanner(System.in);
4.3获取输入的数据
String str = input.nextLine();
例子:通过键盘录入获取圆的半径,然后计算出该圆的周长和面积
import java.util.Scanner;
public class ScannerTest {public static void main(String[] args) {// 通过Scanner获取半径Scanner input = new Scanner(System.in);System.out.print("请输入半径:");double r = input.nextDouble();// 计算出该圆的周长和面积。final double PI = 3.1415926;// 周长:2*PI*rdouble circumference = 2*PI*r;// 面积:PI*r*rdouble area = PI*r*r;System.out.println("周长:" + circumference + " 面积:" + area);}
}
5 基本数据类型转换
在赋值运算或算术运算时,要求数据类型相同,否则就要进行类型转换。
转换的方式:
- 自动类型转换(隐式)
- 强制类型转换(显示)
基本数据类型的转换主要包含:byte、short、int、long、float、double和char,不包含boolean类型。
5.1自动类型转换
自动类型转换(隐式类型转换)指的是容量小的数据类型可以自动转换为容量大的数据类型。(由低字节向高字节的转换 byte->short-> char –>int->long->float->double )
把整数常量(int类型)赋值给byte、short和char类型变量,属于自动类型转换的特例,只要不超出其表数范围即可。
算数运算中的类型自动转换原则:
- 如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型。 否则,如果其中一个操作数是long类型,另一个会转换为long类型。 * 否则,两个操作数都转换为int类型。
5.2强制类型转换
强制类型转换(显示类型转换),主要用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
语法格式:目标类型 变量 =(目标类型)源类型变量或常量
例:byte b = (byte)a
6.运算符(operator)
6.1算数运算符
6.1.1二元运算符
+:
- 对于数值型数据,可以做加法运算
- 对于字符串类型数据,做的是连接符操作,做的就是拼接操作! 还可以表示正数,+5
**-:** - 对于数值型数据,可以做减法运算 还可以表示负数,-5
*****: - 对于数值型数据,可以做乘法运算
**/:** - 对于数值型数据,可以做除法运算
**%:** - 取余或取模,也就是获取不能被整除的数
例:5%7,结果为:5
习题:获取整数987的百位数、十位数和个位数
import java.util.Scanner;
public class OperatorDemo01 {public static void main(String[] args) {// 2、获取整数987的百位数、十位数和个位数。int num = 987;// 获取百位数,9int bit1 = num / 100;// 获取十位数,8// 思路一:先获取98,然后再获取8// int bit2 = num / 10 % 10;// 思路二:先获取87,然后再获取8int bit2 = num % 100 / 10;// 获取个位数,7int bit3 = num % 10;System.out.println("百位数:" + bit1 + " 十位数:" + bit2 + " 个位数:" + bit3);
6.1.2一元运算符
一元运算符,只需要一个操作数参与运算即可! ++:
- 自增运算符
num++和++num,都等效于:num = num + 1; 当和别的操作数一起运算的时候: num++,先运算,后自增! ++num,先自增,后运算!--: - 自减运算符
num--和--num,都等效于:num = num - 1; 当和别的操作数一起运算的时候: num--,先运算,后自减! --num,先自减,后运算!
6.2赋值运算符
=:
- 把等号右边的数据赋值给等号左边的变量或final修饰的常量!
需求:交换两个变量的值(用两种方式实现)。 - 1.定义一个临时变量
int temp = num1;num1 = num2;num2 = temp;
- 2.不需要零时变量参与
int num1 = 10, num2 = 20;
num1 = num1 + num2; // num1 = 30, num2 = 20;
num2 = num1 - num2; // num1 = 30, num2 = 10;
num1 = num1 - num2; // num1 = 20, num2 = 10;
6.3扩展赋值运算符
扩展赋值运算符:是算术运算符和赋值运算符结合
6.4 关系运算符
关系运算符用来进行比较运算,关系运算符的运算结果是boolean类型。
<、>=、<=、==、!=
6.5逻辑运算符
&, |, ^, &&, ||, ! 特点:参与逻辑运算的数据类型都必须是boolean类型 逻辑运算符执行完毕返回的结果也是boolean类型
- &与
两边都为true时,那么返回的结果就为true 只要有一边为false,那么返回的结果就为false 辅助记忆:小明与小红来一趟办公室!
- |或
两边都为false时,那么返回的结果就为false 只要有一边为true,那么返回的结果就为true 辅助记忆:小明或小红来一趟办公室!
- ^异或
当两边不相同时,返回的结果才为true 当两边相同时,返回的结果才为false
- &&短路与
&和&&相同点: 返回的boolean结果都是一模一样!
&和&&不同点:执行过程不一样
&&:当左边表达式的结果为false时,那么右边表达式不需要执行,直接返回左侧表达式的结果即可!
当左边表达式的结果为true时,那么右边表达式需要执行,直接返回右侧表达式的结果即可!
&:无论左侧表达式结果为什么(true或false),右边表达式都需要执行!
现实开发中,使用&&最常见,因为&&的执行效率高于&!
- ||短路或
|和||相同点:执行过程不一样,返回的boolean结果都是一模一样!
|和||不同点:
||:当左边表达式的结果为true时,那么右边表达式不需要执行,直接返回左侧表达式的结果即可!
当左边表达式的结果为false时,那么右边表达式需要执行,直接返回右侧表达式的结果即可!
|:无论左侧表达式结果为什么(true或false),右边表达式都需要执行!
现实开发中,使用||最常见,因为||的执行效率高于|
- !取反,并时属于一元运算符
当true取反,结果为false 当false取反,结果就是true
6.6三元运算符
三元运算符又称为三目运算。
语法格式:条件表达式? 表达式1 : 表达式2
如果条件表达式为true,则取表达式1的值,否则就取表达式2的值。