目录
前言:
内置数据类型
类型默认值
示例:
内置数据类型转换
自动类型转换(隐式类型转换):
强制类型转换(显式类型转换):
隐含强制类型转换:
引用类型
前言:
Java中的所有数据类型如下图。
内置数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
-
整型(Integer Types):
- byte:8位有符号整数,范围为-128到127。
- short:16位有符号整数,范围为-32,768到32,767。
- int:32位有符号整数,范围为-2,147,483,648到2,147,483,647。
- long:64位有符号整数,范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
-
浮点型(Floating-Point Types):
- float:32位IEEE 754单精度浮点数。
- double:64位IEEE 754双精度浮点数。
-
字符型(Character Type):
- char:16位无符号Unicode字符,范围从'\u0000'(0)到'\uffff'(65535)。
-
布尔型(Boolean Type):
- boolean:表示真或假的值,只有两个取值:true和false。
类型默认值
下表列出了 Java 各个类型的默认值:
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | 'u0000' |
String (or any object) | null |
boolean | false |
示例:
public class Test {
static boolean bool;
static byte by;
static char ch;
static double d;
static float f;
static int i;
static long l;
static short sh;
static String str;
public static void main(String[] args) {
System.out.println("Bool :" + bool);
System.out.println("Byte :" + by);
System.out.println("Character:" + ch);
System.out.println("Double :" + d);
System.out.println("Float :" + f);
System.out.println("Integer :" + i);
System.out.println("Long :" + l);
System.out.println("Short :" + sh);
System.out.println("String :" + str);
}
}
输出结果为:
Bool :false
Byte :0
Character:
Double :0.0
Float :0.0
Integer :0
Long :0
Short :0
String :null
内置数据类型转换
自动类型转换和强制类型转换,隐含强制类型转换是Java中的三种类型转换方式。
-
自动类型转换(隐式类型转换):
在满足特定条件下,两种数据类型之间的转换可以由编译器自动完成,无需显式声明。这种转换需要满足两个条件:
- 数据类型彼此兼容
- 目标类型的取值范围大于源类型。
例如:
byte b = 3;
int x = b;
在上述代码中,将byte类型的变量b赋值给int类型的变量x。因为int类型的取值范围大于byte类型,所以编译器会自动进行类型转换,不会发生数据丢失。
-
强制类型转换(显式类型转换):
当两种类型彼此不兼容,或者目标类型的取值范围小于源类型时,需要显式地声明进行类型转换。
例如:
int a = 1000;
byte b = (byte) a;
在执行此代码时,将会发生数据溢出。由于byte类型的取值范围是-128到127,而1000超出了byte类型的取值范围。因此,强制类型转换将丢失高位信息,结果是b变量将被赋值为 -24,这是1000对256取模的结果(-24 = 1000 % 256)。
在上述代码中,将int类型的变量a强制转换为byte类型的变量b。由于byte类型的取值范围小于int类型,进行强制转换可能会导致数据精度的丢失。因此,需要在转换时使用(byte)
进行显式声明,告知编译器进行强制类型转换。
需要注意的是,在进行强制类型转换时,需要谨慎考虑源类型和目标类型之间的取值范围,以避免数据溢出或精度丢失。
-
隐含强制类型转换:
- 整数的默认类型是int:在Java中,整数字面值的默认类型是int。例如,如果您使用字面值直接初始化一个整数变量,编译器会将其默认为int类型。
- 小数默认是double类型浮点型:在Java中,小数(包括小数点和科学计数法表示)的默认类型是double。如果要定义一个float类型的小数,必须在数字后面加上F或f后缀,以明确指示它为float类型。(注意,如果没有指定F或f后缀,编译器会将小数默认为double类型。)
例如:
int a = 10; // 这里的整数字面值10被隐含地当作int类型处理
float b = 3.14F; // 这里的3.14被隐含地当作double类型,添加F后缀指定为float类型
System.out.println("a=" + a);
System.out.println("b=" + b);
运行结果:
a=10
b=3.14
引用类型
- 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用任何与之兼容的类型。
在Java中,我们可以创建自定义的引用类型,比如Site类。在这个例子中,先声明了一个名为site的引用变量,类型为Site。然后使用关键字new创建一个Site对象,并将其地址赋给site变量。
Site site = new Site("Runoob");
上述代码中,Site
参考了一个自定义的Site
类,该类可能包含有关网站的属性和行为(方法)。在括号中传入的参数"Runoob"
是通过构造函数初始化Site
对象的。
值得注意的是,在这个过程中,Site
类必须是已经定义并存在的,否则会导致编译错误。
通过这样的方式,我们就可以利用引用变量site
来操作和访问该Site
对象的属性和方法。例如,我们可以调用site
对象的方法或访问它的属性:
site.getName(); // 调用Site对象的getName方法
site.setName("Google"); // 修改Site对象的name属性
总结一下,引用类型的变量在声明时指定一个特定的类型,并可以用来引用与之兼容的对象。通过使用引用变量,我们可以操作和访问对象的属性和方法。同时,需要注意引用类型的默认值为null
,表示引用变量当前不指向任何对象。