解锁Java:从0到1的编程蜕变之路

为什么选择 Java

在编程语言的璀璨星空中,Java 无疑是一颗耀眼的巨星。自 1995 年诞生以来,它凭借着卓越的特性和强大的功能,在全球范围内拥有庞大的开发者群体,市场占有率长期稳居前列。无论是在企业级应用开发、移动应用开发,还是大数据处理、分布式系统构建等领域,Java 都发挥着举足轻重的作用 。

从就业市场来看,Java 开发工程师的需求量一直居高不下。各大招聘平台上,Java 相关岗位如过江之鲫,涵盖互联网、金融、电商、医疗等众多热门行业。掌握 Java 技术,就意味着打开了通往高薪职业的大门,为个人职业发展提供了广阔的空间。

开启 Java 之旅:环境搭建

(一)安装 JDK

JDK(Java Development Kit)是 Java 开发的核心工具包,如同建筑工人手中的各类工具,是 Java 开发不可或缺的基础。它包含了 Java 编译器(javac)、Java 运行工具(java)、Java 文档生成工具(javadoc)等一系列开发工具,以及 Java 运行时环境(JRE)和 Java 虚拟机(JVM) 。

首先,我们需要从 Oracle 官网(https://www.oracle.com/java/technologies/downloads/ )或 OpenJDK 社区(https://jdk.java.net/ )下载适合自己操作系统的 JDK 安装包。

Windows 系统:在官网下载页面找到 Windows 版本的 JDK 安装文件(通常为.exe 后缀),下载完成后,双击安装文件,按照安装向导的提示逐步进行安装。在安装过程中,可以选择安装路径,建议选择全英文路径,避免因路径中包含中文或特殊字符导致后续问题。安装完成后,需要配置环境变量。右键点击 “此电脑”,选择 “属性”,在弹出的窗口中点击 “高级系统设置”,再点击 “环境变量”。在系统变量中,新建一个变量名为 “JAVA_HOME”,变量值为 JDK 的安装路径(例如:C:\Program Files\Java\jdk11.0.11);然后找到 “Path” 变量,点击 “编辑”,在变量值的开头或结尾添加 “% JAVA_HOME%\bin”,保存设置。最后,打开命令提示符(Win + R,输入 “cmd” 回车),输入 “java -version”,如果显示 JDK 的版本信息,说明安装和配置成功。

macOS/Linux 系统:在官网下载对应系统的 JDK 安装包(macOS 通常为.dmg 后缀,Linux 通常为.tar.gz 后缀)。对于 macOS,下载完成后,双击.dmg 文件,将 JDK 图标拖动到 “应用程序” 文件夹进行安装。对于 Linux,使用命令行解压下载的.tar.gz 文件(例如:tar -zxvf jdk-11.0.11_linux-x64_bin.tar.gz),然后将解压后的文件夹移动到合适的位置(如 /usr/local/jdk11)。接着配置环境变量,对于 macOS,编辑~/.bash_profile 或~/.zshrc 文件(根据使用的终端类型),添加 “export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home” 和 “export PATH=JAVA_HOME/bin:PATH”;对于 Linux,编辑 /etc/profile 或~/.bashrc 文件,添加 “export JAVA_HOME=/usr/local/jdk11” 和 “export PATH=JAVA_HOME/bin:PATH”。保存文件后,执行 “source ~/.bash_profile”(macOS)或 “source /etc/profile”(Linux)使设置生效。同样,在终端输入 “java -version” 验证安装是否成功。

(二)安装 IDE

安装好 JDK 后,我们还需要一个趁手的集成开发环境(IDE)来编写和管理 Java 代码。IntelliJ IDEA 是一款功能强大、深受 Java 开发者喜爱的 IDE,它提供了智能代码补全、代码分析、调试工具等丰富的功能,能大大提高开发效率。

我们可以从 JetBrains 官网(https://www.jetbrains.com/idea/download/ )下载 IntelliJ IDEA。官网提供了 Ultimate(旗舰版)和 Community(社区版)两个版本,旗舰版功能全面,但需要付费购买;社区版免费开源,适合初学者和个人开发者使用,这里我们以社区版为例进行安装介绍。

下载完成后,运行安装程序。在安装向导中,首先选择安装路径,同样建议选择全英文路径。接着可以根据个人需求选择一些附加选项,如创建桌面快捷方式、关联.java 文件等。完成设置后,点击 “Install” 开始安装。安装完成后,打开 IntelliJ IDEA。第一次启动时,会提示进行一些初始设置,如选择主题、导入设置等,可以根据个人喜好进行选择。

接下来创建一个新项目,点击 “Create New Project”,在弹出的窗口中,左侧选择 “Java”,右侧选择项目使用的 JDK 版本(如果没有显示已安装的 JDK,点击 “New” 手动指定 JDK 的安装路径),然后点击 “Next”。在下一步中,输入项目名称和项目存储路径,最后点击 “Finish”,一个全新的 Java 项目就创建好了,我们可以在这个项目中开始编写 Java 代码啦。

初窥门径:第一个 Java 程序

环境搭建完成后,就像是准备好了绘画工具,现在我们可以开始绘制 Java 编程世界的第一笔 —— 编写并运行第一个 Java 程序 。按照惯例,我们从经典的 “Hello, World!” 程序入手。

(一)创建 Java 类文件

在 IntelliJ IDEA 的项目导航栏中,右键点击项目的 “src” 文件夹(src 是 source 的缩写,通常用于存放源代码),在弹出的菜单中选择 “New” -> “Java Class”(也可以使用快捷键 Alt + Insert,然后选择 “Java Class”) 。在弹出的对话框中,输入类名,这里我们输入 “HelloWorld”,然后点击 “OK”。需要注意的是,Java 中类名的命名规则遵循驼峰命名法,即首字母大写,后续单词首字母也大写,并且类名需与文件名一致,这是 Java 的规范要求,因为在 Java 中,每个编译单元(即一个 Java 文件)只能有一个 public 类,且该类的名称必须与文件名称相同(不包括文件后缀.java) 。

(二)定义主方法

在刚刚创建的 “HelloWorld” 类中,输入以下代码定义主方法:

public class HelloWorld {

    public static void main(String[] args) {

        // 这里开始编写主方法的代码

    }

}

主方法(main 方法)是 Java 程序的入口点,当我们运行一个 Java 程序时,JVM(Java 虚拟机)会首先寻找并执行这个 main 方法 。它的方法签名(即方法的定义形式)是固定的,必须是 “public static void main (String [] args)” 。其中,“public” 表示这个方法是公共的,任何其他类都可以访问它;“static” 表示这是一个静态方法,属于类本身,而不是类的实例,这样 JVM 在启动程序时无需创建类的实例就可以直接调用该方法;“void” 表示该方法没有返回值;“main” 是方法名,这是 JVM 识别程序入口的特定名称;“String [] args” 是一个字符串数组参数,用于接收命令行传入的参数,在我们这个简单的示例中暂时用不到,但在实际开发中,通过这个参数可以实现程序在启动时接收外部输入的功能 。

(三)编写输出语句并运行

在主方法中,编写如下代码用于输出 “Hello, World!”:

public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hello, World!");

    }

}

