- Java程序设计经典300例
- 李源编著
- 6字
- 2020-08-28 07:54:54
第1篇 基础篇
第1章 Java语言基础
欢迎大家来到Java的世界!从本章起,我们将带领大家使用Java语言实现许多各位在今后编程中经常会遇到的一些具体的实例,这些实例并不难,但是确实是非常实用的。读者通过学习并操作这些实例也可以进一步掌握和巩固自己的Java知识。
实例001 输出“HelloWorld”语句
【实例描述】
学习Java编程首先要下载和配置JDK。完成下载和配置之后,可以编写一个简单的程序来检验配置的效果。本实例将在DOS控制台上输出最经典的“HelloWorld”语句,其运行效果如图1.1所示。
图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表示。
图1.2 Java程序的运行过程
【知识扩展】
Java语言是一种在各个行业和领域都得到广泛应用的程序设计语言,它的特点如表1-1所示。
表1-1 Java语言的特点
实例002 用“*”直接输出三角形
【实例描述】
在学习了基本的输出语句之后,我们就可以用它来输出一些简单的图形。本实例将输出一个由“*”组成的三角形,其运行结果如图1.3所示。
图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所示。
图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); } }
图1.5 整数类型最大值
【代码解析】
整型用来表示不含小数部分的数字。Java语言中共有四种整数类型,分别是byte、short、int和long。这四种数据类型所占存储空间和表示范围如表1-2所示。
表1-2 整型数据的占用空间和取值范围
【知识扩展】
Java语言中的数据类型可以分为基本数据类型和引用数据类型,具体情况如图1.6所示。
图1.6 数据类型分类
实例005 获取浮点类型的最大最小值
【实例描述】
在实例004中我们知道了整型的最大值,那么浮点类型的最大最小值又是多少呢?浮点型数据分为单精度和双精度两种,它们的取值范围一样吗?为了探究这个问题,我们也来编写一段代码来验证一下。运行效果如图1.7所示。
图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 浮点型数据的占用空间和取值范围
【知识扩展】
浮点型数据是用来表示实数的。由于采用了浮点表示法,所以它比同样空间的整型数据的范围要大得多。浮点型数据默认为双精度数,如果需要指定为单精度数,需要在末尾加上F或f,比如12.5F。浮点型数据的表示方法如图1.8所示。
图1.8 浮点型数据表示
实例006 常见字母的大小写转换
【实例描述】
我们在日常生活中经常会遇到需要对字母进行大小写转换的情况,那么这种很实用的功能是如何实现的呢?本例就会告诉你答案。具体的运行效果如图1.9所示。
图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码表
【知识扩展】
Java中的字符,默认情况下是以Unicode码(一种类似于ASCII码的国际编码标准,采用二字节编码)存储的。字符型数据包括字符常量和字符串常量两种类型。
1.字符常量
字符常量是用单引号括起来的一个字符,如’a’、’A’等,如图1.10所示。
图1.10 字符常量
某些特殊的字符,比如回车符、换行符、退格符等,无法直接用单引号括起来。为了表示这些字符,Java提供了一种特殊的字符常量,就是“\”,“\”后面的字符不再是原来的含义,所以又被称作转义序列。常用的转义序列及其含义如表1-5所示。
表1-5 转义序列及其含义
2.字符串常量
字符串常量是由若干个字符组成的序列,以双引号(””)作为界定符,如图1.11所示。
图1.11 字符串常量
实例007 实现基本类型的类型转换
【实例描述】
Java基本数据类型之间存在自动类型转换和强制类型转换两种转换方法。本实例将演示这两种类型转换的方法。实例运行效果如图1.12所示。
【实现过程】
在Eclipse中新建项目TypeTransform,并在其中创建一个TypeTransform.java文件。在该类的主方法中创建各种基本类型的变量,在输出语句中分别输出所有变量累加值。最后将高类型数据向低类型数据进行强制类型转换,并注意运算结果是否丢失数据。核心代码如下所示:
图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所示。
图1.13 强制类型转换语法
具体可以进行转换的方式如表1-6所示。
表1-6 数据类型转换表
实例008 判断一个数字的奇偶性
【实例描述】
在完成简单的条件判断的时候,我们可以使用三元运算符来实现。本实例就利用三元运算符实现了奇偶数的判断,程序要求用户输入一个整数,然后程序判断是奇数还是偶数,并输入到控制台中。实例的运行效果如图1.14所示。
图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所示。
图1.15 条件运算符
请看下面的示例,它将a的绝对值赋给b:
b = a < 0 ? -a : a
其中,如果a的值大于等于0,那么将它的值赋给b,如果a为负数,则将该值的负值(即绝对值)赋给b,因此实现了求某个数的绝对值的功能。
【知识扩展】
三元条件运算符可以看成是if-else语句的简写格式,它和if-else语句的区别在于:if后的代码块可以有多个语句,但三元运算符是不支持多个语句的。
实例009 不借助第三者实现两个变量值的互换
【实例描述】
变量的互换常见于数组排序算法中,当判断两个数组元素需要交互式时,将创建一个临时变量来共同完成互换,但是临时变量的创建增加了系统资源的消耗。如果需要交换两个整数类型的变量,那么我们可以使用更高效的方法。本实例演示了如何不借助临时变量实现两个整数类型的高效互换。示例的运行效果如图1.16所示。
图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所示。
图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,因此应用这个原理可以实现加密和解密功能。