第1章从C 编程转到Java编程_第1页
第1章从C 编程转到Java编程_第2页
第1章从C 编程转到Java编程_第3页
第1章从C 编程转到Java编程_第4页
第1章从C 编程转到Java编程_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章

从C++编程转到Java编程

目标:

本章中,你将学习:

,Java概述

F7Java与C++的对比

*把C++代码转换为Java代码

Java概述

Java的历史

Java是由SunMicrosystems公司开发的面向对象的编程语言。Java语言是在C++语言的基础

上发展起来的,但和C++是两种不同的语言。Java语言的设计者模仿C++语言,使语言短小

而简单,而且易于在不同操作平台之间移植。

Java的创始者为SunMicrosystems公司的首席程序员JamesGosling。他和他的工作小组开始

创建一个控制电子电器的软件项目。因为其面向对象的特点,Gosling开始使用C++语言/

发此项目。但是他发现程序中出现的许多问题都是与C++语言的复杂性有关。例如,包括指

针错误和内存泄漏之类的程序错误。就在这个时候,Gosling决定创建一个新的语言以克服

C++语言中的问题。

Gosling喜欢C++语言的法本语法和面向对象的特点。因此,他设计的新语言以C++语言为

主线,但克服了C++的缺陷。结果产生了一个称为Oak的新的编程语言,后来被重新命名

为Java。

如今,Java被广泛应用于网络编程,它最大限度地利用了网络,也提供了大量的、丰富的类

库,以满足网络化、多线程、面向对象系统的需要,使程序员可以非常方便地创建自己的系

统。因此,学习Java语言,主要是学习使用Java类库。

Java程序

