目录
- Java基本语法和基础数据类型
- 标识符和关键字有什么区别?
- Java关键字有哪些?
- Java基本数据类型有哪些?
- 什么是自动装箱和拆箱?
- 自动装箱(Autoboxing)
- 自动拆箱(Unboxing)
- 自动装箱和拆箱在哪些情况下发生?
- 自动装箱(Autoboxing)发生的情况:
- 自动拆箱(Unboxing)发生的情况:
- Java有哪些类型的转换?区别是什么?
- 自动类型转换(隐式类型转换)
- 强制类型转换(显式类型转换)
- 注意事项
- 参考
Java基本语法和基础数据类型
标识符和关键字有什么区别?
标识符
- 由开发者自定义的,用于标识特定的程序元素
- 它必须以字母(A-Z或a-z)或下划线(_)开头,后面可以跟字母、数字(0-9)或下划线
关键字
- 关键字是编程的语言预定义的,具有特殊意义的单词
- 它们用于表示语言的语法结构,不能用于标识符
Java关键字有哪些?
- 访问控制:private、protected、public
- 类,方法和变量修饰符:abstract、calss、estends、final、implents、interface、native、new、static、strictfp、synchronized、transient、volatile、enum
- 程序控制:break、continue、return、do、while、if、else、for、instanceof、switch、case、default、assert
- 错误处理:try、catch、throw、throws、finally
- 包相关:import、package
- 基本类型:boolean、byte、char、double、float、int、long、short
- 变量引用:super、this、void
- 保留字:goto、const
Java基本数据类型有哪些?
Java中的基本数据类型(也称为原始数据类型)包括以下8种:
-
整型:
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。在数值后加上L
或l
来表示。
-
浮点型:
float
:32位单精度浮点数,遵循IEEE 754标准。在数值后加上F
或f
来表示。double
:64位双精度浮点数,遵循IEEE 754标准,默认的浮点数类型。
-
字符型:
char
:16位Unicode字符,可以存储任何字符。
-
布尔型:
boolean
:只有两个可能的值:true
和false
。
什么是自动装箱和拆箱?
在Java中,自动装箱(Autoboxing)和拆箱(Unboxing)是两个与基本数据类型和它们的包装类(Wrapper Classes)之间转换相关的概念。
自动装箱(Autoboxing)
自动装箱是指将Java的基本数据类型自动转换成对应的包装类对象的过程。这种转换是自动进行的,不需要程序员显式地进行类型转换。例如,可以将一个int
类型的值直接赋值给一个Integer
对象,Java编译器会自动将int
装箱为Integer
对象。
Integer integerObject = 10; // 自动装箱,将int类型10转换为Integer对象
自动拆箱(Unboxing)
自动拆箱是指将包装类对象自动转换成对应的基本数据类型的过程。与自动装箱相反,自动拆箱将包装类对象还原为基本数据类型。这同样是由Java编译器自动完成的。
int intValue = integerObject; // 自动拆箱,将Integer对象转换为int类型的值
自动装箱和拆箱在哪些情况下发生?
自动装箱和拆箱在Java中主要在以下情况下发生:
自动装箱(Autoboxing)发生的情况:
-
赋值给包装类对象:
当基本数据类型的值被赋给对应的包装类对象时,会自动装箱。Integer i = 10; // int 装箱成 Integer
-
作为参数传递给接受包装类对象的函数:
当函数的参数是包装类类型时,传递基本数据类型会自动装箱。void takeInteger(Integer i) { // ... } takeInteger(20); // int 装箱成 Integer
-
集合类操作:
当将基本数据类型添加到需要对象的集合类(如List
、Set
、Map
等)时,会自动装箱。List<Integer> list = new ArrayList<>(); list.add(30); // int 装箱成 Integer
-
条件语句:
在某些条件语句中,如if
或while
,基本数据类型会被自动装箱以便与包装类对象进行比较。if (40 != null) { // int 装箱成 Integer,然后与null比较 }
自动拆箱(Unboxing)发生的情况:
-
赋值给基本数据类型的变量:
当包装类对象被赋值给基本数据类型的变量时,会自动拆箱。Integer i = 50; int j = i; // Integer 拆箱成 int
-
作为参数传递给接受基本数据类型的函数:
当函数的参数是基本数据类型时,传递包装类对象会自动拆箱。void takeInt(int i) { // ... } takeInt(60); // Integer 拆箱成 int
-
算术运算:
当包装类对象参与算术运算时,会自动拆箱成基本数据类型。Integer a = 70; Integer b = 80; int sum = a + b; // 两个Integer对象拆箱成int,然后相加
-
比较运算:
当包装类对象使用==
进行比较时,会自动拆箱成基本数据类型。Integer x = 90; Integer y = 90; boolean equal = x == y; // 两个Integer对象拆箱成int,然后比较
-
条件语句:
在if
或while
等条件语句中,包装类对象会自动拆箱以便与基本数据类型进行比较。while (100 < 200) { // Integer 拆箱成 int }
自动装箱和拆箱使得代码更加简洁,但也要注意它们可能带来的性能影响,特别是在循环和大量数据处理的情况下,因为频繁的装箱和拆箱可能会导致不必要的性能开销。
Java有哪些类型的转换?区别是什么?
Java中有两种主要的类型转换:自动类型转换(也称为隐式类型转换)和强制类型转换(也称为显式类型转换)。
自动类型转换(隐式类型转换)
自动类型转换发生在不同数据类型之间的赋值或参数传递时,当源数据类型的值可以无损失地转换为目标数据类型时,Java编译器会自动进行类型转换。这种转换通常发生在以下几种情况:
-
从小到大的转换:
- 从
byte
、short
、char
到int
,然后到long
,最后到float
和double
。 - 例如:
byte
到int
,int
到long
,float
到double
。
- 从
-
对象之间的转换:
- 从子类对象到父类对象的引用转换。
- 例如:
Dog dog = new Dog(); Animal animal = dog;
(其中Dog
是Animal
的子类)
强制类型转换(显式类型转换)
强制类型转换是程序员明确指定的类型转换,用于将一个类型的值转换为另一个类型的值。如果转换不兼容,编译器会报错。这种转换通常发生在以下几种情况:
-
从大到小的转换:
- 从
double
到float
,然后到long
,接着到int
,char
,short
,最后到byte
。 - 例如:
double
到int
,int
到byte
。
- 从
-
对象之间的转换:
- 从父类对象到子类对象的引用转换。
- 例如:
Animal animal = new Dog(); Dog dog = (Dog) animal;
(其中Dog
是Animal
的子类)
-
基本数据类型和字符串之间的转换:
- 基本数据类型到
String
,以及String
到基本数据类型的转换。 - 例如:
int i = 10; String str = String.valueOf(i);
或者String str = "123"; int i = Integer.parseInt(str);
- 基本数据类型到
注意事项
- 在进行数值类型的强制转换时,可能会发生数值溢出或精度损失。
- 在进行对象引用的强制转换时,如果转换不兼容,运行时会抛出
ClassCastException
。 - 字符串到基本数据类型的转换可能会抛出
NumberFormatException
,如果字符串的内容不能被解析为相应的数值类型。
类型转换是Java编程中的一个重要概念,正确地使用类型转换可以帮助程序员编写出更加灵活和高效的代码。
参考
部分参考Javaguide的关于面试的文档(准备面试的同学强烈推荐!)
链接:https://javaguide.cn/