二、Java基本语法(二)——基本数据类型

  • 1、基本数据类型
  • 1.1、整数类型: byte、 short、 int、 long
  • 1.2、浮点类型: float、 double
  • 1.3、字符类型: char
  • 1.4、布尔类型: boolean
  • 2、基本数据类型变量间转换
  • 2.1、自动类型转换(只涉及7种基本数据类型)
  • 2.2、强制类型转换(只涉及7种基本数据类型)
  • 3、基本数据类型与String间转换
  • 4、进制与进制间的转换
  • 5、常见计算机字符编码:
  • 5.1 ASCII 码
  • 5.2 Unicode 编码
  • 5.3 UTF-8编码


1、基本数据类型

Java各数据类型有固定的表数范围和字段长度,不受具体OS(操作系统)的影响,以保证java程序的可移植性。

1.1、整数类型: byte、 short、 int、 long

java实现工作单元 java最基本的单元_开发语言

  • bit: 计算机中的最小存储单位。 byte:计算机中基本存储单元。
  • 整型的常量,默认类型为int型。
  • 声明long型变量,变量值必须以"l"或"L"结尾。
  • 通常,定义整型变量时,使用int型。
public class Test {
	public static void main(String[] args) {
		byte b1 = 12;
		short s1 = 128;
		int i1 = 1234;
		// 编译失败:过大的整数,整型常量,默认类型为int型,int型存放不了这么大的值
		// int l1 = 21332423235234123;
		// long l1 = 21332423235234123;
		// 声明long型变量,必须以"l"或"L"结尾
		long l1 = 21332423235234123L;
		System.out.println(l1);
	}
}

1.2、浮点类型: float、 double

java实现工作单元 java最基本的单元_基本数据类型_02

  • 浮点型常量,表示带小数点的数值,有两种表示形式:
  • 十进制数形式,如: 5.12、512.0f、.512 (必须有小数点)
  • 科学计数法形式,如: 5.12e2、512E2、100E-2
  • 浮点型常量的精度:
  • float:单精度,尾数可以精确到7位有效数字。
  • double:双精度,精度是float的两倍。通常采用此类型。
  • 浮点型的常量,默认类型为double型。
  • 声明float型变量时,变量值要以"f"或"F"结尾
  • 通常,定义浮点型变量时,使用double型。
  • float表示数值的范围比long还大。
public class Test {
	public static void main(String[] args) {
		double d1 = 123.3;
		// 编译失败,浮点型常量,默认类型为double型
		// float f1 = 12.3;
		// 定义float类型变量时,变量要以"f"或"F"结尾
		float f1 = 12.3F;
		System.out.println(f1);
	}
}

1.3、字符类型: char

  • 定义char型变量,通常使用一对’',内部只能写一个字符(1字符=2字节)。
  • 字符型变量的三种表现形式:
  • 1、使用一对’'声明一个字符。 Java使用Unicode编码,故一个字符可以存储一个字母,汉字,或其他字符。如: char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’;
  • 2、使用转义字符‘\’。如: char c3 = ‘\n’; // 表示换行符。
  • 3、直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中, XXXX代表一个十六进制整数。如: \u000a 表示 \n。
  • char类型是可以进行运算的。因为它都对应有Unicode码。
public class Test {
	public static void main(String[] args) {
		// 1、使用一对''声明一个字符。
		char c1 = 'a';// 97
		// 2、使用转义字符‘\’。
		char c2 = '\n';//换行符
		// 3、使用 Unicode 值。
		char c3 = '\u0043';
		System.out.println(c3);
		// 开发中非常少见,对应Unicode 中的一个字符'a'
		char c4 = 97;
		int i1 = (int)c1;
		System.out.println(i1);//97
	}
}

1.4、布尔类型: boolean

  • 用来判断逻辑条件,用于流程控制:
  • if条件控制语句;
  • while、do-while、 for循环控制语句;
  • 只能取两个值之一:true 、 false,无null。
  • 不可以使用0或非0 的整数替代false和true。
  • Java虚拟机中没有任何供boolean值专用的字节码指令, Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替: true用1表示, false用0表示。
public class Test {
	public static void main(String[] args) {
		boolean isMarried = true;
		if(isMarried){
			System.out.println("围城中!");
		}else{
			System.out.println("单身汪!");
		}
	}
}

2、基本数据类型变量间转换

2.1、自动类型转换(只涉及7种基本数据类型)

java实现工作单元 java最基本的单元_java_03

  • 自动类型转换:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
  • 容量大小指的是,表示数的范围的大和小。比如:float容量要大于long的容量。
  • byte,short,char之间不会相互转换,他们三者在计算时,首先转换为int类型。
  • boolean类型不能与其它数据类型运算。