Java程序有两类:应用程序(application)和小应用程序(applet)(.

应用程序

应用程序是可在任何操作系统提示下执行的程序。单独的应用程序可以是基于窗口的应用程

序或基于控制台的应用程序。

■基于窗口的应用程序一般是图形用户界面,有一些操年平台,如MicrosoftWindows.

Macintosh、Motif和OS/2等。

■基于控制台的应用程序是基于字符的应用程序,没有图形用户界面。

单独的应用程序使用单机资源,它驻留在本地计算机的硬盘上。当需要执行此应用程序时,

把它从硬盘调入到内存中并执行。

小应用程序

小应用程序是在Web页面内执行的Java程序,它不是驻留在本地计算机的硬盘上,而必须

在网络上通过Web浏览器装入Web页时被调入和执行,常用的浏览器有:MicrosoftInternet

ExplorerxNetscapeNavigator和HotJava等。

小应用程序使用简单,但必须启动Inicrnei访问Web页面,它们驻留在远程计算机上,当本

地计算机需要执行小应用程序时,小应用程序从远程计算机装入本地计算机的内存中,通过

浏览器解释小应用程序,与本地计算机链接并执行。

Java的性质

Java是一个Internet编程语言

Web提供了来自世界上任何地方的计算机的可访问性,可用Java程序跨网络地访问数据,

不管其源平台是什么。

Java是安全的

跨Internet下载到计算机上的程序可能会带有病毒。由于Java在用户计算机上作了强类型检

查,对程序所作的任何变动都标识为错误,且程序不被执行。因此,Java是安全的。

Java是独立于语言的平台

Java编译器把Java代码编译成被JVM环境理解的中间字节代码。Java解释器或任何的Java

使能的Internet浏览器便可执行这些字节代码。

由于字节代码的编译过程和浏览器对它的解释,使Java程序可在不同的硬件和操作系统上执

行,只要求该系统有Java使能的Internet浏览器或解释器就行。

Java是高性能的语言

Java程序的执行速度用与C和C++之类的基于编译的语言相媲美。Java程序比其他基十解秸

的语言所编写的程序的执行速度要快,如Basic语言。

Java是简单的

Java是一种简单的编程语言,即使您没有任何Java基础也可很快学会它的使用。Java程序

员不必知道Java的内部功能。Java的语法类似于C++的语法,但Java不支持指针、多重继

承性、gol。语句及运算符重载。

使应用开发周期慢下来的C++缺陷已在Java中删去。例如,Java防止由于不合适的内存用

法而引起的错误,因为在Java中,程序员不必操纵内存。

Java的简单性还表现在其精简的系统,它力图使用最小的系统实现足够多的功能。其基木解

择器只有40KB左右,加上标准类库和线程的支持,也只有210KB左右。

Java与C++的对比

因为Java是在C++的基础上发展起来的,因此Java与C++有许多共同点。之所以有Java,

是由于C++的某些不适应性和复杂性,所以这二者又存在一些区别。Java是一个纯面向对象

语言,因为Java中每个语句都写在类内。C++中,main。方法总是写在类外,一些全局变量

和全局函数也是写在类外.

Java中,除了初等数据类型外,其他的数据类型都是对象,即使初等数据类型也可封装在类

内。Java与C++的对比如下。

数据类型

■Java中除了C++中有内数据类型外,还有如下两个附加的初等数据类型:

>byte数据类型,占有一个字节的内存空间,可存储整数。

>boolean数据类型,可存储两个布尔值(true或f"se)之一。

■Java省略了C++中有的pointers(指针)和structs(结构

■Java中,字符数据类型存储Unicode格式的字符,不像C++中为8位的ASCII格式。

Unicode可存储亚洲语言字母表的16位字符格式。

■Java中,数据类型有固定的大小,而不管所用的是什么操作系统。不像在C++中,对于

不同的操作系统和不同位数的计算机其数据类型有不同的大小。

Java的数据类型如表1-1所示。

表1-1Java的数据类型列表

数据类型大小范围

布尔型(boolean)Ibit布尔值(lure或false)

字符型(char)I6bit存放一个字符

有符号:T28~127即・2,~(27-1)

字节型(byte)8bi(

无符号:0~255

短整型(short)16bit-32768-32767即-2”~(2,5-1)

整型(int)32bit-231-231-1

长整型(long)Mbit-263-263-1

单精度浮点型(float)32bit-231-231-1

双精度浮点型(double)64bit-263-263-1

为了让没有C++基础的读者,更好地理解本书内容,将在第2章中详细讲述数据类型的相关

知识。

五算符和构造

Java中支持C++中所有的运算符。Java中诸如if...else、while和do...while构造的表达式都以

布尔值为其结果。switch构造和for循环都类似于C++中相应的构造。

本书将在第3章中详细讲述运算符的相关内容。

继承性

Java不支持多重继承,这意味着不可继承一个以上的类,但是可以通过接口来实现。

Java中所有的类都是从Object类派生出来的。

为继承一个类,要使用extends关键字。例如,由Book类派生出TextBook类。

在C++中代码如下:

classTextBook:publicBook

〃类体

);

在Java中代码如下:

classTextBookextendsBook

〃类体

Pi注意

'史)J1在C++中类以分号(;)结束,否则编译器会报错。在Java中类后面没有分号(;)o若

L」有分号,编译器也可以通过。

方法和方法重载

在C++中,为了兼容C,可以有独立的函数。因此C++是在面向过程的编程语言基础匕地

加了面向时象的机制。

Java是一个纯面向对象的编程语言,在类之外不允许有任何语句(包括函数);在Java中,

在类中的函数称为方法,Java允许方法(函数)重载,但不支持C++中的运算符重载。

数组和String对象

C++中的数组是元素的集合,而Java中的数组是实在的对象,因为可用new运算符分配内存

给数组。

Java中需检查数组访问以珊保其下标落在数组的范围内。语法如下:

〈数据类型>口<数组名〉;

(数据类型><数组名>[];

上面给出的第一个语法是Java,卜惯用的。声明数组之后,就必须为它分配内存。

数组长度存储在变量length中,该变量是length所有数组的一个成员变量。

Java中数组用法举例如下:

/•程序J01_:Java中数组的用法•/

publicclassJ01_Array

(

int[JmarksEnglish〃声明整型数组

int[]marksHistory={70,80,90);〃声明同时初始化

String[]subjects;〃声明串对象数组

publicJ01_Array()//声明构造函数

(

marksEnglish=newint[3];〃创建包含3个整型数据数组

marksEnglish[0]=30;

marksEnglish[1]=40;

marksEnglish[2]=50;

subjects=newString[2];〃创建包含2个串对象的数组

subjects[O]=newString("English");

subjects[1]=newString("History");

)

}

Java中,串String是一个实在的对象,而不像C++那样是一个以空为终结的字符数组。因为

String是一个实在的对象,它与C++中的串相比有以下两个主要优点:

■Java中,Suing对象是致的。获取申和访问申的方式对所有系统都是数的,它们有

良好定义的编程接口。

■Java中,Siring对象是可靠的,它们不会引起程序中的内存泄漏。

main。方法

Java中不支持单独的方法,包括main()方法在内,所有函数方法都在类声明中定义。

Java中main。方法的用法如下:

/'程序J02_:Java中main。方法的用法*/

publicclassJ02Welcome

publicstaticvoidmain(String[]args)

.printing欢迎来到Java世界!*")

printin

}

■Java中main。方法和它所在的类应声明为public,因为Java运行环境必须访问main。方

法以执行程序。

■main。方法应声明为static,因为此类的任何对象在创建前必须存在。

■其命令行参数是String类型数组变量main(String(]ai?s)o参数的个数由String类对象

确定。

■文件名必须和main。方法所在的公共类名相同。

类、对象和方法

在C++中,包含沁stream类,该类封装了cout对象,用于在屏幕上显示数据,cin对象用于

接受健盘输入。

在Java1|J,包含System类,该类封装了PrintStream类的out对象和InputStream类的in对

象。out对象和标准输出设备(显示器)相连,in对象标准和输入设备(键盘)相连。

■System类,Java使用了所有系统资源,如在System类帮助下的显示输出和接受键投输

入。此类包含处理系统资源所需的所有方法。

■out对象,是封装在System类中的一个PrintStream类对象,表示标准的输出设备(显

示器示

■println(Stringx)方法,PrintStream类println(Slringx)方法用于在屏幕上显示一个字符串。

例如:

.printinC*欢迎来到Java世界!*");

■in对象,是封装在System类中的一个InputStreani类对象,表示标准的输入设备

(键盘"

■InputStreani类,是一个抽象类,但不能创建该类的对象,而只能用于继承。

■InputStreamReader类,是抽象类Reader类的子类,它的构造符以InputStream类对象为

参数,将字节流包装成Unicode字符流。例如:

newInputStreamReaderO;

■BufferedReader类,是抽象类Reader类的另,个子类,它的构造符以Reader所有子类对

象为参数,将Unicode字符流包装成缓冲流,使输入速度更快。例如:

BufferedReaderinObj=newBufferedReader(newInputStreamReaderO);

■readLine。方法,每次从输入流中读取一行数据,返回一个字符串。例如:

StringsName=ine();

因为Java使用System类以便与显示器和址盘设备接II,炉以用.prinlln。替代C++中ucoul对

象。用(newBufferedReader(newInputStreaniReader()))对象的readLine()方法替代C++中的

cin对象。

[6]六内容,初学者只需简单了解…详细内容将在第叱中讲述。

LJ

■Number类,是一个抽象类,其子类包含各种基本数据类型的相关类,如下:

ClassNumber

QMect

I

+.Number

AllImplementedInterfaces:

Serializable

DirectKnownSubclasses:

BigDecimuLBiglntcger.Byte.Double.Float.Integer.Long.Short

各个类对应的parscXXX(5trings)方法可以将字符串转换为相对应的各种数据类型。该方法是

抽象方法,可以用类名直接调用该方法。例如:

Stringstr1="123";//123是一个字符串

intiNum1=parselnt(strl)//iNum1=123,整型

Stringstr2="100.5";00.5是一个字符串

floatfNum2=parseFloatistr2);//iNum2=100.5,浮点型

执行Java程序

■称为Java虚拟机JVM的程序执行Java程序。JVM包含运行环境和类加载器。因此要运

行Java程序必须先安装Java虚拟机(JVM)。

■必须保存以*.java为扩展名的Java源文件。该文件名应与包含main。方法的公共类名一

样。当编译*.java文件时,便创建了”.class文件。

■为了编译java文件,应使用java实用程序编译成*.class文件。

■为了执行java程序,应使用java实用程序执行该*.class文件。

为了编译和执行上面有公共类J02_Wclcome类的J02—文件,应按以下步骤操作:

1.在C盘根目录保存Java文件为J02-

2.启动DOS窗口(选择“开始运行”命令,执行cmd命令)。

3.在命令提示处,输入javacJ02_命令,按回车键。

4.在此命令提示处,输入javaJ02_Welcome命令,按I可车键。

5.编译、执行程序及输出结果如图1-1所示。

快片方Kcmd.cKe

crosoftUScdos200A(UersionS.AA.219S)

>版权所有1985-1998HicrotoflCorp.

C:\?jAvacJBZ.Weleone.Java

C:\>J*vaJA2_UelcoM:

・欢迎来到Jw世界,

图1-1程序」。2_输出结果

注意:即使安装了Java虚拟机(JVM),也可能无法运行Java程序,因为还需进一步设置系

统特性。如下:

I.右击“我的电脑”,从打开的右键菜单中选择“属性”,打开“系统特性”对话框,选择

“高级”选项卡,如图1-2所示。

2.在“高级”选项卞中:单击“环境变量”按钮。打开“环境变量”对话框,如图1-3

所示。

3.在“系统变量”列表框中,选择Path变量,然后单击“编辑”按钮。在变量值编辑框

中,添加java虚拟机的安装路径,如C:\j2sdkl4,如图1-4所示。

Java包

Java使用包来组织相关的类。通过使用import语句,可在程序中使用Java包。这有点类似

于C++的include语句,包含头文件。差别是Java的包中只包含类,而C++的头文件中可包

含独立的方法。另一个区别是,包有类似于目录结构的层次结构。

图i-2“系统特性”对话框的“高级”选项卡图1-3“环境变量”对话框

图1Y编辑系统变量

语法:

importv包名〉〃包含包中的所有类

import<包名〉.〈类名〉;〃包含包中的指定类

例子:

import〃包含包中的所有类

import.JButton;〃包含包的JButton类

在上面的代码中,包的名后接星号(*)或包中类的名,以点(.)分隔元素,这个惯例描述

/在创建这些内部Java包时所遵循的层次结构。

为了指出某个类是包的成员,应使用package关键字。例如,为了产生mypackage包的一个

类成员Cusiomcr,语句如下:

packagemypackage;〃定义一个包mypackage

classCustomer〃包mypackage包含Customer类

〃类代码

此包语句必须是import语句之后文件的第•个语句。如果没有指出包名,则此类变成了默认

包的一个成员。

访问区分符

Java有4种访问区分符:privateprotectedpublic及friendlyo默认的访问区分符是

friendlyo但不必使用friendly,因为它不是关键字,而是表示此默认区分符的一个口语的术

语。在C++中,默认的访问区分符是private,可以省略此关键字,也可以使用此关键字使程

序更清晰。

Java和C++的另一个区别是,C++中可以使用访问区分符分组声明属性和方法,而Java中的

每个声明应必须指出访问区分符。例如,以下为C++代码:

classEmployee〃声明一个类Employee

(

private:〃声明私有成员变量

charcName[20];

intiAge;

floatfSalary;

public:〃声明公共成员函数

voidAcceptf);〃声明Accept。成员函数原型

voidDisplayO;〃声明Display。成员函数原型

);

以上代码中,cName[20]、iAge、fSalary都是私有(private)的成员变量(属性),

Accept。、Display。都是公共(public)的成员函数(方法),

而Java代码如下:

classEmployee〃声明一个类Employee

(

〃声明3个私有成员变量

privatecharcName[20];

privateintiAge;

privatefloatfSalary;

〃声明2个公共成员函数

publicvoidAccep1();〃声明Accept。成员函数原型

publicvoidDisplayO;〃声明DisplayO成员函数原型

抽象类和接口

与C++中virtual类等价的是Java中的abstract类。在C++中包含虚函数的类称为虚基类,用

virtual关键字。虚基类只能用于继承,而不可创建虚基类的对象。虚函数是只有函数原型而

没有函数体的函数,该函数必须在维承类中重定义。例如,定义•个抽象类一职员类,经理

类、工人类、临时工类3个类是职员类的子类,在职员类中有方法SalaryO,而经理、工

人、临时工计算工资的方法是不问的,因此必须在经理类、工人类、临时工类3个类中重写

Salary。方法。在Java中使用abstract关键字来指出类和方法是抽象的。例如:

abstractclassv类名〉

publicabstract〈返回类型〉<方法名〉〈(参数列表)〉

}

接I」其实就是包含一组抽象方法的抽象类。Java中不支持多重继承,但可以实现多个接口。

例如:

interface〈接口名〉

publicabstract〈返回类型〉〈方法名〉〈(参数列表)》

为继承接口,需使用implemenls关键字。例如,下面是继承Book类和实现Aulhor接口的子

类TexiBook的例子:

classTextBookextends3ookimplementsAuthor

〃类体

}

抽象类用来实现属于同一层次类之间的继承关系。接口可用来实现不属丁•同一层次不相关类

之间的继承关系。例如:

packageMyPackage;

abstractclassCustomer〃定义类Customer

(

abstractStringgetName();

);

publicinterfaceAccount〃定义接口Account

(

publicfloatgetBalance();

);

publicinterfaceDebit〃定义接口Debit

publicvoiddeduclAmount(floatamt);

};

publicinterfaceCredit〃定义接口Credit

publicvoidaddAmount(floatamt);

};

publicclassCustomerAccountextendsCustomerimplementsAccountDebitCredit

(

publicStringgetNamef)

(

〃重写抽象类Customer的方法qetNameO

)

publicfloatgetBalance()

〃重写接口Account的方法getBalance()

}

