目录
(4)参数作用域:在方法定义中作为参数传递的变量的作用域是整个方法
一、Java是什么
Java是Sun Microsystems公司(已被Oracle公司收购)的James Gosling领导的Green项目团队开发的一种编程语言。最初,这个项目被称为Oak,但是Oak已经被人注册了,最终在1995年正式更名为Java。
Java的设计理念是“一次编写,到处运行”(Write Once, Run Anywhere),意思是使用Java编写的程序只需编写一次,就可以在任何支持Java虚拟机(JVM)的设备上运行,无需针对每个平台进行单独的编译或修改。Java语言继承了C++的面向对象特性,并引入了垃圾回收、泛型编程等新功能,使其成为一种跨平台、安全、高效的编程语言。
二、Java三大版本
-
JavaSE ( Java Platform, Standard Edition ) :JavaSE是Java技术的核心和基础,提供了开发和运行Java应用程序的核心API,包括类库、Java虚拟机(JVM)等,主要用于开发桌面应用程序、控制台应用程序以及小型服务器应用程序。
-
JavaME ( Java Platform, Micro Edition ) :Java ME是Java平台的微型版,它的API是Java SE API的子集,主要用于移动设备和嵌入式设备的应用程序开发,如手机、PDA(个人数字助理)、电视机顶盒和打印机等设备。
-
JavaEE ( Java Platform, Enterprise Edition ) :Java EE是在Java SE的基础上构建的,提供了企业级应用开发的完整解决方案,包括Web服务、分布式系统、事务管理、安全性等功能,适用于开发大型分布式系统,如企业级Web应用、服务器端应用等,是构建复杂企业应用的重要技术基础。
三、JDK、JRE、JVM
-
JDK(Java Development Kit):JDK是Java开发工具包,包含了Java编程所需的全部工具和资源,如编译器(javac)、解释器(java)、打包工具(jar)等,这些工具使得开发者能够编写、编译、调试和运行Java程序。
-
JRE(Java Runtime Environment):JRE是Java运行时环境,包含了Java虚拟机(JVM)和Java核心类库。
-
JVM(Java Virtual Machine):JVM是Java虚拟机,负责将Java字节码转换为特定平台上的机器码并执行。它是Java跨平台性的关键所在,只要平台支持JVM,就可以运行Java程序。
四、注释
注释是程序员在代码中添加的说明性文字,用于解释代码的功能、目的和实现细节,从而提高代码的可读性和可维护性。注释不会被编译器编译成可执行的代码,因此不会影响程序的运行结果。
Java中的注释主要有三种类型:单行注释、多行注释和文档注释。
1. 单行注释
单行注释以双斜杠 //
开始,从 //
开始到该行结束的所有内容都被视为注释。单行注释通常用于简短的说明或解释紧跟其后的代码行。
public class HelloWorld {
public static void main(String[] args) {
// 这是一个单行注释
System.out.println("Hello World"); // 输出:Hello World
}
}
2. 多行注释
多行注释以 /*
开始,以 */
结束,中间的内容都被视为注释(注意多行注释不能嵌套使用)。多行注释可以跨越多行,用于较长的说明或解释代码块。
public class HelloWorld {
public static void main(String[] args) {
/*
这是一个多行注释
可以跨越多行
*/
System.out.println("Hello World"); // 输出:Hello World
}
}
3. 文档注释
文档注释以 /**
开始,以 */
结束,通常用于生成API文档。文档注释可以包含特定的标签,如 @param
、@return
、@throws
等,用于详细说明类、方法或字段的信息。
/**
* 计算两个整数的和
*
* @param x 第一个整数
* @param y 第二个整数
* @return 两个整数的和
*/
public int add(int x, int y) {
return x + y;
}
文档注释的主要作用是生成API文档,帮助其他开发者理解代码的用途和功能。通过使用 javadoc
工具,可以将文档注释转换为HTML格式的文档,方便查看和分发。
五、关键字和标识符
1. 关键字
Java关键字是Java语言预定义的、具有特殊含义的单词,用于表示控制流、数据类型、错误处理等。关键字在程序中具有固定的意义,不允许用户自定义其含义。
Java的关键字包括:
abstract, assert, boolean, break, byte, case, catch, char, class, const,
continue, default, do, double, else, enum, extends, final, finally, float,
for, goto, if, implements, import, instanceof, int, interface, long, native,
new, null, package, private, protected, public, return, short, static, strictfp,
super, switch, synchronized, this, throw, throws, transient, try, void, volatile,
while
需要注意的是,虽然 const
和 goto
是Java的关键字,但它们在Java中没有实际用途,属于保留关键字。
2. 标识符
Java标识符是用户自定义的用于标识变量、方法、类等的名称。
标识符必须遵循以下规则:
-
组成:标识符由字母(A-Z和a-z)、数字(0-9)、下划线(_)和美元符号($)组成。
-
首字符:标识符的第一个字符必须是字母(A-Z或a-z)、下划线(_)或美元符号($),不能是数字。
-
大小写敏感:Java严格区分大小写,例如,
Name
和name
是不同的标识符。 -
不能使用关键字:标识符不能是Java的关键字或保留字,如
class
、int
、if
等。 -
长度:标识符的长度没有限制,但为了提高代码的可读性,通常建议标识符的长度不超过31个字符。
六、数据类型
Java的数据类型可以分为两大类:基本数据类型和引用数据类型。
1. 基本数据类型(Primitive Types)
基本数据类型是Java中预定义的数据类型,它们直接存储在栈内存中,并且它们的值直接存储在变量中。
基本数据类型包括以下几种:
(1)整数类型(Integer Types)
-
byte
:8位,取值范围:-128 ~ 127 -
short
:16位,取值范围:-32768 ~ 32767 -
int
:32位,取值范围:-2^31 ~ 2^31-1 -
long
:64位,取值范围:-2^63 ~ 2^63-1,使用时需要在数字后面加L
或l
(例如:100L
)
(2)浮点类型(Floating-Point Types)
-
float
:32位,取值范围:大约从±1.4E-45
到±3.40282347E+38F
(这里的E
表示10的幂,F
表示这是一个float
类型的字面量),使用时需要在数字后面加F
或f
(例如:3.14F
) -
double
:64位,双精度浮点数,取值范围:大约从±4.9E-324
到±1.79769313486231570E+308
(这里的E
同样表示10的幂)
(3)字符类型(Character Type)
-
char
:16位,取值范围:0 ~ 65535,通常用来存储单个字符(例如:'a'
)
(4)布尔类型(Boolean Type)
-
boolean
:1位,取值范围:true
或false
,表示真或假
2. 引用数据类型(Reference Types)
引用数据类型是Java中通过引用来访问的数据类型,它们存储在堆内存中,并且变量存储的是对象的引用(即内存地址)。
引用数据类型包括以下几种:
-
类(Class Types):用户自定义的类,例如:
String
,ArrayList
-
接口(Interface Types):Java中的接口定义了一组方法的规范,但不提供具体实现,例如:
List
,Map
-
数组(Array Types):数组是对象,可以存储相同类型的多个元素,例如:
int[]
,String[]
,Object[]
-
枚举(Enum Types):枚举类型是一种特殊的类,用于表示一组固定的常量,例如:
Day
(包含MONDAY
,TUESDAY
等) -
空类型(Null Type):特殊类型,表示空值,即
null
,null
是任何引用类型的合法值,但不是基本数据类型的合法值
七、类型转换
Java中的类型转换是指将一个数据类型的值转换为另一个数据类型的过程。根据转换的方式,可以分为自动类型转换(隐式转换)和强制类型转换(显式转换)两种类型。(注意不能对布尔值进行转换)
1. 自动类型转换
自动类型转换是指较小的数据类型可以自动转换为较大的数据类型,无需显式声明。这种转换通常是安全的,因为较小的数据类型可以被较大类型安全地容纳。
自动类型转换遵循以下规则:
-
byte → short → int → long → float → double
-
char → int → long → float → double
public class Demo01 {
public static void main(String[] args) {
int a = 10;
float f = a; // 自动类型转换,int转换为float
System.out.println(f); // 输出 10.0
byte b = 9;
double d = b; // 自动类型转换,byte转换为double
System.out.println(d); // 输出 9.0
}
}
2. 强制类型转换
强制类型转换是指将较大的数据类型转换为较小的数据类型,需要显式地指定目标类型。这种转换可能导致数据丢失或溢出,因此需要谨慎使用。
public class Demo01 {
public static void main(String[] args) {
double x = 9.9;
int y = (int) x; // 强制类型转换,double转换为int,小数部分被截断
System.out.println(y); // 输出 9
long l = 10L;
int i = (int) l; // 强制类型转换,long转换为int
System.out.println(i); // 输出 10
}
}
八、变量、常量、作用域
1. 变量(Variable)
变量是程序中最基本的存储单元,包括变量名、变量类型和作用域。变量必须在使用前进行声明,声明格式为 数据类型 变量名=[值]
。
Java中的变量可以分为以下几类:
(1)局部变量
定义在方法内部或代码块内部。局部变量仅在方法内部有效,必须声明和初始化。
public class Demo {
public static void main(String[] args) {
int i = 100; // 定义一个局部变量
System.out.println(i); // 输出:100
}
}
(2)实例变量
定义在类中,方法外部。实例变量从属于对象,存在于类内但在方法外。实例变量未初始化时,默认为0或null。
public class Demo {
String name;
int age;
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println(demo.name); // 输出:null
System.out.println(demo.age); // 输出:0
}
}
(3)类变量(静态变量)
定义在类中,方法外部,使用 static
关键字修饰。类变量在整个类范围内有效,与类一起存在和消失。
public class Demo {
static int salary = 5000;
public static void main(String[] args) {
System.out.println(salary); //输出:5000
}
}
2. 常量(Constant)
常量是指在程序运行过程中其值不变的量,使用 final
关键字修饰,初始化后不能被改变。常量建议使用大写字母和下划线表示,以增强代码的可读性和维护性。常量的定义格式为 final 常量名 = 值
。
常量可以分为以下几种类型:
-
静态常量:使用
static final
修饰,可以直接在类的方法中引用,无需实例化对象。 -
成员常量:使用
final
修饰,需要实例化对象后才能调用。 -
局部常量:定义在方法内部或代码块内部,使用
final
修饰。
public class Demo {
static final double PI = 3.14159265358979323846;
public static void main(String[] args) {
System.out.println(PI); //输出:3.141592653589793
}
}
3. 作用域(Scope)
作用域指的是变量在程序中可以被访问的范围,Java中的作用域主要由花括号 {}
来界定,变量的作用域取决于它们的声明位置。Java采用静态作用域机制,变量的作用域在编译阶段确定,与程序执行流程无关,仅依赖于源代码中的声明位置。
(1)类作用域:在整个类范围内有效
public class ScopeExample {
public static int classVariable = 100;
}
(2)方法作用域:只在当前方法内部有效
public void methodScope() {
int methodVariable = 20;
}
(3)块级作用域:只在当前大括号 {}
内有效
public void methodScope() {
{
int blockVariable = 30;
}
}
(4)参数作用域:在方法定义中作为参数传递的变量的作用域是整个方法
public void exampleMethod(int param) {
// param 可以在整个方法中使用
}