“System.out.println ()” 是 Java 中用于在控制台输出信息的常用方法,“System.out” 代表标准输出流,“println” 是 “print line” 的缩写,意思是输出内容后换行。如果使用 “System.out.print ()” 方法,则输出内容后不会换行 。

现在,我们已经完成了第一个 Java 程序的编写,接下来可以运行它来见证奇迹的时刻。在 IntelliJ IDEA 中,有多种运行程序的方式:可以点击工具栏上的绿色三角形 “Run” 按钮;也可以使用快捷键 Ctrl + Shift + F10(Windows/Linux 系统)或 Cmd + Shift + R(Mac 系统) ;还可以在代码编辑区域右键点击,选择 “Run 'HelloWorld.main ()'” 。运行程序后,在 IDEA 下方的控制台窗口中,将会看到输出的 “Hello, World!”,这是 Java 程序与我们的第一次友好互动,标志着我们成功迈出了 Java 编程的第一步 。

夯实基础:Java 基础语法

万丈高楼平地起,扎实的基础是成为 Java 编程高手的关键。接下来,我们深入学习 Java 的基础语法,就像学习一门语言的字母和语法规则一样,这是我们构建复杂程序的基石 。

(一)数据类型与变量

基本数据类型:Java 的基本数据类型如同建筑中的基础材料,各自有着独特的用途和特点。

byte:字节型,占用 1 个字节(8 位),取值范围为 - 128 到 127 ,常用于存储小范围的整数,例如表示文件流中的字节数据 ,示例代码:byte b = 10;

