购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第2章
走进Java

视频教学:62分钟

在真正学习Java这门编程语言之前,应该对Java代码的组成部分有一个基本的了解。本章首先介绍Java代码的组成部分及语法结构,然后引入Java语言中变量和常量的相关知识,最后讲解如何在控制台中进行输入与输出。

2.1 Java代码的组成部分

扫码看视频(上)

扫码看视频(中)

扫码看视频(下)

Java代码由类、主方法、关键字、标识符和注释等内容组成。本节将一一对其进行介绍。

2.1.1 类

类是Java程序的基本单位,是包含某些共同特征的实体的集合。例如,在某影视网站上,按照电影 → 科幻 → 中国大陆 → 2019的搜索方式能够搜索到《流浪地球》《疯狂的外星人》《上海堡垒》《最后的日出》等影视作品。

换言之,《流浪地球》《疯狂的外星人》《上海堡垒》《最后的日出》等影视作品可以被归纳为2019年上映的中国大陆的科幻电影类。

使用Java语言创建类时,需要使用class关键字,创建类的语法如下。

[修饰符] class 类名称{  }

在程序设计过程中,开发人员为了避免程序的重要部分被其他程序员访问,需要借助修饰符予以实现。例如,class被public修饰时,此时的public被称作公共类修饰符。如果一个类被public修饰,那么这个类被称作公共类,能够被其他类访问。此外,Java语言还提供了其他修饰符,例如private、protected等。修饰符的相关内容详见后续章节。

注意

(1)class与类名称之间必须至少有一个空格,否则Eclipse会出现图2.1所示的错误提示。

图2.1 class与类名称之间没有空格

(2)“{”和“}”之间的内容叫作类体。类体包含主方法、注释和Java语句等内容,如图2.2所示。

图2.2 类体

2.1.2 主方法

主方法,即main()方法,是Java程序的入口,用于指定程序从这里开始被执行。主方法的语法如下。

public static void main(String[] args){
    //方法体
}

主方法的各个组成部分的说明如下。

public:当使用public修饰方法时,public被称作公共访问控制符,能够被其他类访问。

static:被译为“全局”或者“静态”。主方法被static修饰后,当Java程序运行时,会被JVM(Java虚拟机)第一时间找到。

void:指定主方法没有具体的返回值(即什么也不返回);关于返回值,如果把投篮看作一个方法,那么投篮方法将具有两个返回值,即篮球被投进篮筐和篮球没有被投进篮筐。

main:能够被JVM识别的、不可更改的一个特殊的单词。

String[] args:主方法的参数类型,参数类型是一个字符串数组,该数组的元素是字符串。有关数组和字符串的相关知识,读者可参阅本书的第6章和第9章。

2.1.3 关键字

在Java语言中,关键字是指被赋予特定意义的一些单词,是Java程序重要的组成部分。凡是在Eclipse中显示为红色粗体的单词,都是关键字。在编写代码时,既要正确区分关键字的大小写,又要避免关键字拼写错误,否则,Eclipse将出现图2.3和图2.4所示的错误提示。

注意

读者朋友在使用Java语言中的关键字时,要注意以下两点。

(1)表示关键字的英文单词都是小写的。

(2)不要少写或者错写英文字母,如将import写成imprt、super写成supre。

图2.3 大小写错误

图2.4 关键字的拼写错误

Java中的关键字及其说明如表2.1所示,其中带有★标志的是Java程序中出现频率较高的关键字。

表2.1 Java中的关键字及其说明

说明

(1)Java语言中的关键字不是一成不变的,而是随着新版本的发布而不断变化的。

(2)Java语言中的关键字不需要专门记忆,随着编写代码的熟练度的提高,自然就记住了。

2.1.4 标识符

什么是标识符呢?先来看一个生活实例,小王乘坐地铁时,偶遇到了某位同事并随即喊出了这位同事的名字,这个名字就是这位同事的“标识符”。而在Java语言中,标识符是指开发者在编写程序时为类、方法等内容定义的名称。为了提高程序的可读性,在定义标识符时,要尽量遵循“见名知意”的原则。例如,当其他开发人员看到类名ScienceFictionFilms时,就会知道这个类表示的是科幻电影。