publicvoiddeduc1Amount(floatamt)

(

〃重写接口Account的方法deductAmount(floatamt)

)

publicvoidaddAmount(floatamt)

(

"重写接口Account的方法addAmount(floatamt)

}

};

定义了这些接口之后,就可以在任何类中实现这些接口。

无用信息收集

C++中用new分配内存。内存使用完成后,必须用delete释放内存。否则会造成内存的大量

浪费(内存泄漏),直至系统崩溃。

Java中用new运算符把内存分配给对象或数组,但不能通过代码显式地释放内存。无用信息

收集是自动地释放那些不再使用对象内存的过程.

当程序停止对对象的引用时,对象不再需要就可准备收集无用信息了。此对象使用的内存空

间被释放,可为另•对象所使用。在C、C++、Pascal语言中,程序员必须通过代码显式地

释放被分配给对象的内存。由于程序员忘记了释放已分配的内存,或释放了还在使用的对象

内存,就会发生严重的问题。

无用信息收集使程序员摆脱了释放已分配内存的负担。无用信息收集器确定程序中不再被引

用的对象,从而释放分配给它们的内存。

把C++代码转换为Java代码

下面是用C++语言编写的段程序代码,用丁从键盘接受职员数据信息,并将信息显示在屏

幕上。将这段C++代码修改为Java代码,并调试、运行。