short:短整型,占用 2 个字节(16 位),取值范围为 - 32768 到 32767 ,适用于内存空间有限且数值范围合适的场景 ,示例代码:short s = 1000;

int:整型,占用 4 个字节(32 位),取值范围为 - 2147483648 到 2147483647 ,是最常用的整数类型,用于一般的整数运算和存储 ,示例代码:int num = 520;

long:长整型,占用 8 个字节(64 位),取值范围为 - 9223372036854775808 到 9223372036854775807 ,用于存储较大范围的整数,在表示时间戳等场景中常用 ,示例代码:long l = 1234567890123L; (注意 long 类型的常量需要在数字后面加上大写或小写的 L 后缀)

float:单精度浮点型,占用 4 个字节(32 位),取值范围为负数范围:-3.402823E38 到 - 1.401298E-45,正数范围:1.401298E-45 到 3.402823E38 ,有效小数点位数为 6 - 7 位,用于存储精度要求不高的浮点数 ,示例代码:float f = 3.14f; (注意 float 类型的常量需要在数字后面加上小写的 f 后缀)

double:双精度浮点型,占用 8 个字节(64 位),取值范围为负数范围:-1.79769313486232E308 到 - 4.94065645841247E-324,正数范围:4.94065645841247E-324 到 1.79769313486232E308 ,是最常用的浮点数类型,用于需要更高精度的浮点运算 ,示例代码:double d = 3.141592653589793;

boolean:布尔型,占用 1 个字节(虽然实际存储时可能不占完整的一个字节,但逻辑上可以这样理解),取值只有 true(真)和 false(假) ,用于判断条件 ,示例代码:boolean flag = true;

char:字符型,占用 2 个字节(16 位),取值范围为 0 到 65535 ,采用 Unicode 编码,可以表示世界上大多数语言的字符 ,示例代码:char c = 'A';

引用数据类型:如果说基本数据类型是简单的零件,那么引用数据类型就是由这些零件组装而成的复杂组件 。引用数据类型包括类、接口和数组等 。类是对现实世界中事物的抽象,例如我们可以定义一个 “Person” 类来表示人,其中包含姓名、年龄等属性和说话、走路等方法;接口则定义了一组方法的签名,但没有实现,类可以实现接口来表明它具有某些特定的行为;数组是用于存储多个相同类型元素的容器 。引用数据类型的变量存储的是对象的引用(内存地址),而不是对象本身,就像我们通过门牌号来找到房子,门牌号就是引用,房子就是对象 。 后续我们会深入学习类、接口和数组的详细用法 。

变量声明与初始化:变量是程序中用于存储数据的容器,就像一个个小盒子,可以存放不同类型的数据 。在 Java 中,声明变量时需要指定变量的类型,然后可以对其进行初始化 。例如:

int age; // 声明一个int类型的变量age

age = 18; // 对变量age进行初始化

double salary = 5000.5; // 声明并初始化一个double类型的变量salary

boolean isStudent = true; // 声明并初始化一个boolean类型的变量isStudent

char gender = 'M'; // 声明并初始化一个char类型的变量gender

变量命名需要遵循一定的规范,就像给孩子取名要遵循一定的习俗一样 。变量名必须以字母、下划线(_)、美元符号($)开头,后续字符可以是字母、数字、下划线或美元符号 ;不能使用 Java 中的关键字(如 int、class 等)作为变量名;变量名区分大小写 ;并且为了提高代码的可读性,变量名应尽量具有描述性,见名知意 ,例如用 “studentName” 表示学生姓名,而不是用无意义的 “a”“b” 等 。

(二)运算符与表达式

运算符分类:运算符是对数据进行操作的符号,就像数学中的加、减、乘、除符号一样 。Java 中的运算符种类丰富,主要包括以下几类:

算术运算符:用于执行基本的数学运算,如加法(+)、减法(-)、乘法(*)、除法(/)、取模(%,即求余数) ,示例代码:

int a = 10;

int b = 3;

int sum = a + b; // 加法,结果为13

int diff = a - b; // 减法,结果为7

int product = a * b; // 乘法,结果为30

double quotient = a / (double)b; // 除法,因为a和b都是int类型,直接相除结果会是整数,这里将b转换为double类型,结果为3.333333

int remainder = a % b; // 取模,结果为1