Java标识符的具体命名规则如下。

(1)标识符由一个或多个字母、数字、下划线“_”和美元符号“$”组成,字符之间不能有空格。

【正例】a、B、name、c18、$table、_column3。

【反例】hi!、left<、name。

错误展示图如图2.5所示。

图2.5 字符之间不能有空格

(2)一个标识符可以由几个单词连接而成,以提高标识符的可读性。

对于类名称,每个单词的首字母均为大写。

【正例】表示“科幻电影类”的类名称是ScienceFictionFilms。

变量或者方法名称应采用驼峰式命名规则,即首个单词的首字母为小写,其余单词的首字母为大写。

【正例】表示“用户名”的变量名是userName。

对于常量,每个单词的所有字母均为大写;单词之间不能有空格,但可以用英文格式的下划线“_”进行连接。

【正例】表示“一天的小时数”的常量名是HOURSCOUNTS,也可写作HOURS_COUNTS。

【反例】表示“一天的分钟数”的常量名是MINUTES COUNTS,错误展示图如图2.6所示。

图2.6 单词之间不能有空格

(3)标识符中的第一个字符不能为数字。

【反例】使用24hMinutes命名表示“24个小时的分钟数”的变量,错误展示图如图2.7所示。

图2.7 标识符中的第一个字符不能为数字

(4)标识符不能是关键字。

【反例】使用class命名表示“班级”的变量,错误展示图如图2.8所示。

图2.8 标识符不能是关键字

说明

(1)Java语言严格区分单词的大小写,同一个单词的不同形式所代表的含义是不同的。例如,Class和class代表着两种完全不同的含义:Class是一个类名称,而class是被用来修饰类的关键字。

(2)Java可以用中文作为标识符,但中文标识符不符合开发规范。当Java代码的编译环境发生改变后,中文会变成乱码,这将导致Java代码无法通过编译。

2.1.5 注释

当我们遇到一个陌生的英文单词时,会借助英汉词典进行解惑,词典会给出这个单词的中文解释。Java语言也具有如此贴心的功能,即“注释”。注释是一种对代码程序进行解释、说明的标注性文字,可以提高代码的可读性。在开篇代码中,“//”后面的内容就是注释。注释会被Java编译器忽略,不会参与程序的执行过程。

Java提供了3种代码注释,分别为单行注释、多行注释和文档注释。

1.单行注释

“//”为单行注释标记,从符号“//”开始直到换行为止的所有内容均作为注释而被编译器忽略。单行注释的语法如下。

//注释内容

例如,声明一个int类型的表示年龄的变量age,并为变量age添加注释。

int age;    // 声明一个int类型的表示年龄的变量age

说明

int是Java语言中的一种整数类型(第3章将详细介绍)。因为年龄是整数,所以需要用整数类型予以声明。

注意

注释可以出现在代码的任意位置,但是不能分隔关键字或者标识符,错误展示图如图2.9所示。

图2.9 注释不能分隔关键字

2.多行注释

“/*…*/”为多行注释标记,符号“/*”与“*/”之间的所有内容均为注释内容且可以换行。多行注释标记的作用有两个:为Java代码添加必要信息和将一段代码注释为无效代码。多行注释的语法如下。

/*
    注释内容1
    注释内容2
    ...
*/

例如,使用多行注释添加版权和作者信息的效果图如图2.10所示,使用多行注释将一段代码注释为无效代码的效果图如图2.11所示。

图2.10 使用多行注释添加版权和作者信息

图2.11 使用多行注释将一段代码注释为无效代码

3. 文档注释

Java语言还提供了一种借助Javadoc工具能够自动生成说明文档的注释,即文档注释。

说明

Javadoc工具是由Sun公司提供的。待程序编写完成后,借助Javadoc工具就可以生成当前程序的说明文档。

