叁——Java程序要素概览

一、感性认知Java程序

1.认识Java程序的框架

(1)大括号、段及主体

将类名称定出之后,就可以开始编写类的内容。左大括号“{”为类的主体开始标记,而整个类的主体至右大括号“}”结束。每个命令语句结束时,都必须以分号“;”做结尾。当某个命令的语句不止一行时,必须以一对大括号“{}”将这些语句包括起来,形成一个程序段(segment)或是块(block)。

注意:程序中的注释会被编译器自动过滤,这些注释是为了让程序员们便于理解而人为添加的,它们可以提高Java源码的可读性,使得Java程序条理清晰。

(2)程序运行的起始点——main()方法

Java程序是由一个或一个以上的类组合而成,程序起始的主体也是被包含在类之中。这个起始的地方称为main(),用左右大括号将属于main()段的内容包围起来,称之为“方法”(method)。不论Java程序有千万行,执行的入口有且只有一个,就是main()方法。

main()方法前必须加上public static void这3个标识符。其作用如下:

标识符

作用

public

public代表main()公有的方法。

static

static表示main()是个静态方法。

void

void英文本意为空的,这里表示main()方法没有返回值。

String args[]

main后面括号()中的参数String args[]表示运行该程序时所需要的参数,是固定的用法。

注意:如果将一个类声明成public,那么需保证文件名称和这个类名称相同,因为在一个public文件里,最多只能有一个public类,否则.java的文件便无法命名。

(3)Java中“方法”与C/C++中“函数”的两者概念上的区别和联系如下:

概念

区别与联系

函数

“函数”是一段实现某种“功能”的代码,函数的操作是对输入数据的处理。函数的英文“function”恰恰有“功能”的含义,它通过函数的名称来实施函数调用。它能将一些数据(也就是参数)传递进去进行处理,然后返回一些数据(即函数的返回值),也可以没有返回值。所有传递给函数的数据都是显式传递的。而方法的参数传递通常是隐式的,它可以直接操作类内部的数据。

方法

“方法”也是一段完成某项功能的代码,也通过名字来进行调用,但它依赖于某个特定的对象。简单来说,就是方法和对象相关,而函数与对象无关。因为Java是一门完全面向对象编程的语言,所以在Java里只有方法。

C语言是面向过程的编程语言,所以在C语言中只有函数。C++是C语言的超集,既支持面向过程编程,又支持面向对象编程,所以在C++中,如果一个函数独立于类之外,那它就是函数,如果它存在于一个类中,那它就是方法,所不同的是,C++给这种特殊的方法取了一个新名称——成员函数(member function)。

扩展:System.out是指标准输出,通常与计算机的接口设备有关,如打印机、显示器等。其后的println,是由print与line所组成的,意思是将很难过面括号中的内容打印在标准输出设备——显示器上。println()与print()的却别在于前者打印出结果后会自动换行,后者不会换行。

2.认识标识符

Java中的包(package)、类、方法、参数和变量的名称,可由任意顺序的大小写字母、数字、下划线( _ )和美元符号( $ )等组成,但这些名称的标识符不能以数字开头,也不能是Java中保留的关键字。

例如:

正确的标识符

yourname

your_name

_yourname

$yourname

错误的标识符

class

6num23

abc@sina

x+y

注意:标识符的命名规则属于强制性的,不然编译时会报错。标识符最好永远用字母开头,而且尽量不要包含其他的符号。规则是必须遵守的,而规范是约定俗成的。

3.认识关键字

Java中有许多关键字(Keywords,也叫保留字),如:public、static、int等,这些关键字不能当做标识符使用。在程序开发中一旦使用了这些关键字做标识符,编译器在编译时就会报错。

关键字

abstract

assert ***

bollean

break

byte

case

catch

char

class

const *

continue

default

do

double

else

enum ****

extends

false

final

finally

float

for

goto *

if

implements

import

instanceof

int

interface

long

native

new

null

package

private

protected

public

return

short

static

stricfp **

synchronized

super

this

throw

transient

true

try

void

volatile

while

 

 

 

注:*表示该关键字尚未启用;**表示在Java1.2添加的;***表示在Java1.3添加的;****表示在Java5.0添加的。

注意:虽然goto、const在Java中并没有任何意义,却也是保留的关键字,与其他的关键字一样,在程序里不能用来作为自定义的标识符,true、false、null等看起来像关键词,实际上在Java中,它们仅仅是普通的字符串。Java中的所有的关键字均由小写字母构成。

4.认识注释

注释在源代码中的地位非常重要,虽然注释在编译时被编译器自动过滤掉,但为程序添加注释可以解释程序的某些语句的作用和功能,提高程序的可读性。

Java里的注释根据不同的用途分为以下三种类型:

类型

解释

示例

单行注释

单行注释,就是在注释内容的前面加双斜线( // ),Java编译器会忽略这部分信息。Eclipse中的快捷键为:Ctrl + /

int num;  //定义一个整数

多行注释

多行注释,就是在注释内容的前面以单斜线加一个星型标记( /* )开头,并在注释内容末尾以一个星型标记加单斜线( */ )结束。当注释内容超过一行时,一般可使用这种方法。

/*

  int c = 10;

  int x = 5;

*/

文档注释

文档注释,是以单斜线加两个星型标记( /** )开头,并以一个星型标记加单斜线( */ )结束。用这种方法注释的内容会被解释成程序的正式文档,并能包含进如javadoc之类的工具生成的文档里,用以说明该程序的层次结构及其方法。通常在程序开头加入作者、时间、版本、要实现的功能等内容注释,方便后来的维护以及程序员的交流。

/**

*  作者

*  时间

*  版本

*  要实现的功能

*/

扩展:还可以用程序注释来暂时屏蔽某些程序语句,让编译器暂时不要处理这部分语句,等到需要的时候只需把注释标记取消即可。这也是程序调试的一种技巧。

注意:撰写注释部分可以借助Eclipse方便地生成注释。在Eclipse中选择【Window】→【Preference】→【Java】→【Code Style】→【Formatter】设置好一些固定格式的注释模板后,按Alt + Shift + J组合键便可方便插入注释。

5.认识变量

在Java程序设计中,变量(Variable)是存储数据的载体。计算机中的变量是实际存在的数据。变量的数值可以被读取和修改,它是一切计算的基础。

与变量相对应的就是常量(Constant)。它是固定不变的量,一旦被定义并赋初值后,它的值就不能再被改变。

(1)变量的声明

声明一个变量的基本方式为:数据类型  变量名;

也可以在声明变量的同时,给予该变量初始化:数据类型  变量名  =  数值或表达式;

例:

int num1,num2,num3;  //声明三个变量,彼此间用英文逗号“,”隔开。

int num1;int num2;int num3;  //用三个语句声明上面的三个变量,彼此间用英文分号“;”隔开。

(2)变量名称

变量名称可以自定义,但这些变量的名称不能使用Java的关键字。通常会以变量所代表的意义来取名。尽量对变量做到“见名知意”。

(3)变量的赋值

给所声明的变量赋予一个属于它的值,用赋值运算符( = )来实现。

有两种方式可以进行赋值:

第一种是在声明变量时赋值,如:int num = 6;  //声明变量,并直接赋值

另一种是声明后再赋值,如:int num;//声明整型变量  num = 6;//用到变量num时,再赋值

6.认识数据类型

int为Java的关键字,代表基本数据类型——整型(Integer)。

除了整数类型之外,Java还提供有多种数据类型。Java的变量类型可以是整型(int)、长整型(long)、短整型(short)、浮点型(float)、双精度浮点型(double),或者字符型(char)和字符串型(String)等。

下列表介绍存储实数的类型及解释:

数据类型

解释

整型

整型是取值为不含小数的数据类型,包括byte类型、short类型、int类型及long类型,默认情况下为int类型,可用八进制、十进制及十六进制来表示。

浮点型

浮点型主要包括float型(单精度浮点型,占4个字节)和double型(双精度浮点型,占8个字节)。用来表示含有小数点的数据,必须声明为浮点型。在默认情况下,浮点数是double型的。如果需要将某个包括小数点的实数声明为单精度,则需要在该数值后加字母 ‘ F ’(或小写字母 ‘ f ’ )。

定义数据类型时,要注意两点:

(1)在定义变量后,对变量赋值时,赋值大小不能超过所定义变量的表示范围。

例如:给一个变量赋值为129,数据类型为byte类型,该值已经超出了byte类型(一个字节)所能表示的最大范围(-128~127)。

(2)在定义变量后,对变量赋值时,运算符( = )左右两边的类型要一致。

例如:float price = 12.5f;  //中规中矩的定义,一开始就保证“ = ”左右类型匹配

           float price = (float)12.5;  //一开始“ = ”右边不匹配,通过强制类型转换后,“ = ”左右类型匹配

7.认识运算符和表达式

计算机的英文为Computer,它存在的目的就是用来做计算(Compute)的。而要运算就要使用各种运算符。最简单的算术运算符是加(“ + ”)、减(“ - ”)、乘(“ * ”)、除(“ / ”)、取余(“ % ”)等。表达式则是由操作数与运算符所组成,操作数可以是常量、变量,甚至可以是方法。运算优先级和数学上的运算优先级相同。

8.认识类

Java程序是由类(class)所组成。类是一种用户自定义的类型就可以了,所有的Java程序都是由类组成的。

值得注意的是:由于Java程序是由类所组成,因此在一个完整的Java程序里,至少有一个类。在一个独立的源码程序里,只能有一个public类,却可以有许多non-public(非公有)类。若是在一个Java程序中没有一个类是public,那么对该Java程序的文件名就可以随意命名了。

Java提供了一系列的访问控制符来设置基于类(class)、变量(variable)、方法(method)构造方法(constructor)等不同等级的访问权限。Java的访问权限主要有4类:默认模式(default)、private(私有)、public(公有)和protected(保护)

9.输入与输出

在Java中,流(Stream)是一个重要的但很容易困惑的概念。输入/输出(I/O)是指程序与外部设备或其他计算机进行交互的操作。

流(stream)的概念最早源于UNIX操作系统中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现进程间的通信,或完成读写外围设备、外部文件之间的信息交互等。一个流必须有起源端和目的端,它们可以是计算机内存的某部分区域,也可以是某个磁盘文件,甚至可以是Internet上的某个URL。

为了便于理解,我们可以将Java中的流想象成一种“数据流通的管道”,文件和程序之间一旦有了数据请求,二者之间就会建立某种形式的连接,从而形成了一个数据流。

就如在真正的管道中,可以传输不同形态的东西,既可以是水,也可以是天然气。类似的,Java中的数据流也有不同的形式,既可以是基于二进制的字节流,也可以是基于某种编码方式(如Unicode、UTF-8等)的字节流。

流的方向是重要的,根据流的方向,流可大致分为两类:输入流和输出流。

当程序需要读取数据时,就会开启一个通向数据源的管道,程序可从该管道中提取数据,这种模式下的流称之为输入流。类似地,如果程序想要输出数据,也会建立一个通往输出目的地管道,一旦建立后,程序就可以经由此管道输出数据,这种模式的流称之为输出流。

为了方便一些频繁的设备交互,Java语言系统预定了3个可以直接使用的流对象,它们分别是:

流对象

简介

作用

Sysetem.in(标准输入)

通常代表键盘输入

System.in是个标准的输入流(InputStream)对象,它是用来连接控制台程序和键盘的输入。目前System.in并不经常用到,这是因为Java命令行应用程序主要是通过命令行参数或配置文件来传递数据的,对于图形用户界面(GUI)程序,则主要是用图形界面来接纳用户的键盘输入。

System.out(标准输出)

通常输出到终端显示器

System.out是打印输出流(PrintStream)对象,主要向控制台输出数据,这个对象经常会被面向控制台的程序使用到,它也被程序员用作调试输出的工具。

System.err(标准错误输出)

通常将错误信息输出到终端显示器

System.err也是打印输出流(PrintStearn)对象,除了其主要用于错误输出之外,它和System.out没有太大区别。

数据的输入、输出属于I/O操作部分,Java把处理输入/输出相关的类放在java.io包中,这个包不属于java.lang包,没有被默认加载,所以如果需要使用与I/O相关的类和对象时,需要报java.io显式的导入(import)到相应程序中。

例:在程序的第二行加入import java.io.*;  //导入Java中支持I/O类的包

其中的“ * ”是代表任何含义的通配符,它表示输入/输出(io)下所有模块。在Java中,“ . ” 表示对象与组件之间的所有关系,为了方便起见,可以直接用中文的“ 的 ”来代替。

我们可以直接读成“导入java “的” io包库下“的”所有模块”。

扩展:一个良好的程序需要有一定的容错机制,即不能因为程序成员的某个潜在的设计缺陷或用户可能的操作失误(如输入信息出错),而导致整个程序崩溃。因此,需要添加相应的代码来处理程序中异常(Exception)错误。而try-catch机制对于程序的健壮性(Robust)就非常重要了。

二、本文注意事项

1.注意Java源代码中的字符半角和全角之分

Java继承了C/C++的很多语法,其中一个语法就是每个语句(Statement)后加一个分号“ ; ”作为本语句的结束。

2.什么是字符的半角和全角

传统上,在西欧语系使用的计算机系统中,每一个字母或符号使用1个字节的空间,而1个字节由8比特(bit)组成,因此共有2^8=256个编码空间,这对西欧语系的字符足够用了;但是对于汉语、日语及韩语文字,由于其数量远远超过256个,故惯常使用2字节来储存1个字符,为了使字体看起来齐整,英文字母、数字及其他符号,也由原来只占1个字空间,改为用2个字的空间来显示,并用2个字节来储存。所以,中、日、韩等文字没有半角之说,统一为全角字符。相比起来,英文字母、数字及其他西欧符号用1个字节表示就是半角,用2个字节表示就是全角。

三、本文自我总结

青春还在,展望未来。加油,Java!