关系运算符:用于比较两个值的大小关系,返回一个布尔值(true 或 false) ,包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=) ,示例代码:

int x = 5;

int y = 8;

boolean isEqual = x == y; // 判断x是否等于y,结果为false

boolean isNotEqual = x != y; // 判断x是否不等于y,结果为true

boolean isLessThan = x < y; // 判断x是否小于y,结果为true

boolean isGreaterThan = x > y; // 判断x是否大于y,结果为false

boolean isLessOrEqual = x <= y; // 判断x是否小于等于y,结果为true

boolean isGreaterOrEqual = x >= y; // 判断x是否大于等于y,结果为false

逻辑运算符:用于组合多个条件表达式,返回布尔值,包括逻辑与(&&)、逻辑或(||)、逻辑非(!) ,示例代码:

boolean condition1 = true;

boolean condition2 = false;

boolean resultAnd = condition1 && condition2; // 逻辑与,两个条件都为true时结果才为true,这里结果为false

boolean resultOr = condition1 || condition2; // 逻辑或,只要有一个条件为true结果就为true,这里结果为true

boolean resultNot =!condition1; // 逻辑非,对条件取反,这里结果为false

赋值运算符:用于将一个值赋给一个变量,最基本的赋值运算符是 “=” ,还有一些扩展赋值运算符,如加法赋值(+=)、减法赋值(-=)、乘法赋值(*=)、除法赋值(/=)、取模赋值(%=) ,示例代码:

int num = 10;

num += 5; // 等价于num = num + 5,结果num为15

num -= 3; // 等价于num = num - 3,结果num为12

num *= 2; // 等价于num = num * 2,结果num为24

num /= 4; // 等价于num = num / 4,结果num为6

num %= 3; // 等价于num = num % 3,结果num为0

表达式求值:表达式是由变量、常量、运算符等组成的组合,它会计算出一个值 。例如 “3 + 5 * 2” 就是一个表达式,在计算表达式时,需要遵循一定的运算规则 。首先,运算符有优先级之分,就像数学运算中先乘除后加减一样,Java 中运算符的优先级从高到低大致为:括号(())、算术运算符(先乘除取模,后加减)、关系运算符、逻辑运算符、赋值运算符 。当表达式中运算符优先级相同时,按照从左到右的顺序进行计算 。例如,对于表达式 “(3 + 5) * 2”,先计算括号内的 “3 + 5” 得到 8,再乘以 2,最终结果为 16 ;对于表达式 “3 + 5 * 2”,先计算乘法 “5 * 2” 得到 10,再加上 3,结果为 13 。

(三)控制流程语句

条件语句:条件语句就像岔路口的指示牌,根据不同的条件决定程序的执行路径 。Java 中的条件语句主要有 if - else 语句和 switch 语句 。

if - else 语句:语法结构如下:

if (条件表达式) {

    // 条件为true时执行的代码块

} else if (另一个条件表达式) {

    // 该条件为true时执行的代码块

} else {

    // 以上条件都不满足时执行的代码块

}

例如,根据年龄判断是否成年:

int age = 20;

if (age < 18) {

    System.out.println("未成年");

} else if (age == 18) {

    System.out.println("刚成年");

} else {

    System.out.println("成年");

}

当有多个条件需要判断时,if - else 语句非常灵活,但如果条件分支过多,代码可能会变得冗长,可读性下降 。

switch 语句:语法结构如下:

switch (表达式) {

    case 值1:

        // 当表达式结果为值1时执行的代码

        break;

    case 值2:

        // 当表达式结果为值2时执行的代码

        break;

    default:

        // 当以上都不匹配时执行的代码

}

例如,根据数字输出对应的星期几:

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("其他日子");

}

switch 语句适用于处理固定值的判断,结构清晰,可读性高,效率通常也高于 if - else 语句 ,但它只能对整数、字符、枚举等固定类型进行比较 。

2. 循环语句:循环语句就像一个自动重复工作的机器人,可以让一段代码重复执行多次 。Java 中的循环语句有 for 循环、while 循环和 do - while 循环 。

for 循环:语法结构如下:

for (初始化; 条件; 更新) {

    // 循环体代码

}

例如,打印 1 到 5 的数字:

for (int i = 1; i <= 5; i++) {

    System.out.println(i);

}

for 循环常用于明确知道循环次数的场景,它的初始化部分在循环开始前执行一次,用于初始化循环变量;条件部分在每次循环开始时判断,若为 true 则执行循环体,否则结束循环;更新部分在每次循环结束后执行,用于更新循环变量 。

