字面常量
在编程语言中,字面常量(Literal Constants)是直接在代码中出现的固定值,它们代表了自身的值,不依赖于任何计算。Java中的字面常量主要包括数值常量、字符常量、字符串常量、布尔常量等。
-
数值常量:直接表示数值的常量。它们可以是整数(如
123
)、浮点数(如123.45
)、长整型(在数值后加L
或l
,如123L
)、双精度类型(在数值后加D
或d
,如123.45D
),或者是十六进制(以0x
或0X
开头,如0xFF
)、八进制(以0
开头,如077
)和二进制(以0b
或0B
开头,如0b1010
)。 -
字符常量:用单引号括起来的单个字符,例如
'a'
、'1'
、'%'
。字符常量可以是一个普通的字符、一个转义字符(如\n
表示换行)或一个Unicode字符(如\u0061
表示'a'
)。 -
字符串常量:用双引号括起来的字符序列,例如
"Hello, World!"
。字符串常量可以包含任何字符,包括转义字符。 -
布尔常量:代表真和假的两个值,分别是
true
和false
。 -
空常量:特殊的字面常量
null
,表示没有任何对象的状态。
字面常量的使用使代码更易读和维护,因为它们直观地展示了操作的值。在编写程序时,合理地使用字面常量可以提高代码的清晰度和效率。例如,在定义一些不变的值时使用字面常量,可以避免魔法数字(代码中直接使用的、未经说明的数字)的出现,使代码意图更明确。
数据类型
数据类型 | 关键字 | 内存占用 | 范围 |
字节型 | byte | 1字节 | -128~127 |
短整型 | short | 2字节 | -32768~32767 |
整型 | int | 4字节 | -231~ 231 -1 |
长整型 | long | 8字节 | -263 ~ 263-1 |
单精度浮点数 | float | 4字节 | 有范围, 一般不关注 |
双精度浮点数 | double | 8字节 | 有范围, 一般不关注 |
字符型 | char | 2字节 | 0~65535 |
布尔型 | boolean | 没有明确规定 | true和false |
在Java中,每种基本数据类型都有一个对应的包装类,这些包装类将基本数据类型封装为对象。这种机制允许在需要使用对象的场合中使用基本数据类型。下面是Java基本数据类型及其对应包装类的简介:
-
byte:
- 基本类型:
byte
- 包装类:
Byte
- 描述:8位、有符号的二进制补码整数,取值范围从-128到127。
- 基本类型:
-
short:
- 基本类型:
short
- 包装类:
Short
- 描述:16位、有符号的二进制补码整数,取值范围从-32,768到32,767。
- 基本类型:
-
int:
- 基本类型:
int
- 包装类:
Integer
- 描述:32位、有符号的二进制补码整数,取值范围从-2^31到2^31-1。
- 基本类型:
-
long:
- 基本类型:
long
- 包装类:
Long
- 描述:64位、有符号的二进制补码整数,取值范围从-2^63到2^63-1。
- 基本类型:
-
float:
- 基本类型:
float
- 包装类:
Float
- 描述:单精度、32位IEEE 754浮点数。
- 基本类型:
-
double:
- 基本类型:
double
- 包装类:
Double
- 描述:双精度、64位IEEE 754浮点数。
- 基本类型:
-
char:
- 基本类型:
char
- 包装类:
Character
- 描述:单一的16位Unicode字符。
- 基本类型:
-
boolean:
- 基本类型:
boolean
- 包装类:
Boolean
- 描述:表示一位的信息,只有两个取值:
true
和false
。
- 基本类型:
变量
在编程中,变量是用来存储数据值的标识符。在Java中,每个变量都必须先声明其数据类型,然后才能使用。变量的命名必须遵循特定的规则和约定,如变量名可以包含字母、数字、美元符号($)和下划线(_),但不能以数字开头,也不能使用Java的保留关键字作为变量名。
Java中变量的类型主要分为两大类:
-
基本类型(Primitive Types):
- 包括
int
、double
、float
、boolean
、char
、byte
、short
和long
。 - 直接存储值,效率较高。
- 包括
-
引用类型(Reference Types):
- 包括类(Class)、接口(Interface)、数组(Array)等。
- 存储的是内存地址,即变量引用了对象的位置。
变量的声明和初始化
变量的声明指明了变量的类型和名称。例如:
int age;
变量的初始化是指为变量赋予一个初始值。初始化可以在声明变量时进行,也可以在变量声明后的任何时刻进行,但在变量使用前必须赋值。例如:
数据类型 变量名 = 初始值
int age = 30; // 声明同时初始化
age = 31; // 更新变量的值
在Java编程语言中,变量可以根据它们的数据类型分为多种类型。下面是各种类型变量的例子,以帮助理解它们的基本用法和区别:
基本类型变量
-
整型 (
int
):int age = 30;
用于存储整数。
-
浮点型 (
double
):double salary = 5000.75;
用于存储带有小数点的数字。
-
布尔型 (
boolean
):boolean isJavaFun = true;
用于存储真 (
true
) 或假 (false
)。 -
字符型 (
char
):char grade = 'A';
用于存储单个字符,如字母或符号。
引用类型变量
-
字符串 (
String
):String name = "John Doe";
用于存储文本。
-
数组 (
Array
):int[] numbers = {1, 2, 3, 4, 5};
用于存储多个值。
-
类 (
Class
) 实例:Person person = new Person();
Person
是一个用户定义的类,person
是这个类的一个实例。 -
列表 (
List
):List<String> fruits = new ArrayList<>(); fruits.add("Apple"); fruits.add("Banana");
用于存储元素的动态数组。
特殊类型变量
-
枚举 (
Enum
):enum Color { RED, GREEN, BLUE } Color favoriteColor = Color.BLUE;
用于定义一组常量。
-
接口 (
Interface
) 实现:List<String> names = new LinkedList<>();
List
是一个接口,而LinkedList
是实现List
接口的类。
通过上述例子,我们可以看到Java中不同类型的变量如何被声明和初始化。选择正确的数据类型对于确保程序的正确性和效率至关重要。每种类型的变量都有其特定的用途和操作集,了解并正确使用这些类型是掌握Java编程的基础。
类型转换
在Java中,类型转换主要分为两种:隐式类型转换(自动类型转换)和显式类型转换(强制类型转换)。
隐式类型转换
隐式类型转换是指在表达式中,较“小”的类型自动转换为较“大”的类型,以避免数据丢失。这里的“小”和“大”是指数据类型能够存储数据的范围。例如:
int i = 100;
long l = i; // int自动转换为long类型
double d = l; // long自动转换为double类型
在上述例子中,int
类型的i
自动转换为long
类型的l
,然后long
类型的l
自动转换为double
类型的d
,这些转换都是隐式的。
显式类型转换
显式类型转换,又称为强制类型转换,是指将一个数据类型强制转换为另一个数据类型。显式类型转换可能会导致精度丢失或数据溢出,因此需要程序员显式进行操作。例如:
double d = 100.04;
long l = (long)d; // double类型显式转换为long类型
int i = (int)l; // long类型显式转换为int类型
在这个例子中,double
类型的d
被强制转换为long
类型的l
,然后long
类型的l
被强制转换为int
类型的i
。由于double
到long
,以及long
到int
的转换可能导致精度丢失,因此需要使用强制类型转换。
注意事项
- 显式类型转换可能会导致数据丢失,因此在进行强制类型转换时应谨慎。
- 浮点数到整数的转换将丢失小数部分,仅保留整数部分。
- 在涉及不同类型的算术运算时,较小的类型会自动提升到较大的类型。
- 强制类型转换的语法是在要转换的变量前加上括号并指定目标类型。
理解和正确使用类型转换对于编写高效、准确的Java程序非常重要。在实际编程中,应根据具体情况选择合适的类型转换方式,以确保程序的正确性和高效性。
类型提升
在Java中,类型提升是指当表达式中涉及多种不同的基本数据类型时,数据类型会自动提升到能够表示所有可能值的最大类型,以确保数据精度不丢失。这个过程发生在编译期间,遵循一定的规则。
类型提升的规则
-
所有的
byte
、short
和char
类型将被提升到int
类型-
如果表达式中最大的数据类型是
int
,那么所有较小的数据类型都会被提升到int
。
-
-
如果表达式中存在
long
类型的数据,那么整个表达式的类型会被提升到long
。 -
如果表达式中包含
float
类型的数据,那么整个表达式的类型将被提升到float
。 -
如果表达式中包含
double
类型的数据,那么整个表达式的类型将被提升到double
。
示例
假设我们有以下几种类型的变量:
byte b = 10;
short s = 20;
char c = 'A';
int i = 30;
long l = 40L;
float f = 50.0F;
double d = 60.0D;
如果我们在一个表达式中同时使用这些变量,那么它们会根据上述规则进行类型提升。例如:
double result = b + s + c + i + l + f + d;
在这个表达式中,byte
、short
、char
、int
和long
类型的变量首先会被提升到float
类型(因为f
是float
类型),然后整个表达式再被提升到double
类型(因为d
是double
类型),以匹配最大的数据类型double
。因此,result
变量必须声明为double
类型以存储最终结果。
注意事项
- 类型提升主要关注数值类型的自动转换。
- 在设计程序时,要注意类型提升可能带来的影响,特别是在精确度非常重要的情况下。
- 类型提升保证了数据操作的安全性,避免了数据精度的丢失。
正确理解和利用类型提升机制,可以帮助避免数据类型相关的错误,保证程序的正确性和效率。
字符串类型
在Java中使用String类定义字符串类型,比如:
public static void main(String[] args) {
String s1 = "hello";
String s2 = " world";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1+s2); // s1+s2表示:将s1和s2进行拼接
}
int
转成 String
-
使用
String.valueOf(int)
方法:int num = 100; String str = String.valueOf(num);
-
使用
Integer.toString(int)
方法:int num = 100; String str = Integer.toString(num);
-
利用字符串连接的方式(虽然这种方式在性能上不是最优的):
int num = 100; String str = "" + num;
String
转成 int
-
使用
Integer.parseInt(String)
方法:String str = "100"; int num = Integer.parseInt(str);
这是最常用的方式。如果
str
不能被解析为int
,这个方法会抛出NumberFormatException
。 -
使用
Integer.valueOf(String)
方法:String str = "100"; int num = Integer.valueOf(str);
Integer.valueOf(String)
返回的是Integer
对象,但由于自动拆箱,可以直接赋值给int
变量。如果字符串不能被解析成一个整数,这个方法同样会抛出NumberFormatException
。
注意事项
- 在使用
parseInt
或valueOf
方法将String
转换成int
时,确保字符串是有效的整数形式,否则会抛出NumberFormatException
。 - 考虑到性能和可读性,推荐使用
String.valueOf(int)
和Integer.parseInt(String)
进行类型转换。
这些方法提供了灵活的方式来在int
和String
类型之间进行转换,是Java基本但非常重要的操作。