“/**…*/”为文档注释标记,符号“/**”与“*/”之间的内容为文档注释内容。不难看出,文档注释与一般注释的最大区别在于它的起始符号是“/**”而不是“/*”或“//”。

例如,使用文档注释为main()方法添加注释的效果如图2.12所示。

图2.12 为main()方法添加文档注释

说明

一定要养成良好的编码习惯。软件编码规范中提到“可读性第一,效率第二”,所以程序员必须要在程序中添加适量的注释来提高程序的可读性和可维护性。建议程序中的注释总量占程序代码总量的20%~50%。

表2.2所示为文档注释的标签语法。

表2.2 文档注释的标签语法

说明

(1)注释的位置的具体要求如下。

单行注释应该写在被注释的代码的上方或右侧。

多行注释的位置和单行注释相同,虽然多行注释可以写在代码之内,但不建议这样写,因为这样写会降低代码可读性。

文档注释必须写在被注释代码的上方。

(2)注释是代码的说明书,用于说明代码是做什么的、使用代码时需要注意的问题等内容。编写注释时,既不要写代码中直观体现的内容,也不要写毫无说明意义的内容。

2.2 变量与常量

上一节讲解了Java代码的组成部分,本节将介绍Java语言中的两个重量级的概念:变量和常量。例如,某天美元兑换人民币的汇率为6.7295,某天92号汽油的价格为每升6.95元等,这些可以被改变数值的量称作变量;而1分钟等于60秒,一年有12个月等,这些不可以被更改数值的量称作常量。下面将对变量和常量的异同进行讲解。

2.2.1 变量

扫码看视频

在讲解变量前,先来解释下声明的含义。声明指的是变量被创建后,没有被赋予具体数值的过程。那么,变量应该如何声明呢?

1.声明变量

变量是用来存储数值的,但计算机并不聪明,无法自动分配指定大小的内存空间来存储这些数值。这时,需要借助Java语言提供的数据类型(第3章将详细介绍)予以实现。

声明变量的语法如下。

数据类型 变量标识符;

例如,某电商平台售有后壳为玻璃的手机壳,售价为49.9元,如图2.13所示。现声明表示手机壳售价的变量shellPrice。

C:\Users\JisUser\Desktop\第2章\2.22.tif

图2.13 后壳为玻璃的手机壳

因为表示手机壳售价的变量shellPrice的值是一个小数,而在Java语言中,默认用表示浮点类型的double声明值为小数的变量,所以变量shellPrice的数据类型应为double。因此,声明变量shellPrice的代码如下。

double shellPrice; 
2.为变量赋值

声明变量后,要为变量赋值,为变量赋值的过程称作定义、初始化或者赋初值。为变量赋值的语法如下。

数据类型 变量标识符 = 变量值;

例如,为上文中表示手机壳售价的变量shellPrice赋值,值为49.9,代码如下。

double shellPrice = 49.9;

注意

选择正确的数据类型是至关重要的,否则Eclipse会出现图2.14所示的错误提示。

图2.14 数据类型选择不当

说明

int是Java语言中的一种整数类型,其存储的是整数数值。而49.9是一个小数,这使得等号左右两端的数据类型不匹配,因此需要使用Java语言中表示浮点类型的double予以存储。

3.同时声明多个变量

声明变量时,对于相同数据类型的变量,可以同时声明多个。同时声明多个变量的语法如下。

数据类型 变量标识符1, 变量标识符2, …, 变量标识符n;

例如,某超市特价销售3种水果,即苹果每500克4.98元、橘子每500克3.98元和香蕉每500克2.98元;现同时声明表示苹果价格的变量applePrice、表示橘子价格的变量orangePrice和表示香蕉价格的变量bananaPrice。因为苹果价格、橘子价格和香蕉价格都是小数,所以这3个变量的数据类型均为double,代码如下。

double applePrice, orangePrice, bananaPrice;

声明变量applePrice、orangePrice和bananaPrice后,要分别为这3个变量赋值,进而表示这3种特价水果的价格。赋值的方式有以下两种。

(1)声明时直接赋值,代码如下。

double applePrice = 4.98, orangePrice = 3.98, bananaPrice = 2.98;

(2)先声明,再赋值,代码如下。

double applePrice, orangePrice, bananaPrice;
applePrice = 4.98;
orangePrice = 3.98;
bananaPrice = 2.98;

注意

多个变量在“先声明,再赋值”的过程中,多个赋值语句不能使用逗号间隔开且写在同一行;否则,Eclipse会出现图2.15所示的错误提示。

图2.15 多个赋值语句不能使用逗号间隔开且写在同一行

2.2.2 常量

扫码看视频

如果一个值是确定且不会被改变的,那么用常量来存储这个值。例如,1分钟等于60秒,60就可以被设置为常量;而2月有多少天是不固定的,非闰年时有28天,闰年时有29天,这种会根据条件变化的值不可以被设置为常量。

1.声明常量

如果要声明一个常量,那么需借助关键字final。关键字final被译为“最终的”,当修饰常量时,就相当于标记这个常量的值不允许被改变。声明常量的语法如下。

final 数据类型 常量标识符;

例如,声明一个表示1分钟等于多少秒的常量SECONDS,代码如下。

final int SECONDS;
2.为常量赋值

声明常量时,通常要直接为其赋值,为常量赋值的语法如下。

final数据类型 常量标识符 = 常量值;

例如,为上文中表示1分钟等于多少秒的常量SECONDS赋值,值为60,代码如下。

final int SECONDS = 60;
3.同时声明多个常量

如果需要同时声明多个同一数据类型的常量,可以采用如下格式。

final 数据类型 常量标识符1 = 常量值1, 常量标识符2 = 常量值2, …, 常量标识符n = 常量值n;

例如,声明多个常量,表示“1天有24小时,有1440分钟,有86400秒”,代码如下。

final int HOURS = 24, MINUTES = 1440, SECONDS = 86400;

在声明常量时,如果已经对其赋值了,那么常量的值不允许再被修改;否则,Eclipse会出现图2.16所示的错误提示。

图2.16 常量的值不允许再被修改

2.3 控制台的输入和输出操作

生活中的输入与输出设备有很多。摄像机、扫描仪、话筒、键盘等都是输入设备,经过计算机解码后,由输入设备导入的图片、视频、音频和文字会在显示器、打印机、音响等输出设备进行输出,如图2.17所示。本节要讲解的控制台的输入和输出指的是先使用键盘输入字符,再将输入的字符显示在显示器上。

图2.17 常用输入与输出设备

本书使用的是Eclipse编程软件,而Eclipse的输出方式指的是在控制台中输出。所谓控制台,指的是图2.18所示的Console窗口。通过Console窗口,可以输出Java代码的运行结果。

图2.18 Eclipse中的Console窗口

2.3.1 控制台输出字符

扫码看视频

在控制台中输出字符的方法有3种,具体如下。

1.不会自动换行的print()方法

print()方法的语法如下。

System.out.print("By falling we learn to go safely!");

控制台输出“By falling we learn to go safely!”后,光标会停留在这句话的末尾处,不会自动跳转到下一行的起始位置。

2.可以自动换行的println()方法

println()方法在print后面加上了“ln”(即line的简写)后缀,语法如下。

System.out.println("迷茫不可怕,只要你还在向前走!");

控制台输出“迷茫不可怕,只要你还在向前走!”后,光标会自动跳转到下一行的起始位置。

print()方法与println()方法输出的效果对比如表2.3所示。

表2.3 两种输出方式的效果对比

所以Java换行输出的方法有以下两种。

System.out.print("\n");      //利用换行符“\n”实现换行
System.out.println();        //空参数即可实现换行

注意

使用这两个方法的时候还要注意以下两点。

(1)语句“System.out.println("\n");”会输出两行空行。

(2)语句“System.out.print();”无参数会报错。

实例2-1 创建“老者与小孩的故事”的OlderAndChildStory类。(实例位置:资源包\MR\源码\02\01。)

利用Java输出语句模拟老者与小孩的对话,对话内容如图2.19所示。

图2.19 老者与小孩的对话内容

创建含义为“老者与小孩的故事”的OlderAndChildStory类,在类中创建main()方法,在main()方法中使用System.out.println()模拟老者与小孩的对话,具体代码如下。

public class OlderAndChildStory {
public static void main(String[] args) {
    
    int age = 3;     ⇽---  创建整数类型变量age,记录小孩的年龄
        
        System.out.println("老者:小朋友今年几岁啊?");    ⇽---  老者在控制台中问了一个问题
        
        System.out.println("小孩:" + age + “岁!");    ⇽---  小孩在控制台中回答了自己的年龄
                
        System.out.println("老者:那明年又是几岁啊?");    ⇽---  老者又在控制台中问了一个问题
 
        int nextYearAge = age + 1;    ⇽---  小孩对自己的年龄做了一次加法运算
        
        System.out.println("小孩:" + nextYearAge + "岁!");    ⇽---  小孩在控制台中回答了计算得到的年龄
    }
}

运行结果如图2.20所示。

图2.20 输出不同类型的值

3.格式化输出

除了前面两种常规的输出方式,Java语言还提供了格式化输出。例如,超市购物小票上的应收金额保留了两位小数,如图2.21所示。

图2.21 应收金额保留两位小数

Java沿用了C++中用于格式化输出的printf()函数,使用该函数即可将指定的内容以指定的格式输出在控制台中,其语法如下。

printf(String format, Object…args)

其中,参数format被译为“格式化的”,这里表示需要使用格式化的公式;参数args被译为“计算机参数”,是一个Object类型的可变参数,可变表示参数args的个数可以是多个。

下面着重介绍两种用于格式化输出的转换符。

输出数字时使用转换符“%d”,举例如下。

System.out.printf("1251+3950的结果是:%d\n", 1251 + 3950);

输出结果如下。

1251+3950的结果是:5201

指定小数位数时可以使用转换符“%f”,%与f之间用“.X”的形式指定小数位数。其中,X表示的是小数位数。例如,圆周率π的近似值为3.1415926,这里保留小数点后两位小数,代码如下。

System.out.printf("π取两位小数:%.2f\n", 3.1415926);

输出结果如下。

π取两位小数:3.14

2.3.2 控制台输入字符

扫码看视频

有输出就会有输入,Java从控制台中读取用户输入的值时需要借助一个被称作Scanner的类。Scanner译为“扫描仪”,其用途和现实生活中的扫描仪一样,能够扫描用户输入的内容。Java语言中的System.in()方法表示从控制台输入,使用Scanner类扫描System.in()方法即可获取用户输入的值。

需要注意的是,Scanner类在java.util这个包里,不能像System类那样直接被使用。因此,使用前需要先使用import语句导入java.util包中的Scanner类。下面先对import语句进行介绍。

1. import导入语句

import语句用来导入本类所在包之外的类,导入具体包或完整类之后,就可以调用导入的类,举例如下。

import java.util.Date;
import java.util.Scanner;

import语句与导入的类所在位置如图2.22所示。

图2.22 import语句与引入的类位置

import语句可以一次将某个包中的所有类都导入,“*”作为所有类名的替代符号,语法如下。

import java.util.*;

但有一点要注意,“*”只能替代类名,不能替代包名。例如,导入java.awt包中的所有类和java.awt的event子包中的所有类,需要写两条import语句,代码如下。

import java.awt.*;
import java.awt.event.*;
2.使用Scanner类进行输入

上面介绍了import语句,使用import语句导入Scanner类的代码如下。

import java.util.Scanner;    // 导入java.util包中的Scanner类

Scanner类提供了表2.4所示的常用方法,通过这些方法可以获取控制台中输入的不同类型的值。

表2.4 Scanner类的几个常用方法

说明

nextLine()方法扫描的内容是从第一个字符开始到换行符为止,而next()、nextInt()等方法扫描的内容是从第一个字符开始到这段完整内容结束。

使用Scanner类扫描控制台的代码如下。

Scanner sc=new Scanner(System.in); 

其中,System.in表示控制台的输入。在创建Scanner扫描器类的对象时,需要把System.in作为参数。

实例2-2 创建含义为“年龄示例”的AgeDemo类。(实例位置:资源包\MR\源码\02\02。)

创建含义为“年龄示例”的AgeDemo类,实现根据输入的年份(4位数字,如1981),计算目前的年龄,程序中使用Scanner扫描器类的nextInt()方法获取用户输入的数字,使用Calendar日历类获取当前年份数字,通过当前年份数字减去输入的年份数字得到年龄,具体代码如下。

import java.util.Calendar;    ⇽---  
import java.util.Scanner;    ⇽---  首先使用import语句导入Scanner和Calendar类,让程序知道会用到这两个类
 
public class AgeDemo {
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);    ⇽---  告诉Scanner类要扫描控制台
 
        Calendar c = Calendar.getInstance();    ⇽---  获取系统日历
        int thisYear = c.get(Calendar.YEAR);    ⇽---  从日历中取出当前年份数字,并记录下来
 
        System.out.println("请输入您的出生年份");    ⇽---  给用户显示一个提示
 
        int birth = sc.nextInt();    ⇽---  从控制台中扫描出用户输入的年份数字
 
        int age = thisYear - birth;
        System.out.println("您的年龄为:" + age);
 
        if (age < 18) {    ⇽---  
             System.out.println("您现在是未成年人(´`)");
        } else if (age >= 18) {
             System.out.println("您现在是青年人(^_-)☆");
        } else if (age >= 66) {
             System.out.println("您现在是中年人()");
        } else if (age >= 88) {
             System.out.println("您现在是老年人~@_@~”);
        }    ⇽---  判断用户属于哪个年龄段
    }
}

运行程序,提示输入出生年份。输入的出生年份必须是4位数字,例如2005。输入之后按<Enter>键,运行结果如图2.23所示。

图2.23 根据输入的出生年份计算年龄

说明

图2.24所示的“2005”是用户输入的,在运行程序时,读者可以自行输入。

2.4 动手练一练

(1)输出菱形。创建Image类,在Eclipse的控制台中输出图2.24所示的菱形。(答案位置:资源包\章后练习\02\01)

图2.24 输出菱形

(2)输出错误信息与调试信息。程序设计中,业务代码的部分功能需要配合调试信息以确定代码执行流程和数据的正确性,当程序出现严重问题时还要输出警告信息,这样才可以在调试中完成程序设计,运行效果如图2.25所示。(答案位置:资源包\章后练习\02\02)

C:\Users\JisUser\Desktop\Java1200例_图片\0019\1.png

图2.25 输出错误信息与调试信息

(3)从控制台接收输入的文本。System类除了有out和err两个输出流之外,还有in输入流的实例对象作为类成员,它可以接收用户的输入。本题要求通过该输入流实现从控制台接收用户输入文本,并提示该文本的长度信息,运行效果如图2.26所示。(答案位置:资源包\章后练习\02\03)

C:\Users\JisUser\Desktop\Java1200例_图片\0020\1.png

图2.26 从控制台接收输入的文本并输出文本长度信息

(4)输入Wi-Fi密码。创建PassWord类,首先在控制台中输入用户名为MRKJ的Wi-Fi密码,然后对这个Wi-Fi密码进行验证。如果Wi-Fi密码正确,那么控制台输出“正在获取ip地址……已连接”;否则,控制台输出“密码错误”,运行效果如图2.27所示。(答案位置:资源包\课后练习\02\04)

图2.27 输入Wi-Fi密码 xs3tDRzX5auS5ZUVLmLuz+3sSUPuPit9qT1saMYZK2zL2jeIAik+fBfrXOTOFQzy

点击中间区域
呼出菜单
上一章
目录
下一章
×