while 循环:语法结构如下:

while (条件表达式) {

    // 条件为true时执行的代码

}

例如,计算 1 到 100 的累加和:

int sum = 0;

int i = 1;

while (i <= 100) {

    sum += i;

    i++;

}

System.out.println("Sum: " + sum);

while 循环在每次迭代前先检查条件,如果条件为 true,则执行循环体,否则结束循环 ,适合循环条件不固定,可能由用户输入或动态计算决定的场景 。

do - while 循环:语法结构如下:

do {

    // 代码块

} while (条件表达式);

例如,读取用户输入,直到输入为 “exit” 为止:

import java.util.Scanner;

public class DoWhileExample {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        String input;

        do {

            System.out.println("输入一些文字(输入exit退出):");

            input = scanner.nextLine();

            System.out.println("你输入了: " + input);

        } while (!input.equals("exit"));

        System.out.println("程序结束");

        scanner.close();

    }

}

do - while 循环先执行循环体,然后再判断条件,这意味着即使条件最开始是 false,循环体也会至少执行一次 ,适合循环体代码至少要执行一次的场景 。

此外,在循环中还可以使用 break 和 continue 语句来控制循环的执行 。break 语句用于立即终止当前循环,跳出循环体;continue 语句用于跳过本次循环中 continue 后面的代码,直接开始下一次循环 。例如,在一个打印 1 到 10 的循环中,如果遇到数字 5,使用 break 语句可以提前结束循环:

for (int i = 1; i <= 10; i++) {

    if (i == 5) {

        break;

    }

    System.out.println(i);

}

如果使用 continue 语句,则会跳过数字 5 的打印,继续打印后面的数字:

for (int i = 1; i <= 10; i++) {

    if (i == 5) {

        continue;

    }

    System.out.println(i);

}

进阶之路:数组与字符串操作

掌握了基础语法后,我们迎来了 Java 编程的重要进阶内容 —— 数组与字符串操作 。数组和字符串是 Java 中非常常用的数据结构,熟练运用它们,能让我们更好地处理各种复杂的数据和逻辑 。

(一)数组

数组定义与初始化:数组是一种用于存储多个相同类型元素的有序集合,就像一排整齐排列的小盒子,每个盒子里装着相同类型的数据 。在 Java 中,数组有一维数组和多维数组之分 。

一维数组:定义方式有多种,例如:

// 声明一个int类型的一维数组,未初始化

int[] numbers;

// 声明并动态初始化一个长度为5的int类型数组,此时数组元素有默认值(int类型默认值为0)

numbers = new int[5];

// 声明并静态初始化一个int类型数组,同时指定数组元素的值

int[] ages = {18, 20, 22, 25, 30};

多维数组:以二维数组为例,它可以看作是数组的数组,即每个元素又是一个数组 。定义方式如下:

// 声明一个二维数组,未初始化

int[][] matrix;

// 声明并动态初始化一个3行4列的二维数组,元素有默认值

matrix = new int[3][4];

// 声明并静态初始化一个二维数组

int[][] scores = {

    {85, 90, 92},

    {78, 88, 85},

    {95, 98, 100}

};

数组元素访问与遍历:数组中的元素可以通过索引(下标)来访问,索引从 0 开始,到数组长度减 1 结束 。例如,对于上面定义的ages数组,ages[0]表示第一个元素 18,ages[2]表示第三个元素 22 。

遍历数组是获取数组中每个元素的常用操作 。我们可以使用普通的 for 循环来遍历数组:

int[] numbers = {1, 2, 3, 4, 5};

for (int i = 0; i < numbers.length; i++) {

    System.out.println(numbers[i]);

}

也可以使用 Java 5.0 引入的增强 for 循环(foreach 循环)来遍历数组,它的语法更加简洁,尤其适用于不需要获取元素索引的情况:

int[] numbers = {1, 2, 3, 4, 5};

for (int num : numbers) {

    System.out.println(num);

}

对于二维数组,同样可以使用嵌套的 for 循环进行遍历:

int[][] matrix = {

    {1, 2, 3},

    {4, 5, 6},

    {7, 8, 9}

};

for (int i = 0; i < matrix.length; i++) {

    for (int j = 0; j < matrix[i].length; j++) {

        System.out.print(matrix[i][j] + " ");

    }

    System.out.println();

}