C++语言程序代码如下:

「程序J03_:使用C++面向对象编程方法•/

#lnclude<iostream.h>〃包含头文件

classEmployee〃声明一个类Employee

Private:〃声明私有成员变量

charcName[20];

intiAge;

floatfSalary;

public:〃声明公共成员函数

voidEmployee{);〃声明Accept。成员函数原型

voidDisplayO;//声明Display。成员函数原型

);

intmain()〃main。函数,程序的入口和出口

EmployeeTom;〃用Employee声明一个类成员Tom

ay();〃类成员使用点运算符访问成员函数

return0;

Employee::Employee()〃使用作用域分解运算符“::"定义构造符函数

8Ut«"请输入职员的姓名:

cin»cName;

coutvv”请输入职员的年龄:

cin»iAge;

cout«”请输入职员的月薪:

cin»fSalary;

voidEmployee::DisplayO〃使用作用域分解运算符定义Display。函数

cout«"\n.........显示个人信息....."«endl;

cout«"\n职员的名字是:"«cNamp«endl;

8utvv"职员的年龄是:"vviAgevvendl;

cout<〈"职员的月薪是:"<<fSalary«endl;

)

修改后的Java语言程序代码如下:

〃程序J04_:使用Java面向对象编程方法7

import〃包含头文件