public class Test {
	public static void main(String[] args) {
		byte b1 = 12;
		short s1 = 128;
		int i1 = 1234;
		
		int i2 = b1 + i1;// 1246
		long l1 = b1 + i1;// 1246
		float f1 = b1 + i1;// 1246.0
		double d1 = s1;// 128.0
		System.out.println(d1);
		
		char c1 = 'a';//97
		int i3 = c1 + b1;// 109
		System.out.println(i3);
		
		//编译失败,计算时,转换为了int类型
		//byte b2 = b1 + 1;
		//编译失败,计算时转换为了double类型
		//float f2 = b1 + 12.3;
	}
}

2.2、强制类型转换(只涉及7种基本数据类型)

  • 自动类型转换的逆过程, 将容量大的数据类型转换为容量小的数据类型。
  • 需要使用强转符:()
  • 可能导致精度损失
  • 字符串不能直接转换为基本类型, 但可以通过基本类型对应的包装类,把字符串转换成基本类型。
  • boolean类型不可以转换为其它的数据类型。
public class Test {
	public static void main(String[] args) {
		//没有精度损失
		long l1 = 123;
		short s2 = (short)l1;
		
		//精度损失举例1
		double d1 = 12.9;
		int i1 = (int)d1;//截断操作
		System.out.println(i1);//12
		
		//精度损失举例2
		int i2 = 128;
		byte b = (byte)i2;
		System.out.println(b);//-128
	}
}

3、基本数据类型与String间转换

String类型变量的使用

  1. String属于引用数据类型,翻译为:字符串;
  2. 声明String类型变量时,使用一对"";
  3. String可以和8种基本数据类型变量做运算,且运算只能是连接运算:+;
  4. 运算的结果仍然是String类型;
public class Test {
	public static void main(String[] args) {
		String s1 = "Hello World!";
		System.out.println(s1);
		
		int number = 10086;
		System.out.println(s1 + number);// +:连接运算
		
		//String str1 = 123;//编译错误
		//int i = (int)s1;//编译错误
		String str1 = 123 + "";
		System.out.println(str1);
	}
}

4、进制与进制间的转换

  • 所有数字在计算机底层都以二进制形式存在。
  • 对于整数,有四种表示方式:
  • 二进制(binary):0,1 ,满2进1.以0b或0B开头。
  • 十进制(decimal):0-9 ,满10进1。
  • 八进制(octal):0-7 ,满8进1. 以数字0开头表示。
  • 十六进制(hex):0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。 如:0x21AF +1= 0X21B0
public class Test {
	public static void main(String[] args) {
		int num1 = 0b110;	// 二进制
		int num2 = 110;	// 十进制
		int num3 = 0127; // 八进制
		int num4 = 0x110A;	// 十六进制

		System.out.println("num4 = " + num4);
	}
}
  • 二进制定义整数int时,第32位是符号位;
  • 二进制的整数有如下三种形式:
  • 原码:直接将一个数值换成二进制数。最高位是符号位
  • 负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
  • 负数的补码:其反码加1。
  • 计算机以二进制补码的形式保存所有数据的:
  • 原因:简化运算设计,符号位也参与运算,1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法。
  • 正数的原码、反码、补码都相同。
  • 负数的补码是其反码+1。
  • 进制的基本转换
  • 十进制——》二进制:除2取余的逆
  • 二进制——》十进制:乘以2的幂数
  • 二进制《——》八进制:二进制中的3位表示八进制中的1位
  • 二进制《——》十六进制:二进制中的4位表示八进制中的1位
  • 十进制《——》八进制互转:转成二进制再转
  • 十进制《——》十六进制互转:转成二进制再转

5、常见计算机字符编码:

5.1 ASCII 码

  • 美国制定的一套字符编码, 规定了英语字符与二进制位之间的关系。
  • 只占用了一个字节的后面7位, 最前面的1位统一规定为0。
  • 缺点:
  • 不能表示所有字符。
  • 相同的编码表示的字符不一样。

5.2 Unicode 编码

  • 所有的符号都纳入其中,每个符号唯一编码,没有乱码的问题。
  • 缺点: Unicode 只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储(每个符号用几个字节表示):无法区别 Unicode 和 ASCII。

5.3 UTF-8编码

  • 使用最广的一种 Unicode 的实现方式。
  • 变长的编码方式。它可以使用 1-6 个字节表示一个符号,根据不同的符号而变化字节长度。
  • UTF-8的编码规则:
  • 单字节,最高位为0,其余7位用来对字符进行编码(等同于ASCII码)。
  • 多(n)字节,第一个字节的前 n 位为1,第 n+1 位为0,剩余各位用来对字符进行编码。其余字节,最高两位为"10",剩余6位用来对字符进行编码。