增强 for 循环在遍历二维数组时也很方便:

int[][] matrix = {

    {1, 2, 3},

    {4, 5, 6},

    {7, 8, 9}

};

for (int[] row : matrix) {

    for (int num : row) {

        System.out.print(num + " ");

    }

    System.out.println();

}

(二)字符串

字符串创建与常用方法:字符串是由字符组成的序列,在 Java 中,字符串是一种非常重要的数据类型,通过java.lang.String类来表示 。创建字符串的方式主要有两种:

使用字面量:这是最常用的方式,直接使用双引号括起来的字符序列就是一个字符串字面量,例如:

String str1 = "Hello, Java";

这种方式创建的字符串会存储在字符串常量池中,如果常量池中已有相同内容的字符串,则不会创建新对象,而是直接引用已有对象,这样可以节省内存空间 。

使用构造函数:通过new关键字调用String类的构造函数来创建字符串对象,例如:

String str2 = new String("Hello, Java");

使用这种方式创建的字符串对象在堆内存中,即使字符串常量池中已有相同内容的字符串,也会创建一个新的对象 。

String类提供了丰富的方法来操作字符串,以下是一些常用方法的示例:

String str = "Hello, World!";

// 获取字符串长度

int length = str.length();

// 将字符串转换为大写

String upperCaseStr = str.toUpperCase();

// 将字符串中的指定字符替换为新字符

String replacedStr = str.replace('o', '0');

// 截取字符串的一部分

String subStr = str.substring(7, 12);

字符串比较:在比较字符串时,需要特别注意不能直接使用 “==” 运算符 。“==” 运算符比较的是两个字符串对象的内存地址,而不是字符串的内容 。例如:

String str1 = "Hello";

String str2 = "Hello";

String str3 = new String("Hello");

System.out.println(str1 == str2); // true,因为str1和str2指向字符串常量池中的同一个对象

System.out.println(str1 == str3); // false,因为str3是在堆内存中创建的新对象,与str1内存地址不同

要比较字符串的内容是否相等,应该使用equals()方法:

String str1 = "Hello";

String str2 = "Hello";

String str3 = new String("Hello");

System.out.println(str1.equals(str2)); // true,内容相同

System.out.println(str1.equals(str3)); // true,内容相同

如果需要忽略大小写进行比较,可以使用equalsIgnoreCase()方法:

String str1 = "Hello";

String str2 = "HELLO";

System.out.println(str1.equalsIgnoreCase(str2)); // true

实战演练:小型项目实践

学习编程,理论是基础,实践才是关键。接下来,我们通过两个小型项目 —— 简易计算器和图书管理系统(简化版),来巩固所学的 Java 知识,提升实际编程能力 。

(一)简易计算器项目

项目需求分析:在日常生活和工作中,计算器是常用的工具,我们的目标是使用 Java 编写一个简易计算器程序,它需要具备基本的加、减、乘、除运算功能,能够接收用户在控制台输入的两个操作数和一个运算符,然后进行相应的运算,并将结果输出到控制台 。

功能模块设计:为了实现上述功能,我们将程序划分为三个主要功能模块:

输入模块:负责从控制台获取用户输入的两个操作数和一个运算符 。我们可以使用 Java 的Scanner类来实现这一功能,Scanner类提供了方便的方法来读取用户在控制台输入的数据 。

运算模块:根据用户输入的运算符,对两个操作数执行相应的数学运算 。这是程序的核心逻辑部分,我们可以使用switch语句来根据不同的运算符选择对应的运算逻辑 。

输出模块:将运算模块得到的结果输出到控制台 。使用System.out.println()方法即可实现输出功能 。

代码实现与讲解:下面是实现简易计算器的关键代码:

import java.util.Scanner;

public class SimpleCalculator {

    public static void main(String[] args) {

        // 创建Scanner对象用于获取用户输入

        Scanner scanner = new Scanner(System.in);

        // 提示用户输入第一个数字

        System.out.print("请输入第一个数字: ");

        double num1 = scanner.nextDouble();

        // 提示用户输入第二个数字

        System.out.print("请输入第二个数字: ");

        double num2 = scanner.nextDouble();

        // 提示用户输入运算符

        System.out.print("请输入运算符 (+, -, *, /): ");

        char operator = scanner.next().charAt(0);

        // 调用calculate方法计算结果

        double result = calculate(num1, num2, operator);

        // 检查结果是否有效

        if (Double.isNaN(result)) {

            System.out.println("无效的运算符或除数为零!");

        } else {

            System.out.println("结果: " + result);

        }

        // 关闭Scanner对象,释放资源

        scanner.close();

    }

