2.1 Java类型系统
基本数据类型(Primitive Data Types)
- 整型(Integer Types):用于表示整数值,包括
byte
,short
,int
和long
。- 浮点型(Floating-Point Types):用于表示带小数部分的数值,包括
float
和double
。- 字符型(Character Type):用于表示单个字符,使用
char
类型。- 布尔型(Boolean Type):用于表示逻辑值,只有两个取值:
true
和false
。引用数据类型(Reference Data Types)
- 类(Class):由开发人员定义的数据类型,用于创建对象。
- 接口(Interface):描述类应该具有的方法而不提供实现,用于实现多态和组织代码结构。
- 数组(Array):用于存储相同类型的多个元素,例如
int[]
、String[]
等。- 枚举(Enumeration):一种特殊的数据类型,用于定义一组常量。
2.2 标识符、关键字和变量
Java标识符、关键字和变量是Java编程语言中的基础概念。以下是关于它们的详细解释:
标识符 (Identifiers)
- 标识符是用于识别变量、类、方法等的名称。
- 标识符必须以字母(a-z, A-Z)、美元符号($)或下划线(_)开始。
- 之后的字符可以是字母、数字、美元符号($)或下划线(_)。
- 标识符是大小写敏感的,因此
myVar
和myvar
是两个不同的标识符。- 标识符不能是Java的保留关键字。例如,不能使用
class
,public
,int
等作为标识符。关键字 (Keywords)
- 关键字是Java语言中具有特殊含义的保留字。它们不能被用作标识符。
- Java有50个关键字,如
class
,public
,static
,void
,int
,if
,else
,while
,for
等。- 关键字用于执行特定的操作或表示特定的编程概念。
变量 (Variables)
- 变量是存储数据值的地方。它们有名称(即标识符)和数据类型。
- 在Java中,变量的声明包括数据类型、变量名和(可选的)初始化值。例如:
int myNumber = 10;
- 变量可以在程序的多个地方访问和修改,直到它们超出作用域。
- 根据变量的作用域,它们可以分为局部变量、实例变量、类变量(静态变量)等。
一个简单的Java程序示例,展示了标识符、关键字和变量的使用:
public class HelloWorld { // 'public' 和 'class' 是关键字, 'HelloWorld' 是标识符 public static void main(String[] args) { // 'public', 'static', 'void' 和 'main' 是关键字 String greeting = "Hello, World!"; // 'String' 是关键字, 'greeting' 是标识符, "Hello, World!" 是字符串字面量 System.out.println(greeting); // 'System', 'out', 'println' 是关键字 } }
在这个示例中,
HelloWorld
是一个类名(标识符),public class
和public static void main
是关键字的使用,而greeting
是一个变量(标识符),其数据类型为String
(关键字)。
2.3 字面符和字符串
在Java中,字面符(Literals)和字符串(Strings)是两种不同类型的表示数据的方式。
字面符(Literals)
字面符是用来表示固定值的符号。Java支持以下几种类型的字面符:
整数字面符:用来表示整数值,如
123
,-456
,0xABC
(十六进制)等。浮点数字面符:用来表示浮点数值,如
3.14
,-2.71828
,1.618e-1
(科学记数法)等。字符字面符:用来表示单个字符,用单引号括起来,如
'a'
,'1'
,'\n'
(换行符)等。特殊字符可以使用转义序列表示,如'\t'
(制表符)或'\''
(单引号字符)。布尔字面符:只有两个,
true
和false
,用来表示逻辑值。字符串字面符:用来表示一串字符,用双引号括起来,如
"Hello, World!"
。字符串字面符实际上是字符串对象的简写形式。空字面符:对于引用类型(如对象、数组),可以使用
null
字面符来表示没有引用任何对象的状态。字符串(Strings)
字符串在Java中是不可变的(immutable)对象,它们由
String
类表示。字符串字面符(如"Hello, World!"
)实际上是String
类的一个实例。你可以通过以下几种方式创建字符串:
使用字符串字面符:
String s1 = "Hello";
使用
new
关键字和String
类的构造器:String s2 = new String("Hello");
使用
StringBuilder
或StringBuffer
类构建字符串:StringBuilder sb = new StringBuilder();
sb.append("Hello"); String s3 = sb.toString();
字符串在Java中有很多有用的方法和操作,比如连接(concatenation)、比较(comparison)、查找(search)、替换(replacement)等。
需要注意的是,字符串字面符创建的字符串和通过
new
关键字创建的字符串对象在内存中的表现是不同的。字符串字面符创建的字符串会被Java虚拟机(JVM)存储在字符串常量池中,以优化性能和内存使用。而通过new
关键字创建的字符串对象则会在堆内存中分配空间。示例:
String s1 = "Hello"; // 字符串字面符,可能存储在字符串常量池中
String s2 = new String("Hello"); // 通过构造器创建,一定在堆内存中分配空间 // 下面的比较将返回false,因为s1和s2虽然内容相同,但它们是不同的对象 System.out.println(s1 == s2); // false // 下面的比较将返回true,因为它们的内容相同 System.out.println(s1.equals(s2)); // true
2.5 数据类型的转换
在Java中,数据类型转换是一个常见的操作,它允许开发者将一个数据类型的值转换为另一个数据类型。Java提供了两种类型转换:自动类型转换(也称为隐式类型转换)和强制类型转换(也称为显式类型转换)。
自动类型转换(隐式类型转换)
自动类型转换发生在不同数据类型之间的转换是安全的,并且不会丢失信息时。例如,将一个较小的数据类型(如
byte
、short
、char
)转换为一个较大的数据类型(如int
、long
、float
、double
)时,Java会自动执行这种转换。byte b = 45;
int i = b; // 隐式转换,将byte类型的b转换为int类型
强制类型转换(显式类型转换)
强制类型转换发生在两种情况下:
- 将一个较大的数据类型转换为一个较小的数据类型,并且可能会丢失信息。
- 将一个非数值类型转换为数值类型,或者将一个数值类型转换为非数值类型。
在进行强制类型转换时,Java要求开发者明确指定转换的类型,并且开发者需要确保转换是安全的,因为强制类型转换可能会导致数据丢失或溢出.
double d = 123.456;
int i = (int) d; // 显式转换,将double类型的d转换为int类型,结果将是123 // 强制类型转换可能会导致数据丢失 float f = 123.456f; int truncated = (int) f; // 结果将是123,小数部分被截断 // 强制类型转换还可能导致溢出 byte b = 127; // byte的最大值是127 b = (byte) 255; // 这将导致溢出,b的值将变成-1
在进行强制类型转换时,建议使用类型转换运算符
()
来明确转换的目标类型,以避免编译器警告或错误。此外,还有一种特殊的类型转换是字符串与数值类型之间的转换。这通常涉及到使用
String
类的parseInt()
,parseLong()
,parseFloat()
,parseDouble()
等方法,以及Integer.toString()
,Double.toString()
等方法.int num = Integer.parseInt("123"); // 将字符串转换为int
String str = Integer.toString(123); // 将int转换为字符串
在进行数据类型转换时,开发者需要确保转换是合理和安全的,以避免数据丢失或程序错误。
2.6 运算符机优先级
在 Java 中,各种运算符具有不同的优先级,优先级高的运算符会在优先级低的运算符之前进行计算。这样的规则称为运算符优先级。以下是 Java 中常见运算符的优先级,按照优先级从高到低排列:
- 一元运算符(++, --, +, -, !):最高优先级
- 乘法和除法运算符(*,/,%):高于加法和减法运算符
- 加法和减法运算符(+,-)
- 移位运算符(<<,>>,>>>)
- 关系运算符(>,<,>=,<=,==,!=)
- 逻辑运算符(&&,||)
- 三元条件运算符(? :)
- 赋值运算符(=,+=,-=,*=,/=,%=)
- 逗号运算符(,):最低优先级
在实际编写代码时,可以使用括号来改变运算符的优先级,确保表达式按照预期顺序计算。