第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,因此应用这个原理可以实现加密和解密功能。