一、历史背景
Java 由 Sun Microsystems(现已被 Oracle 收购)的詹姆斯・高斯林(James Gosling)等人于 1991 年开始研发,最初这个语言被命名为 “Oak”,目标是用于开发消费电子产品软件。1995 年,Oak 更名为 Java,并正式发布。它的出现迎合了当时互联网兴起的浪潮,尤其是在网页交互小程序(Applet)等方面得到了广泛应用。
二.JDK的安装
Windows 系统安装 JDK
-
下载 JDK
- 首先,访问 Oracle 官方网站(Java SE | Oracle Technology Network | Oracle - downloads.html)。在该网站上,根据你的操作系统版本(32 位或 64 位)和需求选择合适的 JDK 版本进行下载。注意要选择稳定版本
-
运行安装程序
- 下载完成后,找到安装文件(一般是.exe 后缀的文件)并双击运行它。在安装向导中,你可以选择安装路径。默认路径通常是 “C:\Program Files\Java\jdk - [版本号]”,但你也可以根据自己的喜好修改安装路径。例如,你可以将其安装到 “D:\Java\jdk - 17”。
- 在安装过程中,安装程序会同时安装 JDK 和 JRE(Java Runtime Environment)。JDK 用于开发,包含了编译器等工具,JRE 用于运行 Java 程序。
-
配置环境变量
- 安装完成后,需要配置环境变量。右键点击 “我的电脑”(或 “此电脑”),选择 “属性”。在弹出的窗口中,点击 “高级系统设置”。
- 在 “系统属性” 对话框的 “高级” 选项卡下,点击 “环境变量” 按钮。在 “系统变量” 列表中,找到 “Path” 变量并点击 “编辑”。
- 在 “编辑环境变量” 对话框中,点击 “新建”,然后添加 JDK 的 bin 目录路径。例如,如果你的 JDK 安装在 “C:\Program Files\Java\jdk - 17”,则添加 “C:\Program Files\Java\jdk - 17\bin”。添加完成后,点击 “确定” 保存设置。
- 另外,还可以创建一个新的系统变量 “JAVA_HOME”,变量值为 JDK 的安装目录。例如,“C:\Program Files\Java\jdk - 17”。这在一些需要指定 Java 安装路径的软件(如某些 Java 开发工具)中会很有用。
在系统中新建,像图片这样,接着下滑,找到path
在path中像图中这样就可以了。
-
验证安装
- 打开命令提示符(可以通过在开始菜单中搜索 “cmd” 并打开)。在命令提示符中输入 “java -version”,如果安装成功,会显示 JDK 的版本信息。
像这样就ok了。
- 打开命令提示符(可以通过在开始菜单中搜索 “cmd” 并打开)。在命令提示符中输入 “java -version”,如果安装成功,会显示 JDK 的版本信息。
三、Hello World —— 你的第一个 Java 程序
编写 Java 程序的第一步通常是从一个简单的 “Hello World” 开始。这个程序将会在屏幕上输出 “Hello World”。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!"); // 打印输出 Hello World
}
}
代码解释:
public class HelloWorld: 定义了一个名为 HelloWorld 的类,类是 Java 中的基本构建模块。
public static void main(String[] args): 这是程序的入口点,main 方法是 Java 程序开始执行的地方。
System.out.println: 这是一个 Java 内置的打印方法,用来在控制台输出内容。
四、数据类型
-
基本数据类型
- 整数类型:
byte
:占 1 个字节,范围是 - 128 到 127。例如,byte b = 10;
。它通常用于节省内存空间的场景,如文件流中的字节数据处理。short
:占 2 个字节,范围是 - 32768 到 32767。可以用于存储一些较小的整数值,像小型计数器的值等。int
:占 4 个字节,范围是 - 2147483648 到 2147483647。这是最常用的整数类型,用于一般的整数运算和存储,如循环计数等。例如,int i = 100;
。long
:占 8 个字节,范围是 - 9223372036854775808 到 9223372036854775807。当需要处理较大的整数,如时间戳(以毫秒为单位)时会用到,定义时要在数字后面加L
或l
,如long l = 10000000000L;
。
- 浮点类型:
float
:占 4 个字节,它可以表示小数。精度相对较低,定义时要在数字后面加F
或f
,如float f = 3.14f;
。它适用于对精度要求不高的浮点数运算,如简单的物理模拟中的速度等。double
:占 8 个字节,精度比float
高。是默认的浮点数类型,用于大多数的浮点数计算场景,如数学计算中的三角函数值等。例如,double d = 3.1415926;
。
- 字符类型:
char
:占 2 个字节,用于存储单个字符。字符要用单引号括起来,如char c = 'A';
。它可以用来处理文本中的单个字符,如字符加密、字符统计等。
- 布尔类型:
boolean
:占 1 位,只有true
和false
两个值。用于条件判断和逻辑控制,如boolean flag = true;
,在循环条件和条件语句中经常用到。
- 整数类型:
可以通过Person p = new Person("John", 20);
来创建一个Person
类的对象。
五、变量和常量
- 变量
- 变量是程序运行过程中可以改变的值的存储单元。在 Java 中,变量需要先声明类型,再进行赋值。例如:
int num;
(声明一个int
类型的变量)num = 10;
(给变量赋值)
也可以在声明时同时赋值,如int anotherNum = 20;
。变量的作用域决定了变量在程序中的可见范围,例如在一个方法内部声明的变量只能在该方法内部访问。
- 变量是程序运行过程中可以改变的值的存储单元。在 Java 中,变量需要先声明类型,再进行赋值。例如:
- 常量
- 常量是在程序运行过程中不能改变的值。在 Java 中,可以使用
final
关键字来定义常量。例如,final double PI = 3.14159;
,一旦定义后,就不能再重新赋值。常量通常用于定义一些固定不变的值,如数学常数、配置参数等。
- 常量是在程序运行过程中不能改变的值。在 Java 中,可以使用
六、运算符
- 算术运算符
- 包括
+
(加法)、-
(减法)、*
(乘法)、/
(除法)、%
(取余)。例如:int a = 10; int b = 3;
int sum = a + b;
(sum
的值为 13)int div = a / b;
(div
的值为 3,因为整数除法会舍去小数部分)int mod = a % b;
(mod
的值为 1)
- 包括
- 关系运算符
- 有
==
(等于)、!=
(不等于)、>
(大于)、<
(小于)、>=
(大于等于)、<=
(小于等于)。关系运算符的结果是boolean
类型,用于条件判断。例如,boolean result = (a > b);
(result
的值为true
)。
- 有
- 逻辑运算符
- 包括
&&
(逻辑与)、||
(逻辑或)、!
(逻辑非)。例如,boolean andResult = (a > 5 && b < 5);
,&&
两边的表达式都为true
时,整个表达式才为true
;||
只要有一边为true
,整个表达式就为true
;!
用于取反,如boolean notResult =!(a == b);
。
- 包括
- 赋值运算符
- 基本的赋值运算符是
=
,还有复合赋值运算符,如+=
、-=
、*=
、/=
、%=
。例如,a += 5;
等价于a = a + 5;
。
- 基本的赋值运算符是
- 自增(
++
)和自减(--
)运算符基本概念- 自增运算符(
++
)用于将变量的值增加 1,自减运算符(--
)用于将变量的值减少 1。这两个运算符既可以放在变量的前面(前缀形式),也可以放在变量的后面(后缀形式)。前缀形式(++x
或--x
)- 当使用前缀形式时,先对变量进行自增或自减操作,然后再使用变量的值。例如:
int x = 5;
int y = ++x;
- 首先,
x
的值会变为 6(x = x+1
),然后将x
的值(此时为 6)赋给y
,所以y
的值为 6。后缀形式(x++
或x--
)- 当使用后缀形式时,先使用变量的值,然后再对变量进行自增或自减操作。例如:
int a = 5;
int b = a++;
- 首先,将
a
的值(此时为 5)赋给b
,然后a
的值变为 6(a = a + 1
),所以b
的值为 5。
- 当使用后缀形式时,先使用变量的值,然后再对变量进行自增或自减操作。例如:
- 当使用前缀形式时,先对变量进行自增或自减操作,然后再使用变量的值。例如:
- 自增运算符(
- 三元运算符(
? :
)基本概念- 三元运算符是一种简洁的条件表达式。它的语法格式为:
条件表达式? 表达式1 : 表达式2
。它的执行逻辑是:首先计算条件表达式的值,如果条件表达式的值为true
,则整个三元运算符的值为表达式 1 的值;如果条件表达式的值为false
,则整个三元运算符的值为表达式 2 的值。示例int num1 = 10;
int num2 = 20;
int max = (num1 > num2)? num1 : num2;
- 在这里,首先判断
num1 > num2
这个条件表达式,因为 10 不大于 20,所以条件表达式的值为false
,那么整个三元运算符的值为表达式 2 的值,即max
的值为 20。
- 三元运算符是一种简洁的条件表达式。它的语法格式为:
四、控制语句
- 条件语句
- if - else 语句:用于根据条件执行不同的代码块。例如:
收起
java
int score = 80;
if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
- switch - case 语句:用于多分支选择。例如:
收起
java
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
default:
System.out.println("其他");
}
- 循环语句
- for 循环:用于已知循环次数的情况。例如,计算 1 到 10 的和:
收起
java
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
System.out.println(sum);
- while 循环:用于在满足条件时不断循环。例如:
收起
java
int j = 1;
int product = 1;
while (j <= 5) {
product *= j;
j++;
}
System.out.println(product);
- do - while 循环:与
while
循环类似,但至少会执行一次循环体。例如:
收起
java
int k = 1;
do {
System.out.println(k);
k++;
} while (k <= 3);
五、方法
- 定义方法
- 方法是一段可重复调用的代码块,用于完成特定的功能。例如,定义一个计算两个整数之和的方法:
收起
java
public int add(int num1, int num2) {
return num1 + num2;
}
- 调用方法
- 可以在其他方法或类中调用定义好的方法。例如:
收起
java
public class Main {
public static void main(String[] args) {
int result = add(3, 5);
System.out.println(result);
}
}
- 方法可以有参数(用于传递数据)和返回值(用于返回计算结果),也可以没有返回值(返回类型为
void
)。
六、输入输出
- 输出
- 可以使用
System.out.println()
或System.out.print()
来输出信息。println()
会在输出内容后换行,print()
不会换行。例如:System.out.println("Hello World");
System.out.print("Hello"); System.out.println(" World");
- 可以使用
- 输入
- 可以使用
Scanner
类来实现输入。首先要导入java.util.Scanner
包,然后创建Scanner
对象,例如:
- 可以使用
收起
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数");
int num = scanner.nextInt();
System.out.println("你输入的整数是:" + num);
}
}
-
引用数据类型
- 类(Class):是一种自定义的数据类型,用于封装数据和行为。例如,定义一个简单的
Person
类:
- 类(Class):是一种自定义的数据类型,用于封装数据和行为。例如,定义一个简单的
收起
java
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
可以通过Person p = new Person("John", 20);
来创建一个Person
类的对象。
- 接口(Interface):定义了一组方法签名,用于规范实现类的行为。例如:
java
interface Animal {
void sound();
}
实现类必须实现接口中的方法,如:
java
class Dog implements Animal {
@Override
public void sound() {
System.out.println("汪汪");
}
}
- 一维数组
- 定义和声明
- 方式一:先声明数组类型,再使用
new
关键字创建数组对象并指定数组长度。例如,声明一个可以存储整数的一维数组,长度为 5:int[] array;
(声明一个int
类型的数组)array = new int[5];
(创建一个长度为 5 的int
数组)
- 方式二:在声明数组的时候直接初始化。例如:
int[] anotherArray = {1, 2, 3, 4, 5};
(声明并初始化一个包含 5 个整数的数组)
- 方式一:先声明数组类型,再使用
- 访问数组元素
- 数组的索引从 0 开始。可以通过索引来访问数组中的元素。例如,对于前面定义的
array
数组:array[0] = 10;
(将数组的第一个元素赋值为 10)int element = array[2];
(获取数组的第三个元素并赋值给element
,这里element
的值为数组初始化后的默认值 0,或者是之前赋值后的相应值)
- 数组的索引从 0 开始。可以通过索引来访问数组中的元素。例如,对于前面定义的
- 数组长度
- 可以使用
length
属性来获取数组的长度。例如:int length = array.length;
(获取array
数组的长度,这里length
的值为 5)
- 可以使用
- 应用场景
- 存储数据序列:例如,存储学生的成绩。假设要存储一个班级学生的数学成绩,可以使用一维数组。
double[] scores = new double[30];
(假设班级有 30 个学生)- 可以通过循环来输入每个学生的成绩:
Scanner scanner = new Scanner(System.in);
for(int i = 0; i < scores.length; i++){
System.out.println("请输入第 " + (i + 1) + " 个学生的成绩");
scores[i] = scanner.nextDouble();
}
- 函数参数传递:在方法中传递数组作为参数。例如,定义一个方法来计算数组元素的平均值:
public static double calculateAverage(int[] arr) {
int sum = 0;
for(int element : arr) {
sum += element;
}
return (double)sum / arr.length;
}
- 存储数据序列:例如,存储学生的成绩。假设要存储一个班级学生的数学成绩,可以使用一维数组。
- 定义和声明
- 二维数组
- 定义和声明
- 方式一:先声明二维数组类型,再创建数组对象并指定行数。例如,声明一个二维
int
数组,有 3 行:int[][] twoDArray;
(声明一个二维int
数组)twoDArray = new int[3][];
(创建一个有 3 行的二维数组,此时列数尚未确定)- 然后可以分别为每行创建数组(即确定列数)。例如,让第一行有 2 个元素,第二行有 3 个元素,第三行有 4 个元素:
twoDArray[0] = new int[2];
twoDArray[1] = new int[3];
twoDArray[2] = new int[4];
- 方式二:在声明的时候直接初始化。例如:
int[][] anotherTwoDArray = { {1, 2}, {3, 4, 5}, {6, 7, 8, 9} };
(声明并初始化一个二维数组)
- 方式一:先声明二维数组类型,再创建数组对象并指定行数。例如,声明一个二维
- 访问数组元素
- 二维数组可以看作是一个 “数组的数组”。通过两个索引来访问元素,第一个索引表示行,第二个索引表示列。例如,对于前面定义的
anotherTwoDArray
:int element = anotherTwoDArray[1][2];
(获取第二行第三列的元素,这里element
的值为 5)
- 二维数组可以看作是一个 “数组的数组”。通过两个索引来访问元素,第一个索引表示行,第二个索引表示列。例如,对于前面定义的
- 数组长度
- 对于二维数组,可以分别获取行数和每行的列数。行数可以通过
length
属性获取,每行的列数也可以通过该行对应的一维数组的length
属性获取。例如:int rowCount = anotherTwoDArray.length;
(获取anotherTwoDArray
的行数,这里rowCount
的值为 3)int columnCountInRow0 = anotherTwoDArray[0].length;
(获取第一行的列数,这里columnCountInRow0
的值为 2)
- 对于二维数组,可以分别获取行数和每行的列数。行数可以通过
- 应用场景
- 矩阵运算:在数学中,矩阵是二维数组的典型应用。例如,实现两个矩阵的加法。
int[][] matrix1 = { {1, 2}, {3, 4} };
int[][] matrix2 = { {5, 6}, {7, 8} };
int[][] resultMatrix = new int[matrix1.length][matrix1[0].length];
for(int i = 0; i < matrix1.length; i++) {
for(int j = 0; j < matrix1[i].length; j++) {
resultMatrix[i][j] = matrix1[i][j] + matrix2[i][j];
}
}
- 二维表格数据存储:例如,存储学生的成绩表,行表示学生,列表示不同科目的成绩。
String[] students = {"张三", "李四", "王五"};
String[] subjects = {"语文", "数学", "英语"};
double[][] scoresTable = new double[students.length][subjects.length];
- 可以通过循环来输入每个学生每门科目的成绩:
Scanner scanner = new Scanner(System.in);
for(int i = 0; i < scoresTable.length; i++) {
for(int j = 0; j < scoresTable[i].length; j++) {
System.out.println("请输入 " + students[i] + " 的 " + subjects[j] + " 成绩");
scoresTable[i][j] = scanner.nextDouble();
}
}
- 矩阵运算:在数学中,矩阵是二维数组的典型应用。例如,实现两个矩阵的加法。
- 定义和声明
这只是 Java 基础语法的一个概述,在实际学习和应用中,还需要不断地练习和深入理解。