一、数据类型
计算机中存储和使用的任何数据,都是以二进制的形式存在的,那么计算机如何知道一串二进制数据是数字、字母还是其他类型的数据呢?在java中就是根据数据类型进行区分的。
java中主要分为两大类,基本数据类型和引用数据类型(如图)
基本数据类型:
数值类型:
整型:只能存储整数值;
byte(1字节:取值范围 - (27) ~ 27-1)
shor(2字节:取值范围 - (215) ~ 215-1)
int(4字节:取值范围 - (231) ~ 231-1)
long(8字节:取值范围 - (263) ~ 263-1)
浮点型:只能存储小数值
float(单精度浮点型:4字节)
double(双精度浮点型:8字节)
非数值类型:
char(字符型:2字节):只能存储一个字符,字符值需要使用英文格式的单引号''括起来;这样计算机才知道这个值是字符型的值
boolean(布尔类型:1字节):只有两个值;true和false
引用数据类型:
String:存储若干多个字符,字符串常量值必须用英文格式的双引号""括起来,这样计算机才知道这个值是字符串类型的值
如:"abc" "123"
这里的123不代表一百二十三,而只是代表一二三这三个字符,这三个字符被组合在一起,并使用英文格式的双引号括起来,就构成了一个字符串
特殊说明
在Java中char类型和整型是可以互相转换的;这是因为Java在底层对char类型也是当做整型来处理的;那么字符和整型之间有什么关系呢?
这里就涉及到编码的问题。前面讲到,计算机只认识二进制,也就是0和1这两个数;无论计算机存储的数字,字母,汉字等等,在存储的时候这些值都会被转换成二进制。当需要读取或显示出来的时候,计算机是如何知道存储的二进制是什么呢?这就需要一套标准,来规定具体值和二进制之间的对应关系,这就是编码。
最简单的ASCII编码
可以看到其中A对应的是65,a对应的是97,这样字符就可以转换成整型,在把整型转换成二进制进行存储了。
ASCII码只占一个字节,最多对应127个字符;但是对于中文来说,常用的汉字就有三千多个,一个字节显然是不够用的,Java为了使char类型能够兼容中文(存储一个汉字)采用的是全球统一的Unicode编码。
Unicode编码占两个字节,完全可以包含ASCII编码值,所以Java中的char类型存储英文字符时,使用的还是ASCII编码中的值
另外,中文编码还有GB2312,GBK等;英文编码IOS-8859-1等
拓展:1字节(byte)= 8位(bit);1位只能存储一个二进制值
1GB =1024MB ;1MB=1024KB;1KB = 1024byte;
二、常量和变量
变量:程序运行过程中,可以改变的数据?
常量:程序运行过程中,不可改变的数据
变量
一个变量必须有数据类型和名字,而且必须先告诉计算机变量的数据类型和名字(这个步骤叫声明变量,也称为定义变量),然后才可以使用这个变量;即:先声明,后使用
声明变量的语法格式:数据类型 变量名;
为变量赋值的语法格式:变量名 = 值
以上两条语句可以合并:数据类型 变量名 = 值;
同时声明多个同一类型的变量:使用英文格式的逗号隔开
语法格式:数据类型 变量名1,变量名2, …, 变量名n;
如:声明一个int类型的变量age :int age;
为变量age赋值:age = 5;
合并:int age = 5;
其中int是数据类型,age是变量名,变量名是根据标识符的命名规则自定义的。当为变量age赋值时,变量age必须在使用之前声明过,如果未声明,则会出现错误。执行完成后age的值就是18。赋的值可以是常量,也可以是另一个变量。
如果将输出上面的age(Syste.out.println(age); )输出的结果就是5;
另外要注意,如果代码写成System.out.println(“age”);这时候输出的就是age,而不是5。因为这里的age被英文格式的双引号括住,计算机认为这是个字符串,而会将它当成变量名
/**
* 演示变量的声明和使用
* @author I学霸
*/
public class VariableDemo {
public static void main(String[] args) {
//声明一个int类型的变量age
int age;
//为变量age赋值
age = 18;
//输出变量中的存储的值;输出结果:18
System.out.println(age);
//声明一个float类型的变量f并赋值为18
float f = 18F;
//输出变量f中存储的值;输出结果:18.0
System.out.println(f);
//同时声明三个int类型的变量,变量名分别为a,b,c
int a,b,c;
//为变量a赋值
a = 1;
//为变量b和c赋值为变量a中存储的值
b = a;
c = b;
//输出结果:1
System.out.println(a);
//输出结果:1
System.out.println(b);
//输出结果:1
System.out.println(c);
//同时声明三个String类型的变量并分别赋值,变量名分别为x,y,z
String x = "",y = "123abc",z = "中文字符串";
//输出结果:
System.out.println(x);
//输出结果:123abc
System.out.println(y);
//输出结果:中文字符串
System.out.println(z);
//同时声明三个char类型的变量,并为ch1赋值,变量名分别为ch1,ch2,ch3
char ch1 = 'a',ch2,ch3;
//变量可以赋值任意多次,ch1又被赋值为b
ch1 = 'b';
ch2 = '\'';
ch3 = '\"';
//输出结果:b
System.out.println(ch1);
//输出结果:'
System.out.println(ch2);
//输出结果:"
System.out.println(ch3);
//声明布尔类型的变量bool并赋值为true
boolean bool = true;
//输出结果:true
System.out.println(bool);
}
}
常量
例如:上面int age = 5; 其中5就是一个int类型的常量,无论程序如何运行5永远是5,永远不会变。 age的是一个变量,所以age的值可以发生变量,age = 6;//执行此句代码后age的值就是6。在程序中直接写常量值的默认类型如下
10(任意整数):代表整形常量,默认数据类型:int;
10.0(任意小数):代表浮点型常量,默认数据类型:double;
true或false:代表boolean(布尔型)常量
‘a’(任意一个被单引号括起来的字符):代表char(字符型)常量; char类型的常量使用单引号括起来,单引号只能且必须括一个字符,转义字符除外
“a”(任意多个被双引号括起来的字符):代表String(字符串)常量;String类型常量使用双引号括起来,可以括0到多个字符;
另外java中有三种在常量值后加类型首字母做后缀,来设定该常量值的数据类型
例如:
5L代表long类型的值5;
5F代表float类型的值5.0;
5D代表double类型的值5.0。
其中L、F、D大小写均可,建议大写,因为小写的字母l和数字1很难区分
转义字符
转义字符:是一种特殊的字符常量,将字符原有的含义转换成其他意义,故称作转义字符。转义字符以反斜线\开头,后跟一个或几个字符。
例如:\n其意义是“换行”,而不再表示字符\和字母n;
常用的转义字符 |
转义字符的意义 |
ASCII码 |
\n |
换行 |
10 |
\t |
制表符 |
9 |
\b |
退格 |
8 |
\r |
回车 |
13 |
\\ |
反斜线符\ |
92 |
\' |
单引号符 |
39 |
\" |
双引号符 |
34 |
由于转义字符通过反斜杠改变了字符原有的意义故称"转义"字符
以上所说的常量都没有名字,而变量必须有名字,如何给常量起名字?如果可以规定变量只能被赋值一次,不就相当于常量了吗!接下来看如何将变量设置成常量。
java中使用关键字final声明的变量就只能被赋值一次,这个变量就成为了常量;
声明常量的语法格式:final 数据类型 变量名;
为常量赋值的语法格式:变量名 = 值;
合并:final 数据类型 变量名 = 值;
一条语句声明多个常量的语法格式:final 数据类型 变量名1,变量名2, …,变量名n;
注意:常量只能被赋值一次
/** * 演示常量的声明和使用
* @author 学霸联盟 - 赵灿
*/
public class Constant {
public static void main(String[] args) {
//声明一个int类型的常量age
final int age;
// 为常量age赋值,只能赋值一次
age = 18;
// 输出变量中的存储的值;输出结果:18
System.out.println(age);
//同时声明三个char类型的变量,常量名分别为ch1,ch2,ch3
final char ch1 = 'a',ch2,ch3;
//ch1只能被赋值一次,再次赋值就会出错
//ch1 = 'b';
ch2 = '\'';
ch3 = '\"';
//输出结果:a
System.out.println(ch1);
//输出结果:'
System.out.println(ch2);
//输出结果:"
System.out.println(ch3);
}
}
三、数据类型之间的转换
类型转换:将一种数据类型的数据转换成另一种兼容的数据类型。Java属于强类型语言;一旦某个变量被声明为某种数据类型,如果不经过类型转换,那么这个变量将永远是这种数据类型;
与其相对应的是弱类型语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
数据类型之间的转换分为两种情况:自动类型转换和强制类型转换
上面讲到java中的8中基本数据类型,都有固定的字节长度。
从字节长度小的数据类型转换成字节长度大的数据类型,不会导致数据出错,这时系统会自动完成这样的数据类型转换,故称为自动数据类型转换
例如:byte 类型的数据转换成int类型
从字节长度大的数据类型转换成字节长度小的数据类型,可能会导致数据出错(损失精度),这样可以自动进行数据类型的转换,这时系统不会自动去完成这样可能出现错误的转换,需要手动编写代码强制系统进行转换,股称为强制类型转换
例如:double类型转换成int类型
/** * 演示数据类型转换
* @author 学霸联盟 - 赵灿
*/
public class DataTypeConversionDemo {
public static void main(String[] args) {
/*
* 声明byte类型的变量b,并赋值为123
* 这里123默认为int类型,但一个变量被赋常量值时,
* 系统会自动判断这个的常量值是否超出变量数据类型的取值范围
* 如果没有超出,即使进行强制类型转换也不会导致数据错误
* 所以系统在编译时会自动将其进行强制类型转换
* 如果超出了取值范围,则会提示错误。
* 例如:byte b = 1000
* 其中1000超出了byte的取值范围,所以上式是错误的
*/
byte b = 123;
//输出结果:123
System.out.println(b);
//声明int类型的变量i,并赋值为256
int i = 256;
//输出结果:256
System.out.println(i);
//声明float类型的变量d,并赋值为123.1
float d = 123.1F;
//输出结果:123.1
System.out.println(d);
//声明一个byte类型的变量intToByte
//并将int类型变量i的值强制转换成byte类型的值赋给变量intToByte
byte intToByte = (byte)i;
//输出结果:0
System.out.println(intToByte);
//声明一个int类型的变量byteToInt
//并将byte类型变量b的值赋值给变量byteToInt,系统自动进行类型转换
int byteToInt = b;
//输出结果:123
System.out.println(byteToInt);
//将float类型变量d的值,强制转换为int类型的值,结果会将小数部分丢弃
int floatToInt = (int)d;
//输出结果:123
System.out.println(floatToInt);
/*
* 数值类型之间数据是兼容的,可以进行自动或强制类型转换
* 但数值类型和boolean类型之间,数据是不兼容的
* 所以无法进行自动或强制类型转换
* 例如:int i = 1;
* boolean bool = true;
* 无论是i = bool;
* 还是 bool = (boolean)i;
* 都是错误的
*/
}
不管是自动类型转换还是强制类型转换,参与转换的数据类型必须是兼容的。
例如:你不能将字符串“abc”转换成一个整数,因为他们之间是不兼容的
注意:为byte、short类型赋常量值时,也是存在自动类型转换的
例:byte b = 5; 此语句中的5是int类型,由于5是常量,在编译时编译器会自动判断这个常量是否在byte类型的取值范围之内;
如果在,系统会自动将类型由int转换成byte;
如果不在,系统就不会自作多情的帮你转换了,就会出现编译错误
例如:byte b = 256;//编译时,这里会出现错误
小结:
数据类型之间转换的前提是,数据类型之间要兼容
自动类型转换:大的数据类型 = 小的数据类型;
强制类型转换:小的数据类型 = (小的数据类型)大的数据类型;有可能损失精度