为什么会有数据类型
java是一门强类型语言,每一次使用数据都要先声明这个数据的数据类型,那么为什么会有数据类型呢?
首先,我们要知道,临时数据是存储在内存中的,长期数据是存储在硬盘中的,每一个数据都有它自己的大小,所以每当我们要使用数据的时候,我们需要告诉程序,我们这段数据有多大,需要程序为这段数据分配多大空间,之后由程序来为数据分配空间。
问题来了,怎么告诉程序我们这段数据有多大空间呢?
在java中内置了八种基本数据类型专门用来告诉程序,该为数据开辟多大一片的空间。所以数据类型就是为了使程序能够合理的为数据开辟内存空间而产生的。
那么都有什么数据类型
java中的数据类型分为:
-
内置数据类型
提供了八种基本的数据类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 -
引用数据类型
类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。
内置数据类型:
数据类型 | 开辟的空间 | 最大值 | 最小值 | 默认值 | 有无符号 |
---|---|---|---|---|---|
byte | 8位 | 127(2^7-1) | -128(-2^7) | 0 | 有符号 |
short | 16位 | 32767(2^15 - 1) | -32768(-2^15) | 0 | 有符号 |
int | 32位 | 2,147,483,647(2^31 - 1) | -2,147,483,648(-2^31) | 0 | 有符号 |
long | 64位 | 2^63 -1 | -2^63 | 0L | 有符号 |
float | 单精度、32位 | 3.4028235E38 | 1.4E-45 | 0.0f | |
double | 双精度、64位 | 1.7976931348623157E308 | 4.9E-324 | 0.0d | |
char | 16位 | \uffff(即为65,535) | \u0000(即为0) | ||
boolean | false |
默认值是指当变量为成员变量时,默认的值
在本页最后会有相应的代码实例以及效果截图。
引用数据类型:
引用数据类型在字面意思上的理解就是一种引用,就好像它本身是一个指针,通过指向某一块内存地址来获取内存中的数据。因为是通过引用的方式调用内存中的数据,所以如果多个引用同时引用同一块数据,那么这些引用的值都相同。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用任何与之兼容的类型。
数据类型转换
在之前我们已经了解到了在内存空间中每种数据类型所代表的空间大小是多少,那么存不存在一种方式,可以让我们将数据类型进行转换呢?
当然是有的!
还从内存空间来分析,1个字节是8位,所以一个byte类型的变量是1个字节,一个short类型变量是4个字节,那么将byte中存放的数据放在short中不就是很容易实现了么,就像把一茶杯的水倒进一个鱼缸那么容易。
同理可以得到这么一个结论:
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
在需要进行类型转换的运算中,低级的数据类型可以自动的向高级数据类型进行转换。高级数据类型向低级数据类型进行转换的时候会丢失精度。(茶杯里的水可以随时倒进鱼缸,但鱼缸中的水倒进茶杯时会损失很多水)
数据类型转换必须满足如下规则:
-
不能对boolean类型进行类型转换。
-
不能把对象类型转换成不相关类的对象。
-
在把容量大的类型转换为容量小的类型时必须使用强制类型转换。转换过程中可能导致溢出或损失精度
-
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
测试数据类型各种属性的代码:(最大值,最小值,默认值,位数)
package study01_base;
import java.time.temporal.ChronoField;
public class baseDateType {
public static void main(String[] args) {
testDefault t = new testDefault();
// java 中包含六种数字类型,一种字符类型、一种布尔类型
// byte类型
System.out.println("byte长度:"+ Byte.SIZE);
System.out.println("byte最大值"+ Byte.MAX_VALUE);
System.out.println("byte最小值" + Byte.MIN_VALUE);
System.out.println("byte的默认值:"+ t.aByte);
System.out.println();
// short
System.out.println("short长度" + Short.SIZE);
System.out.println("short最大值" + Short.MAX_VALUE);
System.out.println("short最小值" + Short.MIN_VALUE);
System.out.println("short的默认值:" + t.aShort);
System.out.println();
// int
System.out.println("int长度:"+Integer.SIZE);
System.out.println("int最大值:" + Integer.MAX_VALUE);
System.out.println("int最小值:"+ Integer.MIN_VALUE);
System.out.println("int的位数"+Integer.BYTES);
System.out.println("int的默认值:" + t.anInt);
System.out.println();
// long
System.out.println("long长度:"+Long.SIZE);
System.out.println("long最大值:"+ Long.MAX_VALUE);
System.out.println("long最小值:"+Long.MIN_VALUE);
System.out.println("long的位数:" + Long.BYTES);
System.out.println("long的默认值:"+t.aLong);
System.out.println();
//float
System.out.println("float长度:"+Float.SIZE);
System.out.println("float最大值:"+Float.MAX_VALUE);
System.out.println("float最小值:"+ Float.MIN_VALUE);
System.out.println("flaot的位数:"+Float.BYTES);
System.out.println("float默认值:"+t.aFloat);
System.out.println();
//double
System.out.println("double长度:" + Double.SIZE);
System.out.println("double最大值:" + Double.MAX_VALUE);
System.out.println("double最小值:" + Double.MIN_VALUE);
System.out.println("double位数:" + Double.BYTES);
System.out.println("double的默认值:"+t.aDouble);
System.out.println();
//boolean
System.out.println("char占空间大小:" + Character.SIZE);
System.out.println("char最小值:" + Character.MIN_VALUE);
System.out.println("char最小值:" + Character.MAX_VALUE);
System.out.println("char位数:" + Character.BYTES);
System.out.println("char的默认值:"+t.aChar);
System.out.println();
//这里通过数据类型对应的封装类可以获得对应的属性以及属性值
}
}
// 创建一个testDefault类来测试每种类型的默认值
class testDefault{
byte aByte;
short aShort;
int anInt;
long aLong;
float aFloat;
double aDouble;
boolean aBoolean;
char aChar;
public byte getaByte() {
return aByte;
}
public short getaShort() {
return aShort;
}
public int getAnInt() {
return anInt;
}
public long getaLong() {
return aLong;
}
public float getaFloat() {
return aFloat;
}
public double getaDouble() {
return aDouble;
}
public boolean isaBoolean() {
return aBoolean;
}
public char getaChar() {
return aChar;
}
}