- Java程序设计经典300例
- 李源编著
- 6字
- 2020-08-28 07:54:54
第1篇 基础篇
第1章 Java语言基础
欢迎大家来到Java的世界!从本章起,我们将带领大家使用Java语言实现许多各位在今后编程中经常会遇到的一些具体的实例,这些实例并不难,但是确实是非常实用的。读者通过学习并操作这些实例也可以进一步掌握和巩固自己的Java知识。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0019_0001.jpg?sign=1739175196-tA2z537KzjHTlnrgcsktLjmlwrGQ8r78-0-9cbc7073162691abe312e9e856b8664f)
实例001 输出“HelloWorld”语句
【实例描述】
学习Java编程首先要下载和配置JDK。完成下载和配置之后,可以编写一个简单的程序来检验配置的效果。本实例将在DOS控制台上输出最经典的“HelloWorld”语句,其运行效果如图1.1所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0019_0002.jpg?sign=1739175196-rRkw9p4ZDXE98WjBeVsOTiYjBHKCzBsP-0-4c198eac217935b751c53e5944f2d5a1)
图1.1 输出“HelloWorld”语句
【实现过程】
打开文本编辑器,如Windows系统的记事本,并在其中输入如下代码:
public class Helloworld { public static void main(String[] args) { System.out.println("Hello world"); } }
将其保存在C盘,并命名为HelloWorld.java,打开DOS控制台并切换路径到C盘,输入“javac HelloWorld.java”命令编译源代码,输入“java HelloWorld”命令运行class文件。
【代码解析】
本实例主要使用了两个Java命令,即javac和java。其中,javac命令用于编译源文件,这种文件的后缀名为.java,编译后生成一个class文件;java命令用于运行编译后的class文件,并在控制台上显示运行结果。
Java程序的具体运行过程我们可以用图1.2表示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0020_0003.jpg?sign=1739175196-lG7bDvgSyHnILvWx0XK6dZ9bOVmyPSz7-0-0f6b5cd745b27143c91a3e5b754a73c1)
图1.2 Java程序的运行过程
【知识扩展】
Java语言是一种在各个行业和领域都得到广泛应用的程序设计语言,它的特点如表1-1所示。
表1-1 Java语言的特点
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0020_0004.jpg?sign=1739175196-vbJZBMkjCB0nG2lSYFwTnxiWV40d9L6i-0-0de6b9e8b398ffb6393e0608ac236510)
实例002 用“*”直接输出三角形
【实例描述】
在学习了基本的输出语句之后,我们就可以用它来输出一些简单的图形。本实例将输出一个由“*”组成的三角形,其运行结果如图1.3所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0021_0005.jpg?sign=1739175196-tnbQQK9fqSaphnDOguAS2J4ZSi1UotkD-0-6d4c8c8e24fa6ca88d516993468c5b48)
图1.3 输出三角形
【实现过程】
打开文本编辑器,如Windows系统的记事本,并在其中输入如下代码:
public class Triangle { public static void main(String[] args) { System.out.println(" *"); System.out.println(" ***"); System.out.println(" *****"); System.out.println("*******"); } }
将其保存在C盘,并命名为Triangle.java,打开DOS控制台并切换路径到C盘,输入“javac Triangle.java”命令编译源代码,输入“java Triangle”命令运行class文件。
【代码解析】
学习了循环语句之后我们也可以使用循环语句来实现三角形的输出,那样编写的代码将更为简洁。使用javac命令编译源代码时,需要指定文件的类型,即需要包含.java后缀名。而使用java命令时,不需要指明后缀名。
实例003 可爱的符号表情
【实例描述】
除了可以输出字符串和简单的几何图形外,我们还可以通过字符串的适当组合,输出符号表情。本实例将在控制台上输出一个可爱的小猪头图形运行,效果如图1.4所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0022_0006.jpg?sign=1739175196-OM09jX4RoPBtBZT1L2QxWCPwuzWJqZoI-0-317a8155702d58543f9fd228bd948151)
图1.4 输出表情符号
【实现过程】
打开文本编辑器,如Windows系统的记事本,并在其中输入如下代码:
public class Pig { public static void main(String[] args) { System.out.println(" ╭︿︿︿╮ "); System.out.println(" {/ o o /}"); System.out.println(" ( (oo) )"); System.out.println(" ︶ ︶︶"); } }
将其保存在C盘,并命名为Pig.java,打开DOS控制台并切换路径到C盘,输入“javac Pig.java”命令编译源代码,输入“java Pig”命令运行class文件。
【代码解析】
Java中使用System.out.println();语句完成在控制台上的输出,该语句在输出完毕后会自动换行。如果不想换行,可以使用System.out.print();语句。
通过最简单的cmd运行程序,我们可以运行简单的Java程序,但是读者可以看出这样的操作过程并不方便。Java提供了多种编程工具,如JBuilder、Eclipse、NetBean等。运用编程工具可以给我们的Java编程带来极大的方便,所以我们后面的实例都将采用Eclipse工具进行编写, Eclipse的具体下载和使用方法我们将在附录中为大家介绍。
实例004 计算机支持的最大整数值是多少
【实例描述】
在Java中规定了8种基本数据类型来存储整数、浮点数、字符和布尔值。这些数据类型在我们的Java编程中起到了举足轻重的作用。那么你想知道Java的整数类型能表示的最大值是多少吗?如果你说是的话,就让我们一起编写一段代码来在你的计算机中验证一下吧!运行效果如图1.5所示。
【实现过程】
在Eclipse中新建项目MaxInt,并在其中创建一个MaxInt.java文件。在该类的主方法中实现int类型最大值的输出。核心代码如下所示:
public class MaxInt { public static void main(String[] args) { int int_max=java.lang.Integer.MAX_VALUE; System.out.println("Int的最大值为:"+int_max); } }
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0023_0007.jpg?sign=1739175196-IF6J3MsLOxc0d8IrTRda3Y1zTsAoSBso-0-5ab692b03eaf129487b014befb523392)
图1.5 整数类型最大值
【代码解析】
整型用来表示不含小数部分的数字。Java语言中共有四种整数类型,分别是byte、short、int和long。这四种数据类型所占存储空间和表示范围如表1-2所示。
表1-2 整型数据的占用空间和取值范围
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0023_0008.jpg?sign=1739175196-z9K5HIiqNxi76UtaDz96yBk5m0k0HYLF-0-2e64d7237ba2bce5c9fc9d2395bb53b5)
【知识扩展】
Java语言中的数据类型可以分为基本数据类型和引用数据类型,具体情况如图1.6所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0023_0009.jpg?sign=1739175196-oB1i8irKuwy8QagDE0vqU44GwK7uZgUD-0-25d6faf8e2d2cbad466f737fbadf1805)
图1.6 数据类型分类
实例005 获取浮点类型的最大最小值
【实例描述】
在实例004中我们知道了整型的最大值,那么浮点类型的最大最小值又是多少呢?浮点型数据分为单精度和双精度两种,它们的取值范围一样吗?为了探究这个问题,我们也来编写一段代码来验证一下。运行效果如图1.7所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0024_0010.jpg?sign=1739175196-Mq2d4jRalVhLLfH6wnPKdu08nHCC0ASn-0-65497da86abb0ef389a40c15c423b320)
图1.7 浮点类型的最大最小值
【实现过程】
在Eclipse中新建项目FloatDouble,并在其中创建一个FloatDouble.java文件。在该类的主方法中实现浮点类型最大最小值的输出。核心代码如下所示:
public class FloatDouble { public static void main(String[] args) { float float_max=java.lang.Float.MAX_VALUE; float float_min=java.lang.Float.MIN_VALUE; double double_max=java.lang.Double.MAX_VALUE; double double_min=java.lang.Double.MIN_VALUE; System.out.println("单精度浮点数的最大值为:"+float_max); System.out.println("单精度浮点数的最小值为:"+float_min); System.out.println("双精度浮点数的最大值为:"+double_max); System.out.println("双精度浮点数的最小值为:"+double_min); } }
【代码解析】
浮点型用来表示含有小数的数字。Java语言中共有float和double两种浮点类型。这两种数据类型所占用的内存空间和取值范围如表1-3所示。
表1-3 浮点型数据的占用空间和取值范围
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0024_0011.jpg?sign=1739175196-HeC5nKnWVqUOQZ5Qxj1t4HfhchoSqN8M-0-3c6fc9552c166805416cdbe7db4f4621)
【知识扩展】
浮点型数据是用来表示实数的。由于采用了浮点表示法,所以它比同样空间的整型数据的范围要大得多。浮点型数据默认为双精度数,如果需要指定为单精度数,需要在末尾加上F或f,比如12.5F。浮点型数据的表示方法如图1.8所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0025_0012.jpg?sign=1739175196-tOOJNLvK8wlPrXBFzfN1yy8r3nVQdjTs-0-522478289acba7bb97fb37b8a6d221d0)
图1.8 浮点型数据表示
实例006 常见字母的大小写转换
【实例描述】
我们在日常生活中经常会遇到需要对字母进行大小写转换的情况,那么这种很实用的功能是如何实现的呢?本例就会告诉你答案。具体的运行效果如图1.9所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0025_0013.jpg?sign=1739175196-KsnEw5MECWx0RKvfKEWmmgoItKeA32Q1-0-4cdae94dad218a9286718662504d4379)
图1.9 常见字母的大小写转换
【实现过程】
在Eclipse中新建项目WordChange,并在其中创建一个WordChange.java文件。在该类的主方法中创建System类的标准输入流的扫描器对象,提示用户输入要进行转换的字母,然后通过扫描器获取用户输入的字母,经过大小写转换后,把字符串输出到控制台。核心代码如下所示:
import java.util.Scanner; public class wordChange{ public static void main(String args[]){ Scanner in=new Scanner(System.in); System.out.println("请输入您要进行转换的字母:"); char c=in.next().charAt(0); if(c>='A'&&c<='Z'){ c+=32; System.out.println("这里的大写"+(char)(c-32)+"被转换成了"+c); } else if(c>='a'&&c<='z'){ c-=32; System.out.println("这里的小写"+(char)(c+32)+"被转换成了"+c); } else{ System.out.println("不带这种格式的输入返回重新输入"); } } }
【代码解析】
本例是对字符型数据的测试。字符型用关键字char表示,它是采用Unicode编码的16位字符类型,其表示范围是0~65536。标准的8位ASCII字符集是Unicode字符集的子集,其取值范围为0~127。表1-4展示了所有的ASCII码。我们从中可以发现,大小写字母之间正好相差32。所以我们可以通过加减32来完成字母的大小写转换。
表1-4 ASCII码表
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0026_0014.jpg?sign=1739175196-1Pn38Vn5eFaPJf8Mx1l2LJp05wC5TnuI-0-fa5ce3a939fb32125561bc6a06dd12a1)
【知识扩展】
Java中的字符,默认情况下是以Unicode码(一种类似于ASCII码的国际编码标准,采用二字节编码)存储的。字符型数据包括字符常量和字符串常量两种类型。
1.字符常量
字符常量是用单引号括起来的一个字符,如’a’、’A’等,如图1.10所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0027_0015.jpg?sign=1739175196-8m3PXoULf64akqjOYvko85BSHmy4BPlQ-0-32f99f016baff78e1d56c2437c0ad362)
图1.10 字符常量
某些特殊的字符,比如回车符、换行符、退格符等,无法直接用单引号括起来。为了表示这些字符,Java提供了一种特殊的字符常量,就是“\”,“\”后面的字符不再是原来的含义,所以又被称作转义序列。常用的转义序列及其含义如表1-5所示。
表1-5 转义序列及其含义
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0027_0016.jpg?sign=1739175196-vekv8Iy4Xq5z7v6dbLw8m5ksq7Akxmu9-0-4013b5cdda080aa2ed70107e3accacc9)
2.字符串常量
字符串常量是由若干个字符组成的序列,以双引号(””)作为界定符,如图1.11所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0027_0017.jpg?sign=1739175196-a2gFSpwNaXKTDEE3EIsQBznGXcyRs5N5-0-a542444e1f11882a58ac0cb63dea25cf)
图1.11 字符串常量
实例007 实现基本类型的类型转换
【实例描述】
Java基本数据类型之间存在自动类型转换和强制类型转换两种转换方法。本实例将演示这两种类型转换的方法。实例运行效果如图1.12所示。
【实现过程】
在Eclipse中新建项目TypeTransform,并在其中创建一个TypeTransform.java文件。在该类的主方法中创建各种基本类型的变量,在输出语句中分别输出所有变量累加值。最后将高类型数据向低类型数据进行强制类型转换,并注意运算结果是否丢失数据。核心代码如下所示:
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0028_0018.jpg?sign=1739175196-bM8icmyYwFMXGPBX0182LAQSDoGRfVq2-0-759eabac7cff94014b1e147458f166a7)
图1.12 自动类型转换和强制类型转换结果
public class TypeTransform { public static void main(String[] args) { byte b = 50; char c = 'G'; short s = 12345; int i = 6789; long l = 10000L; float f = 3.14159F; double d = 3.1415926; // 低类型向高类型自动转换 System.out.println("累加byte等于:" + b); System.out.println("累加char等于:" + (b + c)); System.out.println("累加short等于:" + (b + c + s)); System.out.println("累加int等于:" + (b + c + s + i)); System.out.println("累加long等于:" + (b + c + s + i + l)); System.out.println("累加float等于:" + (b + c + s + i + l + f)); System.out.println("累加double等于:" + (b + c + s + i + l + f + d)); // 高类型到低类型的强制转换 System.out.println("把long强制类型转换为int:" + (int) l); // 高类型到低类型转换会丢失数据 System.out.println("把int强制类型转换为short:" + (short) l); // 实数到整数转换将舍弃小数部分 System.out.println("把double强制类型转换为int:" + (int) d); // 整数到字符类型的转换将获取对应编码的字符 System.out.println("把short强制类型转换为char:" + (char) s); } }
【代码解析】
本实例的关键技术是强制类型转换。数据类型的转换方式可分为“自动类型转换”和“强制类型转换”两种。
1.自动类型转换
已经定义好数据类型的成员字段,若想用另一种数据类型表示时,如果想使Java自动进行转换,需要满足下面两种条件:
● 转换前的数据类型与转换后的类型兼容。
● 转换后的数据类型的表示范围比转换前的类型大。
2.强制类型转换
当程序需要从高级向低级转换数据类型时,就必须实施强制性的类型转换,其语法如图1.13所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0029_0019.jpg?sign=1739175196-CwqbxPpxtufy0cKIXVaJv6ErKBnF90ti-0-d360a0d4c09e6e3ebe8a96d14c728859)
图1.13 强制类型转换语法
具体可以进行转换的方式如表1-6所示。
表1-6 数据类型转换表
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0029_0020.jpg?sign=1739175196-SBgL11xqBciWLJWTIOmS83yLlZyol5Gf-0-71e25d724b07e368357803c17a78a54d)
实例008 判断一个数字的奇偶性
【实例描述】
在完成简单的条件判断的时候,我们可以使用三元运算符来实现。本实例就利用三元运算符实现了奇偶数的判断,程序要求用户输入一个整数,然后程序判断是奇数还是偶数,并输入到控制台中。实例的运行效果如图1.14所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0029_0021.jpg?sign=1739175196-mLZDL28SxGDDpp7zVs19FsK89jSttNZK-0-4d98e099aaad6915923d693c28b49783)
图1.14 判断数字的奇偶性
【实现过程】
在Eclipse中新建项目Odd_even,并在其中创建一个Odd_even.java文件。在该类的主方法中创建标准输入流的扫描器对象,提示用户输入一个整数,并通过扫描器的方法接收一个整数,通过三元运算符判断该数字与2相除的余数,如果余数为0说明其是偶数,否则是奇数。核心代码如下所示:
import java.util.Scanner; public class Odd_even { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 创建输入流扫描器 System.out.println("请输入一个整数:"); long number = scan.nextLong(); // 获取用户输入的整数 String check = (number % 2 == 0) ? "这个数字是:偶数" : "这个数字是:奇数"; System.out.println(check); } }
【代码解析】
三元条件表达式运算时首先判断表达式(布尔型)的值,如果为true,则整个表达式的结果为冒号前的值,否则为冒号后面的值。它的基本形式如图1.15所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0030_0022.jpg?sign=1739175196-M4fbioMRCNUM0TEU11uvavhFIajlAjLD-0-f95a5b1373ece8a4b0c33d05522048ad)
图1.15 条件运算符
请看下面的示例,它将a的绝对值赋给b:
b = a < 0 ? -a : a
其中,如果a的值大于等于0,那么将它的值赋给b,如果a为负数,则将该值的负值(即绝对值)赋给b,因此实现了求某个数的绝对值的功能。
【知识扩展】
三元条件运算符可以看成是if-else语句的简写格式,它和if-else语句的区别在于:if后的代码块可以有多个语句,但三元运算符是不支持多个语句的。
实例009 不借助第三者实现两个变量值的互换
【实例描述】
变量的互换常见于数组排序算法中,当判断两个数组元素需要交互式时,将创建一个临时变量来共同完成互换,但是临时变量的创建增加了系统资源的消耗。如果需要交换两个整数类型的变量,那么我们可以使用更高效的方法。本实例演示了如何不借助临时变量实现两个整数类型的高效互换。示例的运行效果如图1.16所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0030_0023.jpg?sign=1739175196-mSt2zSBFdUPhQpl3fgVBdi8skgxNRqSG-0-6dffeff545c6a96d3c032b1355e181b9)
图1.16 不借助第三者实现两个变量值的互换
【实现过程】
在Eclipse中新建项目ExchangeValue,并在其中创建一个ExchangeValue.java文件。在该类的主方法中创建标准输入流的扫描器对象,接收用户输入的两个变量值,然后通过位运算中的异或运算符“^”实现两个变量的互换。核心代码如下所示:
import java.util.Scanner; public class ExchangeValue { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 创建扫描器 System.out.println("请输入变量A的值"); long A = scan.nextLong(); // 接收第一个变量值 System.out.println("请输入变量B的值"); long B = scan.nextLong(); // 接收第二个变量值 System.out.print("A=" + A + "\tB=" + B); System.out.print("\t执行变量互换...\t"); A = A ^ B; // 执行变量互换 B = B ^ A; A = A ^ B; System.out.println("A=" + A + "\tB=" + B); } }
【代码解析】
按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:
00001001^00000101 00001100 (十进制为12) main(){ int a=9; a=a^15; printf("a=%d\n",a); }
实例010 实现输入字符的加密和解密
【实例描述】
本实例通过位运算的异或运算符“^”把字符串与一个指定的值进行异或运算,从而改变字符串中每个字符的值,这样就可以得到一个加密后的字符串,当把加密后的字符串作为程序输入内容,异或运算会把加密后的字符串还原为原有字符串的值,如图1.17所示。
![](https://epubservercos.yuewen.com/EF3DAF/3591141903622101/epubprivate/OEBPS/Images/figure_0031_0024.jpg?sign=1739175196-2Md9pGFExwKvsPAebWwg3edRavKZAFsG-0-aa8d4353aef2b8f355559a9cd5d0dce0)
图1.17 实现输入字符的加密和解密
【实现过程】
在Eclipse中新建项目Encryption,并在其中创建一个Encryption.java文件。在该类的主方法中创建System类的标准输入流的扫描器对象,提示用户输入一个英文字符串或者要解密的字符串,然后通过扫描器获取用户输入的字符串,经过加密或者解密后,把字符串输出到控制台。核心代码如下所示:
import java.util.Scanner; public class Encryption { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入一个英文字符串或解密字符串"); String password = scan.nextLine(); // 获取用户输入 char[] array = password.toCharArray(); // 获取字符数组 for (int i = 0; i < array.length; i++) { // 遍历字符数组 array[i] = (char) (array[i] ^ 20000); // 对每个数组元素进行异或运算 } System.out.println("加密或解密结果如下:"); System.err.println(new String(array)); // 输出密钥 } }
【代码解析】
本实例的关键技术是异或运算。如果某个字符(或数值)x与一个数值m进行异或运算得到y,则再用y与m进行异或运算就可以还原为x,因此应用这个原理可以实现加密和解密功能。