目录
数据类型
Java中常见的数据类型
编程来源于生活 , 在生活中数据是有类型的,比如说人的姓名是字符串类型,人的年龄是正整数类型。Java编程语言中的数据类型主要分为两种:基本数据类型和引用数据类型。
-
基本数据类型是Java语言中内置的类型,分别是整数类型、小数类型、字符类型、布尔类型。这四类基本类型是最简单、最基础的类型。
-
引用数据类型包含数组,类,接口,暂时不用管,目前还没有学习到,暂且不谈及。
常量
什么是常量?
常量就是指恒定不变的数据量,其值在程序运行过程中不能被修改**. 例如生活中一年有12个月,这个12就是恒定不变的,那么12这个常量是什么类型呢?我们回忆一下基本类型中有四类,分别是整数、小数(浮点数)、字符、布尔。显然这个12是整数类型的常量。
常量的类型有哪些?
-
整数类型(byte,short,int,long)
-
十进制表示方式:正常数字 如 13、25等;
-
十进制数:用0~9组成的数 现实生活最常用;
-
-
小数类型(float,double)
-
如1.0、-3.15、3.168等;
-
-
布尔类型(boolean)
-
true、false;
-
-
字符类型:用单引号括起来单个字符(char)
-
如'a','A', '0', '男';
-
字符必须使用’’ 包裹,并且其中只能且仅能包含一个字符。
-
-
字符串类型:用双引号括起来的任意多个字符(Stirng)
-
字符串String类型是一种引用类型,我们先了解作为常量类型的使用方式;
-
如“Java”,“abc”,“”,”,你好”;
-
字符串必须使用“”包裹,其中可以包含0~N个字符。
-
回顾上一个HelloWorld案例,其中System.out.println(“Hello World!”)的圆括号中放的就是一个字符串。那么我们是否可以把圆括号中的字符串换成其他字符串呢?这当然是可以的!不只是可以换成其他字符串,还可以把圆括号中的字符串换成其他类型的常量,例如:
public class ConstantDemo {
public static void main(String[] args) {
//1.整数常量
//System.out.println("Hello World");
System.out.println(6666);
System.out.println(23333);
//2.小数常量
System.out.println(3.1415926);
System.out.println(3.03);
//3.布尔常量
System.out.println(true);
System.out.println(false);
//4.字符型常量
System.out.println('a');
System.out.println('1');
System.out.println('A');
System.out.println('*');
//System.out.println('hello'); //编译报错
System.out.println('男'); //一个汉字代表一个字符
//System.out.println(''); //Java编程语言不允许有空字符
//5.字符串常量
System.out.println("你好吗?");
System.out.println("好");
System.out.println("88888");
System.out.println("1.414");
System.out.println(""); //空串 (相当于空签子)
}
}
变量
什么是变量?
变量是一个内存中的一个容器,专门用来存放数据,容器是什么?生活中也有很多容器,例如水杯是容器,用来装载水;你家里的大衣柜是容器,用来装载衣裤;饭盒是容器,用来装载饭菜。那么变量是装载什么的呢?答案是数据!结论:变量是内存中装载数据的小盒子,你只能用它来存数据和取数据。
变量的类型有哪些?
大衣柜不能用来装载水,水杯也不能用来装载衣裤。这说明不同的容器装载不同的物品。变量也是如此,在创建变量时需要指定变量的数据类型,例如整型变量、浮点型变量等等。
结论:变量必须要有明确的类型,什么类型的变量装载什么类型的数据。水杯是用来装水的,那么水杯能装多少水呢?一吨?我们知道水杯在创建时不只确定了要装载的是水(数据类型),而且还确定了能装多少水(数据类型所代表的数据范围). 变量也是如此,需要指定变量能装载什么类型的数据,同时也要指定变量能装载多大的数据。
Java中基本类型一共4类,把这4类展开后共8种基本类型。我们今后编写程序时使用的是这8种基本类型而不是4类,这8种基本类型指定了范围。
四类 | 八种 | 字节数 | 数据表示范围 |
---|---|---|---|
整型 | byte | 1 | -128~127 |
short | 2 | -32768~32767 | |
int | 4 | -2147483648~2147483648 | |
long | 8 | -263~263-1 | |
浮点型 | float | 4 | -3.403E38~3.403E38 |
double | 8 | -1.798E308~1.798E308 | |
字符型 | char | 2 | 表示一个字符,如('a','A','0','家') |
布尔型 | boolean | 1 | 只有两个值true与false |
定义变量(创建变量)
//格式:
//数据类型 变量名称 = 变量值;
int a = 134;//在内存中声明了一块名字叫a的容器,里面存放着134这个数值
System.out.println(a); // 在内存中找到叫a的变量,并且输出其中的值
其中int是数据类型,指定了变量只能存储整数,而且指定了存储范围为-2147483648~2147483648。其中a表示变量名,变量名是标识符,这说明只要是合法的标识符都可以用来做变量名。在程序中可以通过变量名来操作变量(内存中的小盒子)。
其中“=134”是给变量赋值,即向a变量中写入134(变量是个小盒子,现在小盒子中保存的是134)。注意,给变量赋的值一定要与类型符合,也就是说int类型只能存储整数,而且必须是在-2147483648~2147483648范围内的整数。134满足了这两个条件,所以是正确的。
其他变量定义也是按照这个格式
//字符型变量
char ch='M';
System.out.println(ch);
其余的不再依次展示。
变量使用的注意事项
变量一些常见问题:
1.变量可以先定义再赋值(给值),变量如果使用必须给值
//1.变量可以先定义再赋值,变量如果使用必须先赋值再使用
/*int i = 3;
System.out.println(i);*/
int i; //定义一个空盒子i
i = 87; // 将87赋值给变量i (将87装到盒子i中)
System.out.println(i);
//int j;
//System.out.println(j);//如果变量未赋值,这个变量不能使用,编译直接报错(空盒子取不出来东西)
2.变量可以一次性多个,也可以直接初始化
//2.变量可以一次性定义多个,也可以直接进行初始化
int j, k;
int j = 3, k = 2;
3.变量有使用范围(作用域),如果超出范围,不能使用这个变量
//3.每个变量均有其作用域(使用范围),如果超出作用域(使用范围),不能使用这个变量
//System.out.println(m);//不在m的作用域范围
int m = 654; //m的作用域范围从18行-25行
{
int n = 789;//n的作用域范围只在花括号{}内
System.out.println(m);//654
System.out.println(n);//789
}
System.out.println(m);
//System.out.println(n);//在这个位置访问n超出了n的作用域(可使用)范围
4.在一个变量的作用域范围内不能在声明和它同名的变量
//4.在一个变量的作用域范围下不能声明同名变量,同一个变量中的值可以被覆盖
double d = 3.14;
{
//double d = 5.62;
d = 5.62; // 5.62值覆盖掉了原有的值3.14
System.out.println(d); //5.62
}
System.out.println(d); //5.62
5. 变量一旦定义,可以反复使用
//5.变量一经定义,可以反复使用
char ch = '你';
ch = '好';
ch = '吗';
System.out.println(ch);
变量数据类型转换
不同类型的变量是否可以在一起运算呢?答案是可以的,但要先进行类型转换再运算。在Java中,变量类型转换主要分为两种:自动类型提升(隐式)和强制类型转换(显式)。在学习类型转换前我们还需要学习下java的默认数据类型。
默认数据类型
整数型常量100,它是byte、short、int、long中的哪一种呢? java中规定写一个整数100,它的默认的类型是int类型 同理可得小数常量3.14,它是float double中的哪一种呢? java中规定默认的浮点类型是double类型。
自动类型提升(隐式)
自动类型提升的原则是范围小的数据类型可以直接转换为范围大的数据类型 自动类型提升之所以能自动完成是因为不会造成精度的损失 隐式的含义: 编译器自动转换,不需要手动干预 大家可以想象成把小容器中的水倒入大容器,不会有水溢出. 或者说 大范围类型可以兼容小范围类型。
byte -> short -> int -> long -> float -> double
随机挑选箭头方向两种数据类型都是自动类型提升
下面我们用代码说明一下:
public class VariableDemo{
public static void main(String[] args) {
// int a = 30; //30是一个int常量, int常量赋值给int变量,不是自动类型提升
long b = 134; //134是int类型常量, int常量赋值给long变量,是自动类型提升
//将int类型的134 提升成了long类型
//自动含义是指编译器帮我们做了int=>long类型提升不需要手动干预(隐式)
int i = 13;
double d1 = 17; //自动类型提升 int的17提升成了double类型
//d1变量中存储的是17提升成double类型的值17.0
double d2 = i; //将i类型提升为double类型,i的值也从13变成了13.0
//再将13.0赋值给d2
System.out.println(d1);//17.0
System.out.println(i);//13
System.out.println(d2);//13.0
//int c = 2232321232323; //编译报错 该整数常量超出了int的范围,无法存储
//long l = 2232321232323; //由于Java中默认数据类型是int,所以编译器此时还是把2232321232323当成int来检测,检测其是否超出int范围
//如果超出就直接报错
long l = 2232321232323L;//此时在整数常量末尾添加L(l),那么这个整数常量就不会再当成默认类型int去检测,而是在编译时当成long类型去检测是否在long的数值范围内
//double d = 3.14; // 3.14是double常量,左侧是double变量,不是自动类型提升
// float f = 3.14; // 3.14是double常量,左侧是float类型,double->float不是自动类型提升
float f = 3.14f; // 3.14f代表float类型常量,左侧是float类型变量
double d =3.14d; //3.14d代表double类型常量,3,14d(D)和3.14是完全等效的,因此d(D)可以省略
}
}
强制类型转换(显式)
强制类型转换的原则是范围大的数据类型强制转换为范围小的数据类型 强制类型转换之所以不会自动完成是因为有可能造成数据精度的损失。显式的含义: 需要手动进行强转,否则编译失败 大家可以想象成把大容器中的水倒入小容器 , 存在有水会溢出的可能。
byte <- short <- int <- long <- float <- double
随机挑选箭头方向两种数据类型都需要强制类型转换
强制类型转换代码格式:
范围小的数据类型 变量 = (范围小的数据类型) 范围大的数据类型值;
同样,在这里我们用代码写一个Demo简单说明下:
public class VariableDemo{
public static void main(String[] args){
double d = 3.141;
int i = (int) d; //将double类型的d强制转换成int类型
// 将d的3.141强制转换为整形3,然后再赋值给i
//强制转换会造成精度损失,不推荐使用
System.out.println(d);
System.out.println(i);
byte b1 = 13; //13默认数据类型是int,将int赋值给byte,目测是强制类型转换,而代码根本没有,为什么不报错?
// 将一个整数赋值一个一个byte类型的变量时,如果这个整数在byte类型范围内(-128~127)
// 那么Java编译器会自动将这个整数强转为byte类型,然后赋值
byte b2 = (byte)13; //等效于byte b1 = 13;
}
}
最后,如果感兴趣的话可以自己在IDEA中将这些代码实现一下!!