    /**

     * 计算两个数字的运算结果

     * @param num1 第一个数字

     * @param num2 第二个数字

     * @param operator 运算符

     * @return 计算结果,如果运算符无效或除数为零,返回NaN

     */

    public static double calculate(double num1, double num2, char operator) {

        switch (operator) {

            case '+':

                // 加法运算

                return num1 + num2;

            case '-':

                // 减法运算

                return num1 - num2;

            case '*':

                // 乘法运算

                return num1 * num2;

            case '/':

                // 除法运算,判断除数是否为零

                if (num2 != 0) {

                    return num1 / num2;

                } else {

                    // 返回NaN表示无效值

                    return Double.NaN;

                }

            default:

                // 如果运算符不是上述四种之一,返回NaN

                return Double.NaN;

        }

    }

}

在这段代码中,首先创建了Scanner对象用于读取用户输入 。然后,通过System.out.print()方法提示用户输入第一个数字、第二个数字和运算符,并使用scanner.nextDouble()方法获取用户输入的双精度浮点数,scanner.next().charAt(0)方法获取用户输入的单个字符运算符 。

接下来,调用calculate方法进行运算,calculate方法使用switch语句根据不同的运算符执行相应的运算 。如果运算符是 “+”,则执行加法运算num1 + num2;如果是 “-”,执行减法运算num1 - num2;如果是 “”,执行乘法运算num1 * num2;如果是 “/”,先判断除数num2是否为零,不为零时执行除法运算num1 / num2,为零时返回Double.NaN表示无效值 。如果运算符不是 “+”“-”“”“/” 中的任何一个,也返回Double.NaN 。

最后,在main方法中判断计算结果是否为NaN,如果是则输出错误信息 “无效的运算符或除数为零!”,否则输出计算结果 。程序结束时,调用scanner.close()方法关闭Scanner对象,释放资源 。

(二)图书管理系统(简化版)

系统功能概述:我们要实现一个简化版的图书管理系统,它应具备基本的图书管理功能,包括图书信息的存储,用户可以借阅图书,借阅后更新图书的借阅状态,以及归还图书时再次更新借阅状态 。

类与对象设计:为了实现这些功能,我们设计两个主要的类:

图书类(Book):用于表示图书,包含图书的基本信息,如书名(name)、作者(author)、价格(price)、类型(type)以及是否被借阅(isBorrowed) 。通过将这些属性封装在Book类中,实现了数据的封装,提高了数据的安全性和代码的可维护性 。同时,为每个属性提供getset方法,方便外部对这些属性进行访问和修改 。还提供了一个构造方法,用于在创建Book对象时初始化部分属性 。此外,重写toString方法,以便在输出Book对象时能够以更直观的方式展示图书信息 。代码如下:

public class Book {

    private String name;

    private String author;

    private double price;

    private String type;

    private boolean isBorrowed;

    public Book(String name, String author, double price, String type) {

        this.name = name;

        this.author = author;

        this.price = price;

        this.type = type;

        this.isBorrowed = false; // 初始化时图书未被借阅

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getAuthor() {

        return author;

    }

    public void setAuthor(String author) {

        this.author = author;

    }

    public double getPrice() {

        return price;

    }

    public void setPrice(double price) {

        this.price = price;

    }

    public String getType() {

        return type;

    }

    public void setType(String type) {

        this.type = type;

    }

    public boolean isBorrowed() {

        return isBorrowed;

    }

    public void setBorrowed(boolean borrowed) {

        isBorrowed = borrowed;

    }

    @Override

    public String toString() {

        return "Book{" +

                "name='" + name + '\'' +

                ", author='" + author + '\'' +

                ", price=" + price +

                ", type='" + type + '\'' +

                ", isBorrowed=" + isBorrowed +

                '}';

    }

}

图书馆类(Library):用于管理图书,它包含一个Book类型的数组(books)来存储图书,以及一个整数(size)来记录当前存储的图书数量 。提供了添加图书(addBook)、借阅图书(borrowBook)、归还图书(returnBook)等方法 。在addBook方法中,先检查数组是否已满,未满时将新图书添加到数组中,并更新图书数量 。borrowBook方法遍历数组查找指定书名的图书,找到且未被借阅时,将其借阅状态设置为已借阅并返回true,否则返回false 。returnBook方法同样遍历数组查找指定书名的图书,找到且已被借阅时,将其借阅状态设置为未借阅并返回true,否则返回false 。代码如下:

public class Library {

