Java是有SUN公司开发的新一代编程语言,它可以用在各种不同的机器、操作系统的网络环境中进行开发。不论你使用哪种浏览器或者使用哪种操作系统(Windows、Unix等等),只要浏览器支持JAVA,你就可以看到生动的主页。JAVA正在逐步成为Internet应用的主要开发语言,它彻底改变了应用软件的开发模式,为迅速发展的信息世界增添了新的活力。所以作为Internet应用的开发技术人员不可不看JAVA,而JAVA程序不可不先从基础学起,这正是JAVA程序员必读:基础篇的用意。
本JAVA教程将讨论JAVA编程语言的基础知识。其中内容涉及以下几个方面:
1.面向对象编程概念
将教会你面向对象编程的核心概念,比如对象、消息、类和继续等等。本节教程最后将给出实例将这些概念编程代码实现。假如你对面向对象编程很熟悉了,你可以跳过本节日教程,直接进入第二节教程。
2.语言基础
本节教程讲述了传统的语言特性,其中包括变量、数据类型、运算符以及控制流程等等。
3.对象和简单数据对象
本节教程将介绍常规的创建和使用任何类型对象的原则。然后,本教程还描述了怎样使用数组、字符串以及数字对象,它们都通常被用于对象类型。最后,还将介绍怎样为输出格式化数据。
4.类和继续
描述了怎样编写从已经创建了的对象来编写类。
5.接口和包
界面和包是JAVA编程语言的特性,它帮助你组织和构造类以及跟其它类的关系。
6.编程中的一些共同的问题
解释了在学习JAVA语言过程中可以出现的问题的解决方法。
假如你以前从来没有使用面向对象语言,你需要在开始编写JAVA代码之前先理解这个概念。你需要理解什么是对象、什么是类、对象和类的关系怎样以及使用消息怎样在对象之间进行通讯。本教程的前面部分将描述面向对象编程的概念,而后面的教程将教你怎样将这个概念编成代码。
2.1什么是对象
对象是一些相关的变量和方法的软件集。软件对象经常用于模拟现实世界中我们身边的一些对象。对象是理解面向对象技术的要害。你在学习之前可以看看现实生活中的对象,比如狗、桌子、电视、自行车等等。你可以发现现实世界中的对象有两个共同特征:它们都有状态和行为。比如狗有自己的状态(比如名字、颜色、生育以及饥饿等等)和行为(比如摇尾巴等等)。同样自行车也有自己的状态(比如当前档位、两个轮子等等)和行为(比如刹车、加速、减速以及改变档位等等)。
而软件对象实际上是现实世界对象的造型,因为它同样有状态和行为。一个软件对象利用一个或者多个变量来维持它的状态。变量是由用户标识符来命名的数据项。软件对象用它的方法来执行它的行为。方法是跟对象有关联的函数(子程序)。
你可以利用软件对象来代表现实世界中的对象。你可能想用一个动画程序来代表现实世界中的狗,或者用可以控制电子自行车的程序来代表现实世界的自行车。同样你可以使用软件对象来造型抽象的概念,比如,事件是一个用在GUI窗口系统的公共对象,它可以代表用户按下鼠标按钮或者键盘上的按键的反应。
软件对象的状态和行为都可以用在对象中的变量和方法来表达。构造现实世界的自行车的软件对象要有指示自行车的当前状态的变量:速度为20mph,它的当前档位为第三档。这些变量就是我们熟知的实例变量,因为它们包含了用于非凡自行车对象的状态,并且在面向对象技术中,非凡的对象称为实例。
如图2所示,是作为软件对象的自行车造型。
2.2什么是消息
软件对象之间进行交互作用和通讯是利用消息的。
单一的一个对象通常不是很有用的。相反,一个对象通常是一个包含了许多其它对象的更大的程序或者应用程序。通过这些对象的交互作用,程序员可以获得高阶的功能以及更为复杂的行为。你的自行车假如不使用它的时候,它就是一堆铝合金和橡胶,它没有任何的活动。而只有当有其它的对象来和它交互的时候才是有用的。
软件对象与其它对象进行交互与通讯是利用发送给其它对象来实现的。当对象A想对象B来执行一个B中的方法,对象A就会消息给对象B。
有时候,接收的对象需要更多的信息就至于它可以正确知道该如何做。比如,当你想改变自行车的齿轮,你就必须指出哪个齿轮。这个信息是将信息作为参数来传递的。如图4所示的现实了一个信息由三个组件组成:
被寻址消息的对象(YourBicycle)
要执行方法的名字(changeGears)
这个方法需要的所有参数(lowerGear)
上面的三个组件对于接收方的对象执行相应的方法是给出了充分的信息。再也不需要其它的信息或者上下文了。
消息提供了两个重要的好处:
对象的行为是通过它的方法来表达的,因此消息传递支持所有在对象之间的可能的交互。
对象不需要在相同的进程或者相同的机器上来发送和接收消息给其它的对象
2.3什么是类
类实际上是对某种类型的对象定义变量和方法的原型。
在现实世界中,你经常看到相同类型的许多对象。比如 ,你的自行车只是现实世界中许多自行车的其中一辆。使用面向对象技术,我们可以说你的自行车是自行车对象类的一个实例。通常,自行车有一些状态(当前档位、两个轮子等等)以及行为(改变档位、刹车等等)。但是,每辆自行车的状态都是独立的并且跟其它自行车不同。
当厂家制造自行车的时候,厂商利用了自行车共有的特性来根据相同的蓝图制造许多自行车。假如制造一辆自行车就要产生一个新蓝图,那效率就太低了。
在面向对象软件中,同样地,可以让相同种类地许多对象来共有一些特性,比如矩形、雇员记录、视频夹等等。就象自行车制造商人,你可以利用相同种类的对象是相似的事实并且你可以为这些对象创建一个蓝图。对对象的软件蓝图叫做类。
自行车的类需要定义一些实例变量来包括当前档位、当前速度等等。这个类将为实例方法定义和提供实施方法,它答应骑车者改变档位、刹车以及改变脚踏板的节奏,
当你创建了自行车类以后,你可以从这个类创建任意个自行车对象。当你创建了一个类的实例后,系统将为这个对象和的实例变量分配内存。每个实例将给所有实例变量的副本定义在类中。
除了实例变量,类还要定义类的变量。类变量包含了被类所有实例共享的信息。比如,假设所有的自行车有相同的档位数。在本例子中,要定义一个实例变量来容纳档位数。每一个实例都会有变量的副本,但是在每一个实例中数值都是相同的。在这样的情况下,你可以定义一个类变量来包含档位数,这样所有的类的实例都共享这个变量。假如一个对象改变了变量,它就为改变那个类的所有对象。类同样可以定义类方法。你可以直接从类中调用类方法,然而你必须在特定的实例中调用实例方法
2.4实例和类成员
2.4.1理解实例和类成员
下面具体讨论一下实例和类成员,具体涉及变量和方法以及类变量和方法:
你这样声明一个成员变量,比如在类Myclass中有一个float型的aFloat:
class MyClass {
float aFloat;
}
这样你就声明一个实例变量。每次你创建一个类的实例的时候,系统就为实例创建了类的每一个实例变量的副本。你可以从对象中访问对象的实例变量。
实例变量跟类变量是不一样的,类变量示使用静态修改量来声明的。不管类创建了多少个实例,系统为每个类变量分配了类变量。系统为类变量分配的内存是在它第一次调用类的时候发生的。所有的实例共享了类的类变量的相同副本。你可以通过实例或者通过类本身来访问类变量。
它们的方法是类似的:你的类可以有实例方法和类方法。实例方法是对当前对象的实例变量进行操作的,而且访问类变量。另外一个方法,类方法不能访问定义在类中的实例变量,除非它们创建一个新的对象并通过对象来访问它们。同样,类方法可以在类中被调用,你不必需要一个实例来调用一个类方法。
缺省地,除非其它的成员被指定,一个定义在类中成员就是一个实例成员。这个在下面定义的类有一个实例变量,有一个整型的x,两个实例方法x和setX,它们设置其它对象以及查询x的数值。
class AnIntegerNamedX {
int x;
public int x() {
return x;
}
public void setX(int newX) {
x = newX;
}
}
每次你从一个类实例化一个新的对象,你可以得到每个类的实例变量的副本。这些副本都是跟新对象有关系的。因此,每次你从这个类实例化一个新的AnIntegerNamedX对象的时候,你得以得到跟新的AnIntegerNamedX对象有关的新副本。
一个类的所有实例共享一个实例方法的相同的实行;所有的AnIntegerNamedX实例都共享x和setX的相同执行。这里注重,两个方法x和setX是指对象的实例变量x。但是,你可能会问:假如所有AnIntergerNamedX共享x和setX的相同执行,会不会造成模棱两可的状态?答案当然是:不是。在实例方法中,实例变量的名字是指当前对象的实例变量,假如实例变量不是由一个方法参数来隐藏的。这样在x和setX中,x就等价于这个x,而不会造成混乱。
语言基础
我们先看看一个具体例子,给你们有个先入为主的感觉。以下是一个BasicsDemo程序,它的作用是从1加到10,并显示结果:
public class BasicsDemo {
public static void main(String[] args) {
int sum = 0;
for (int current = 1; current < = 10; current++) {
sum += current;
}
System.out.println("Sum = " + sum);
}
}
这个程序的输出为:
Sum = 55
从上面的例子中,我们可以看出即使是一个小的程序都要使用JAVA编程语言的许多传统特性,其中包括变量、操作符和流程控制语句。以上的代码可能看起来有点复杂,但是一旦你学习完本系列教程,你就会发觉它实际上很简单。本节教程将教给你一些JAVA编程语言的基础。
3.1.4 变量初始化
当地变量和成员变量可以利用一个赋值语句来初始化。变量的数据类型必须与赋给它的数值的数据类型相匹配。下面程序中的当地变量声明,其初始化如下:
// 整型
byte largestByte = Byte.MAX_VALUE;
short largestShort = Short.MAX_VALUE;
int largestInteger = Integer.MAX_VALUE;
long largestLong = Long.MAX_VALUE;
// 实数型
float largestFloat = Float.MAX_VALUE;
double largestDouble = Double.MAX_VALUE;
// 其它类型
char aChar = ’S’;
boolean aBoolean = true;
参数和异常处理参数不能利用这种方法来初始化。它的参数的数值只能通过来设置。
语言基础
3.1.5 final变量
你可以在任何作用域声明一个变量。Final变量的数值不能在初始化之后进行改变。这样的变量跟其它语言中的常量很相似。
为了声明一个final变量,你可以在类型之前的变量声明使用final要害字,比如:
final int aFinalVar = 0;
前面的语句声明了一个final变量并一起对它进行了初始化。假如你在后面还想给aFinalVar赋其它的值的话,就会导致一个编译错误。在必要的时候,你可以推迟对一个final本地变量进行初始化。你可以先定义,然后在之后再初始化,如下:
final int blankfinal;
. . .
blankfinal = 0;
已经声明了但是还没有初始化的final本地变量称为空白final。同时,一旦final本地变量被初始化,它就不能再设置了。并且之后的任何对blankfinal赋值的操作都将导致一个编译错误。
语言基础
3.1.5 变量的总结
当你声明了一个变量,你就显性地设置了变量的名字和数据类型。JAVA编程语言右两类的数据类型:原始和引用。原始数据的变量包含一个数值。以下这张表显示了所有的原始数据类型以及它们的大小和格式。
要害字
描述
大小/格式
整型
byte
字节长度整型
8位两个补码
Short
短整型
16位两个补码
int
整型
32位两个补码
long
长整型
64位两个补码
实数
Float
单精度浮点型
32位IEEE 754
Double
双精度浮点型
64位IEEE 754
其它类型
Char
单个字符
16位Unicode字符
boolean
布尔型数值(true或者false)
真或假
变量声明的位置隐含地设置了变量的作用域,它决定了代码的哪一部分可以通过变量名来调用这个变量。具体有以下四种类型的作用域:成员变量作用域、本地变量作用域、参数作用域以及异常处理参数作用域。
你可以使用赋值操作符(=)来在声明的地方对变量进行初始化。
你也可以将变量声明为final。Final变量的数值在初始化之后不能再被改变。
3.2 操作符
本节教程描述了怎执行各种操作,比如算术和赋值操作。
一个操作符利用一个、两个或者三个运算对象来执行了一个函数。只需要一个运算对象的操作符称为单元运算符。例如++是一个单元操作符,它是对运算对象自增1。需要两个运算对象的操作符号称为双元操纵符。比如等于号(=)就是一个双元操作符,它指定右边的运算对象给左边的运算对象。最后,三元操作符需要三个运算对象。JAVA编程语言有一个三元运算符?:,它是一个简要的if-else语句。
单元操作符支持前缀或者后缀记号。前缀记号是指操作符出现在它的运算对象之前,例如:
operator op //前缀记号
后缀记号是指运算对象出现在操作符之前,例如:
op operator //后缀记号
所有的双元操作符使用中缀记号,即操作符出现在两个运算对象的中间:
op1 operator op2 //中缀记号
三元操作符也是使用中缀记号,例如:
op1 ? op2 : op3 //中缀记号
操作除了执行一个操作,还返回一个数值。返回数值和它的类型依靠于操作符号和运算对象的类型。比如,算术操作符它完成基本的算术操作(加、减)并且返回数值作为算术操作的结果。由算术操作符返回的数据类型依靠于它的运算对象的类型:假如你对两个整型数相加,你就会得到一个整型数。
我们可以将操作符分成以下几类:
算术运算符
关系和条件运算符
移位和逻辑运算符
赋值运算符
其它的运算符
下面我们逐个介绍。
JAVA编程语言为所有的浮点型和整型数支持多种算术运算符。这些运算符为+(加)、-(减)、*(乘)、/(除)以及%(模)。
以下有一个例程,ArithmeticDemo,它定义了两个整型数和两个双精度的浮点数并且使用五种算术运算符来完成不同的运算操作。这个程序同时使用了+符号来连接字符串。程序如下:
public class ArithmeticDemo {
public static void main(String[] args) {
//定义几个数
int i = 37;
int j = 42;
double x = 27.475;
double y = 7.22;
System.out.println("变量数值...");
System.out.println(" i = " + i);
System.out.println(" j = " + j);
System.out.println(" x = " + x);
System.out.println(" y = " + y);
//加
System.out.println("加...");
System.out.println(" i + j = " + (i + j));
System.out.println(" x + y = " + (x + y));
//减
System.out.println("减...");
System.out.println(" i - j = " + (i - j));
System.out.println(" x - y = " + (x - y));
//乘
System.out.println("乘...");
System.out.println(" i * j = " + (i * j));
System.out.println(" x * y = " + (x * y));
//除
System.out.println("除...");
System.out.println(" i / j = " + (i / j));
System.out.println(" x / y = " + (x / y));
//从除法中求得余数
System.out.println("计算余数...");
System.out.println(" i % j = " + (i % j));
System.out.println(" x % y = " + (x % y));
//混合类型
System.out.println("混合类型...");
System.out.println(" j + y = " + (j + y));
System.out.println(" i * x = " + (i * x));
}
}
这个程序得输出为:
变量数值...
i = 37
j = 42
x = 27.475
y = 7.22
加...
i + j = 79
x + y = 34.695
减...
i - j = -5
x - y = 20.255
乘...
i * j = 1554
x * y = 198.37
除...
i / j = 0
x / y = 3.8054
计算余数...
i % j = 37
x % y = 5.815
混合类型...
j + y = 49.22
i * x = 1016.58