没有合适的资源?快使用搜索试试~ 我知道了~
首页Java起源与革新:驱动编程语言发展的关键
Java起源与革新:驱动编程语言发展的关键
需积分: 9 3 下载量 49 浏览量
更新于2024-07-09
收藏 2.95MB PDF 举报
Java基础电子书深入探讨了Java语言的历史渊源和核心价值。该书以第1章为核心,首先讲述了Java的起源,指出Java与C++的紧密关系,C++作为C语言的衍生,Java继承了C语言的语法和C++的面向对象特性。这一章节强调了Java语言的产生是由于适应不断变化的技术需求和编程艺术的提升,尤其是在解决当时计算机语言无法满足的问题上。 C语言的诞生是现代编程语言发展的一个里程碑,它的高效性和结构化特点使得编程方法发生了革命性转变。然而,C语言也有其局限性,比如在易用性、安全性和稳定性上的不足。这促使了后续语言的进化,如BASIC虽然易学但功能有限,FORTRAN虽在科学计算上高效但不适合系统程序开发。Java就是在这样的背景下诞生的,它试图平衡易用性、功能、安全性、稳定性和可扩展性,以提供一种既强大又易于理解的编程语言。 1.1.1节详细介绍了Java的产生过程,包括关键的驱动因素,如对C和C++特性的吸收,以及与计算机语言演进历史的紧密联系。每次语言设计的革新都源于旧语言无法满足新环境的需求,Java也不例外。书中会逐步揭示Java如何通过革新设计,如垃圾回收机制、跨平台能力等,来解决这些问题,使之成为互联网时代不可或缺的编程语言。 这本书将带领读者深入了解Java语言的诞生背景、发展路径,以及其在适应变化和技术进步中的核心角色。在接下来的章节中,还将详细剖析Java的语法、库和应用程序,旨在为读者提供全面的Java学习指南。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/20218597/bg10.jpg)
16 第 1 部分 Java 语言
私家轿车,或是保时捷汽车,或是家庭汽车,司机差不多都能找到方向盘、制动闸和加速
器,并知道如何操作。经过一段驾驶,大多数人甚至能知道手动档与自动档之间的差别,
因为他们从根本上理解这两个档的超类——传动。
人们在汽车上看见的总是封装好的特性。刹车和踏脚板隐蔽着不可思议的复杂性,但
接口却是如此简单,你的脚就可以操作它们!引擎、制动闸及轮胎的大小对于你如何定义
踏脚板类的接口没有任何影响。
最后的属性,多态性,在汽车制造商基于相同的交通工具所提供的多种选择的能力上
得到了充分反映。例如,刹车系统有正锁和反锁之分,方向盘有带助力或不带助力之分,
引擎有4缸、6缸或8缸之分。无论设置如何,你都得脚踩刹车板来停车,转动方向盘来转向,
按离合器来制动。同样的接口能被用来控制许多不同的实现过程。
正如你所看到的,通过封装、继承及多态性原理,各个独立部分组成了汽车这个对象。
这在计算机程序设计中也是一样的。通过面向对象原则的使用,可以把程序的各个复杂部
分组合成一个一致的、健壮的、可维护的程序整体。
正如本节开始时提到的,所有的Java程序都是面向对象的。或者,更精确地说,每个
Java程序都具有封装性、继承性及多态性。尽管在本章将要介绍的简单示例程序及以后几
章的示例程序中并未体现所有这些特性,但也有所体现。你将看到,Java提供的许多特性
是它的内置类库的一部分,这个库使封装性、继承性及多态性得到更广泛应用。
2.2 第1个简单程序
既然Java面向对象的基础已经被讨论过了,接下来让我们看一些实际的Java程序。让我
们从编译及运行下面这个简短示例程序开始。你将看到,这个程序的功能比你想像的要多。
/*
This is a simple Java program.
Call this file "Example.java".
*/
class Example {
// Your program begins with a call to main().
public static void main(String args[]) {
System.out.println("This is a simple Java program.");
}
}
注意:在下面的介绍中,将使用标准JDK(Java Developer’s Kit,Java 开发工具
包),它可从Sun Microsystems公司得到。如果你正在使用其他的Java开发环境,
则Java程序编译、运行过程可能有所不同。在这种情况下,请你查阅编译器的用户
手册来获得具体指导。
2.2.1 键入程序
对大多数计算机语言,包含程序源代码的文件名是任意的,但对于Java就不行。关于
Java,你需要知道的第一件事就是源文件的名字非常重要。对这个例子,源程序文件名应
![](https://csdnimg.cn/release/download_crawler_static/20218597/bg11.jpg)
第 2 章 Java 语言概述 17
该是Example.java。下面我们将解释其中的原因。
在Java中,一个源程序文件被称为一个编译单元(compilation unit)。它是一个包含一
个或多个类定义的文本文件。Java编译器要求源程序文件使用.java文件扩展名。请注意,
文件扩展名长度是4个字符。所以,你的操作系统一定要有支持长文件名的能力。这意味着
DOS和Windows 3.1是不支持Java的(至少在目前是这样)。当然,它可在Windows 95/98和
Windows NT/2000下正常工作。
从上述示例程序中可以看出,程序中定义的类名也是Example。这不是巧合。在Java中,
所有的代码都必须驻留在类中。按照约定,类名必须与源程序的文件名相同。你也应该确
保文件名的大小写字母与类名一样,这是因为Java是区分大小写的。虽然文件名与类名必
须一致的约定似乎有点专制,但是这个约定有助于你轻松地维护及组织程序。
2.2.2 编译程序
要编译示例程序Example,须运行编译器程序javac,并在命令行上指定源程序文件名,
格式如下所示:
C:\>javac Example.java
编译器javac产生了一个名为Example.class的文件,该文件包含程序的字节码。前面已
讨论过,Java字节码中包含的是Java解释程序将要执行的指令码。因此,javac的输出并不
是可以直接运行的代码。
要真正运行该程序,你必须使用名叫java的Java解释器。具体做法是把类名Example作
为一个命令行参数输入,格式如下所示:
C:\>java Example
运行这个程序,将输出如下内容:
This is a simple Java program.
当Java源代码被编译后,每个单独的类都被放入自己的输出文件中,并以类的名字加
“.class”扩展名为其文件名。这就是为什么Java源程序文件必须与其中包含的类同名的原
因——源程序文件将与“.class”文件相同。运行Java解释器实际上是指定你想要解释器运
行的类的名字,它会自动搜索包含该名字且带有.class扩展名的文件。如果找到,它将运行
包含在该指定类中的代码。
2.2.3 详细讨论第1个示例程序
尽管Example.java很短,但它包括了所有Java程序具有的几个关键特性。让我们仔细分
析该程序的每个部分。
程序开始于以下几行:
/*
This is a simple Java program.
Call this file "Example.java".
*/
![](https://csdnimg.cn/release/download_crawler_static/20218597/bg12.jpg)
18 第 1 部分 Java 语言
这是一段注释(comment)。像大多数其他的编程语言一样,Java也允许你在源程序文
件中加注释。注释中的内容将被编译器忽略。事实上,注释是为了给任何阅读源代码程序
的人说明或解释程序的操作。在本例中,注释对程序进行说明,并提醒你该源程序的名字
叫做Example.java。当然,在真正的应用中,注释通常用来解释程序的某些部分如何工作或
某部分的特殊功能。
Java支持3种类型的注释。在示例程序顶部的注释称为多行注释(multiline comment)。
这类注释开始于“/*”,结束于“*/”。这两个注释符间的任何内容都将被编译器忽略。正
如“多行注释”名字所示,一个多行注释可以包含若干行文字。
程序的下一行代码如下所示:
class Example {
该行使用关键字class声明了一个新类,Example是类名标识符,整个类定义(包括其所
有成员)都将位于一对花括号({})之间,花括号在Java中的使用方式与C或C++相同,目
前,不必考虑类的细节,只是有一点要注意,在Java中,所有程序活动都发生在类内,这
就是为什么Java程序是面向对象的。
下面一行程序是单行注释:
// Your program begins with a call to main().
这是Java支持的第二种类型的注释。单行注释(single-line comment)始于“//”,在该
行的末尾结束。通常情况下,程序员们对于较长的注释使用多行注释,而对于简短的、一
行一行的注释则使用单行注释。
下一行代码如下所示:
public static void main(String args[]) {
该行开始于main( )方法。正如它前面的注释所说,这是程序将要开始执行的第一行。
所有的Java应用程序都通过调用main( )开始执行(这一点同C/C++一样),我们在此还不能
对该行的每一个部分作出精确的解释,因为这需要详细了解Java封装性的特点,但是,由
于本书第1部分中的大多数例子都用到这一行代码,我们将对各部分作一个简单介绍。
关键字public是一个访问说明符(access specifier),它允许程序员控制类成员的可见
性。如果一个类成员前面有public,则说明该成员能够被声明它的类之外的代码访问(与
public相对的是private,它禁止成员被所属类之外的代码访问)。在本例中,main( )必须被
定义为public类型,因为当程序开始执行时它需要被它的类之外的代码调用。关键字static
允许调用main( )而不必先实现该类的一个特殊实例。这是必要的,因为在任何对象被创建
之前,Java解释器都会调用main()。关键字void仅通知编译器main()不返回任何值。你将看
到,方法也可以有返回值。如果这一切似乎有一点令人费解,别担心。所有这些概念都将
在随后的章节中详细讨论。
前面已经介绍过,main()是Java程序开始时调用的方法。请记住,Java是区分大小写的。
因此,main与Main是不同的。Java编译器也可以编译不包含main()方法的类,但是Java解释
程序没有办法运行这些类。因此,如果你输入了Main而不是main,编译器仍将编译你的程
序,但Java解释程序将报告一个错误,因为它找不到main()方法。
![](https://csdnimg.cn/release/download_crawler_static/20218597/bg13.jpg)
第 2 章 Java 语言概述 19
你要传递给方法的所有信息由方法名后面括号中指定的变量接收,这些变量被称为参
数(parameters)。即使一个方法不需要参数,你仍然需要在方法名后面放置一对空括号。
在main()中,只有一个参数,即String args[],它声明了一个叫做args的参数,该参数是String
类的一个实例数组(注:数组是简单对象的集合)。字符串类型的对象存储字符的串。在
本例中,args接收程序运行时显示的任何命令行参数。本例中的这个程序并没有使用这些
信息,但是本书后面讲到的其他一些程序将使用它们。
该行的最后一个字符是“{”。它表示了main()程序体的开始。一个方法中包含的所有
代码都将包括在这对花括号中间。
另外,main( )仅是解释器开始工作的地方。一个复杂的程序可能包含几十个类,但这
些类仅需要一个main( )方法以供解释器开始工作。当你开始引用被嵌入在浏览器中的Java
小应用程序时,你根本不用使用main( )方法,因为Web浏览器使用另一种不同的方法启动
小应用程序。
接下来的代码行如下所示。请注意,它出现在main( )内。
System.out.println("This is a simple Java program.");
本行在屏幕上输出字符串“This is a simple Java program.”,输出结果后面带一个空行。
输出实际上是由内置方法 println ( )来实现的。在本例中,println ( )显示传递给它的字符串。
你将会看到,println ( )方法也能用来显示其他类型的信息。该行代码开始于System.out,现
在对它作详细说明为时尚早,需涉及很多复杂内容。简单的说,System是一个预定义的可
访问系统的类,out是连接到控制台的输出流。
可能你已经猜到了,控制台输出(输入)在实际的Java程序和小应用程序中并不经常
使用。因为绝大多数现代计算环境从本质上讲都是窗口和图形界面的,控制台I/O主要被用
简单的实用工具程序和演示程序使用。在本书后面,你将会学到用Java生成输出的其他方
法。但是目前,我们将继续使用控制台I/O方法。
请注意,println( )语句以一个分号结束。在Java中,所有的语句都以一个分号结束。该
程序的其他行没有以分号结束,这是因为从技术上讲,它们并不是程序语句。
程序中的第一个“}”号结束了main( ),而最后一个“}”号结束类Example的定义。
2.3 第2个示例程序
对于编程语言来说,变量是一个最为基本的概念。你可能知道,变量是一个有名字的
内存位置,它能够被赋值。而且,在程序的运行过程中,变量的值是可以改变的。下一个
程序将介绍如何声明变量,如何给变量赋值。另外,该程序也说明了控制台输出的某些新
特点。从程序开始的注释可以看出,你应该把这个文件命名为Example2.java。
/*
Here is another short example.
Call this file "Example2.java".
*/
class Example2 {
public static void main(String args[]) {
![](https://csdnimg.cn/release/download_crawler_static/20218597/bg14.jpg)
20 第 1 部分 Java 语言
int num; // this declares a variable called num
num = 100; // this assigns num the value 100
System.out.println("This is num: " + num);
num = num * 2;
System.out.print("The value of num * 2 is ");
System.out.println(num);
}
}
运行该程序时,你将会看到如下的运行结果:
This is num: 100
The value of num * 2 is 200
让我们来进一步查看这个结果是如何产生的。我们重点考虑与前一示例不同的代码,
在上一个程序中未出现的第一行代码是:
int num; // this declares a variable called num
该行声明了一个名为num的整型变量。和其他大多数语言一样,在Java中一定要先声明
变量,然后再使用变量。
下面是声明变量的一般形式:
type var-name;
在这里,type表示所要声明的变量的类型,var-name是所要声明变量的名称。如果你要
声明多个属于同一类型的变量,只需用逗号将各个变量名分开即可。Java定义了几种数据
类型:整型(integer),字符型(character),浮点型(floating-point)。关键字int指的是
整数类型。
在程序中,下面这一行代码将100赋予变量num。
num = 100; // this assigns num the value 100
在Java中,赋值符号是等号。
下面的这行程序在输出变量值之前,先输出字符串“This is num:”。
System.out.println("This is num: " + num);
在这个语句中,变量num之前的加号“+”的作用是,让num的取值与它前面的字符串
相连接,然后再输出结果字符串的内容(实际上,变量num先被它赋值再超值转换成字符
串,然后再和加号之前的字符串相连接。这个过程将在本书的后面详细讨论)。这种方法
可以被推广。通过加号“+”的连接操作,你可以在println()这个方法之内将尽可能多的
字符串内容连在一起。
接下来的语句行将变量num乘2以后的结果重新赋值给变量num。和其他大多数语言一
样,Java用“*”符号来表示乘法运算。在执行这行语句之后,变量num的值变成了200。
本程序接下来的两行代码是:
剩余749页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/cd0d7e1f17114491ac0acbc348ef73c9_weixin_41768021.jpg!1)
小司徒
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 多模态联合稀疏表示在视频目标跟踪中的应用
- Kubernetes资源管控与Gardener开源软件实践解析
- MPI集群监控与负载平衡策略
- 自动化PHP安全漏洞检测:静态代码分析与数据流方法
- 青苔数据CEO程永:技术生态与阿里云开放创新
- 制造业转型: HyperX引领企业上云策略
- 赵维五分享:航空工业电子采购上云实战与运维策略
- 单片机控制的LED点阵显示屏设计及其实现
- 驻云科技李俊涛:AI驱动的云上服务新趋势与挑战
- 6LoWPAN物联网边界路由器:设计与实现
- 猩便利工程师仲小玉:Terraform云资源管理最佳实践与团队协作
- 类差分度改进的互信息特征选择提升文本分类性能
- VERITAS与阿里云合作的混合云转型与数据保护方案
- 云制造中的生产线仿真模型设计与虚拟化研究
- 汪洋在PostgresChina2018分享:高可用 PostgreSQL 工具与架构设计
- 2018 PostgresChina大会:阿里云时空引擎Ganos在PostgreSQL中的创新应用与多模型存储
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)