classEmployee〃声明一个类Employee

privateStringsName;〃声明私有成员变量

privateintiAge;

privatefloat(Salary;

publicEmployee()〃声明公共成员函数

try

BufferedReaderinObj=newBufferedReader

(newInputStreamReaderO);

.println("请输入职员的姓名:");

sName=ine();

.println("请输入职员的年龄:”);

iAge=lnt:ine());

println("清给入职员的月薪:");

fSalary==loat(ine());

0;

}catch(Exceptione)

.println(e);

)

)

publicvoidDisplayO〃声明公共成员函数

(

.printlnf•…•…显示职员信息………);

.prinUn("职员的名字是:\t"+sName);

.println("职员的年龄是:\t"+iAge);

.prinUn("职员的月薪是:\t"+fSalary);

)

)

publicclassJ04_Empl

(

publicstaticvoidmain(Stringargs。)

(

Employeelbn=newEmployee();〃用Employee声明一个类成员Tom

ay();〃类成员使用点运算符访问成员函数

保存、编译和运行Java程序

我们知道,保存一个文件分为文件名和扩展名(后缀),Java源代码文件的后缀为.java。例

如,将文件保存为:J04_o

启动DOS窗口,在提示符之下运行命令javacJ04,,把JD4—文件编译为J04_文件,然后在

DOS提示符之下运行命令javaJ04_Empl,如图1-5所示。

图1-5运行104_程序结果

Java程序的成分

在前面修改后的Java程序中,包含了许多Java知识点,克•初学Java的人员来说不可能一下

子看懂。这些内容将在以后的章节中讲到,在此只需作一般了解即可,并能照猫画虎地

使用。

■由于在程序中用到了许多关于Java输入输出流方面的类,这些类在包中,因此,在程序

的开头使用import产;溶句插入包中所有的类。

■在Java中,类的每一个成员变量(属性)和成员函数(方法)都要声明访问区分符,若

没有则默认为friendly。

■所有字符数组改为String对象,因为Java中的字符数组说明为String类的对象。

■out是封装在System类的一个PrintStream类对象,表示标准的输出设备(显示器),因

此用访问该对象.

■PrintStream类println(Stringx)方法用于在屏幕上显示一个字符串,因此使用语

句中而1N(,乂*")在屏幕上显示一个字符串“XXX”。

■in是封装在System类的一个InputStream类对象,表示标注的输入设备(键盘),因此用

访问该对象。

■InputStreamReader类是抽象类Reader类(字符类)的子类,该类的构造符以

InputSlream类(字节类)对象为参数,将字节流包装成Unicode字符流。例如:

newInputStreamReaderO;

■BufferedReader类是抽象类Reader类的另一个子类,该类的构造符以Reader所有子类对

象为参数,符Unicode字符流包装成缓冲流,使输入速度更快。例如:

BufferedReaderinObj=newBufferedReader(newInpulStreamReader());

■BufferedReader类的readLine()方法每次从输入流中读取一行数据,返回一个字符串。

例如:

StringsName=ine();

■parseInt(Strings)和parseFloai(Slrings)是Integer与Float类中的静态方法,将字符串转换

为整型和浮点型,可用类名直接访问这些静态方法。

■try{...}catch(Exceptione){…}为异常结构,将可能出现异常的语句放在iry后面的程序块

中((…}),如果出现异常并产生异常对象,则程序跳出程序块执行catch后面的程序块

中的语句。由于输入/输出口可能产生异常,所以必须处理异常。

■Java是纯面向对象语言,所有代码,包括main()方法全部包含在类中。在前面的程序

中,将main。方法放在一个单独类中,包含

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论