    private Book[] books;

    private int size;

    public Library(int capacity) {

        books = new Book[capacity];

        size = 0;

    }

    // 添加图书

    public void addBook(Book book) {

        if (size < books.length) {

            books[size] = book;

            size++;

            System.out.println("图书添加成功!");

        } else {

            System.out.println("书架已满,无法添加图书!");

        }

    }

    // 借阅图书

    public boolean borrowBook(String bookName) {

        for (int i = 0; i < size; i++) {

            if (books[i].getName().equals(bookName) &&!books[i].isBorrowed()) {

                books[i].setBorrowed(true);

                System.out.println("借阅成功!");

                return true;

            }

        }

        System.out.println("未找到该书或该书已被借阅!");

        return false;

    }

    // 归还图书

    public boolean returnBook(String bookName) {

        for (int i = 0; i < size; i++) {

            if (books[i].getName().equals(bookName) && books[i].isBorrowed()) {

                books[i].setBorrowed(false);

                System.out.println("归还成功!");

                return true;

            }

        }

        System.out.println("未找到该书或该书未被借阅!");

        return false;

    }

}

核心功能实现:以下是测试上述功能的代码:

public class LibraryTest {

    public static void main(String[] args) {

        // 创建一个容量为10的图书馆对象

        Library library = new Library(10);

        // 创建几本图书对象

        Book book1 = new Book("Java核心技术", "Cay S. Horstmann", 128.0, "计算机技术");

        Book book2 = new Book("Effective Java", "Joshua Bloch", 89.0, "计算机技术");

        // 添加图书到图书馆

        library.addBook(book1);

        library.addBook(book2);

        // 借阅图书

        library.borrowBook("Java核心技术");

        // 归还图书

        library.returnBook("Java核心技术");

    }

}

LibraryTest类的main方法中,首先创建了一个容量为 10 的Library对象,表示一个可以存放 10 本书的图书馆 。然后创建了两本图书book1book2,并使用library.addBook方法将它们添加到图书馆中 。接着,使用library.borrowBook方法尝试借阅 “Java 核心技术” 这本书,再使用library.returnBook方法归还这本书 。每一步操作都会在控制台输出相应的提示信息,告知用户操作的结果 。通过这些操作,展示了图书管理系统中图书添加、借阅和归还功能的实现 。

总结与展望

从最初搭建 Java 开发环境,到完成第一个 “Hello, World!” 程序,再到深入学习基础语法、数组与字符串操作,以及通过实战项目将所学知识付诸实践,相信大家已经对 Java 编程有了较为全面的认识和掌握 。这一路,我们如同在知识的海洋中逐浪前行,每一个知识点都是一座灯塔,照亮我们前行的道路;每一次代码的编写与调试,都是一次成长的历练 。

然而,Java 的世界广袤无垠,我们目前所学只是冰山一角 。在未来的学习道路上,还有许多高级特性等待我们去探索,如多线程 ,它能让程序同时执行多个任务,提高程序的效率和响应性,在服务器开发、图形界面编程等领域有着广泛的应用 ;异常处理,帮助我们优雅地处理程序运行过程中出现的错误,增强程序的健壮性和稳定性 ;集合框架,提供了丰富的数据结构和算法,方便我们高效地存储和操作数据 。深入学习这些高级特性,就像解锁更多的编程技能,让我们能够应对更加复杂和多样化的开发需求 。

学习 Java 编程,不仅是掌握一门技术,更是培养一种思维方式 。它教会我们如何将复杂的问题分解为一个个可解决的小问题,如何用逻辑和代码构建出功能强大的软件系统 。在这个快速发展的科技时代,编程能力已经成为不可或缺的核心竞争力 。希望大家能保持对 Java 编程的热爱和好奇心,不断学习,不断实践,在 Java 的世界里继续探索前行 。无论是追求个人技术的提升,还是为了实现职业目标,Java 都将是我们可靠的伙伴 。愿大家在 Java 编程的道路上越走越远,创造出属于自己的精彩 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值