Big-man的Java篇(一)
Java与Big-man的故事:
Java
是Sun
(Stanford Universiy Network)公司开发出来的一套编程语言,主设计者是James Gosling
,最早起源于一个叫Green
的项目。
Java
语音的特点:
Java
语言的许多有效的特性吸引着程序员们,下面介绍其中最主要的几个。
简洁有效:
Java
语言是一种相当简洁的”面向对象”程序设计语言,它省略了C++
语言中所有的难以理解、容易混淆的特性,如头文件、指针、结构、单元、运算符重载和虚拟基础类等,更加严谨、简洁。
可移植性:
- 对于一个程序员而言,写出来的程序如果不需要修改就能够同时在
Windows
、MacOS
、UNIX
等平台上运行,简直就是美梦成真,而Java
语言就让这个原本遥不可及的事已经越来越近了。使用Java
语言编写的程序,只要做较少的修改,甚至有时根本不需要修改即可在不同平台上运行。
面向对象:
- 可以这么说,“面向对象”是软件工程学的一次革命,大大提升了人类的软件开发能力,是一个伟大的进步,使软件发展的一个重大的里程碑。
- 在过去的30年间,“面向对象”有了长足的发展,充分体现了其自身的价值,到现在已经形成了一个包含“面向对象的系统分析”、“面向对象的系统设计”和“面向对象的程序设计”的完整体系。所以作为一种现代编程语言,是不能够偏离”面向对象”这一方向的,
Java
语言也不例外。
什么是面向对象 ?
前言:
- 计算机革命起源于机器,因此,编程语言的产生也是始于对机器的模仿。
- 但是,计算机并非只是机器那么简单。计算机是头脑延伸的工具(就像Steve Jobs常喜欢说的”头脑的自行车”一样),同时还是一种不同
类型
的表达媒体。 - 所以计算机这种工具确实是越来越不像机器了,而更像Big-man和小伙伴们头脑的一部分一样,以及一种如写作、绘画、雕刻、动画、电影等一样的表达形式。面向对象程序设计(O
bject oriented Programming
,OOP
)便是这种以计算机作为表达媒体的大趋势中的组成部分。
抽象过程:
- 面向对象的五大基本特性:
- 万物皆为对象。将对象视为奇特的变量,它可以存储数据,除此之外,还可以要求它在自身上执行操作。理论上讲,可以抽取待求解问题的任何概念化构件(狗、建筑物、服务等),将其表示为程序中的对象。
- 程序是对象的集合。它们通过发送消息来告知彼此所要做的。要想请求一个对象,就必须对该对象发送一条消息。更具体地说,可以把消息想象为对某个特定对象的方法的调用请求。
- 每个对象都有自己的由其他对象所构成的存储。换句话说,可以通过创建包含现有对象的包的方式来创建新类型的对象。因此,可以在程序中构建复杂的体系,同时将其复杂性隐藏在对象的简单性背后。
- 每个对象都拥有其类型。按照通用的说法,”每个对象都是某个类(class)的一个实例(instance)”, 这里”类”就是”类型”的同义词。每个类最重要的区别于其他类的特性就是”可以发送什么样的消息给它”。
- 某一特定类型的所有对象都可以接收同样的信息。因为”圆形”类型的对象同时也是”几何形”类型的对象,所以一个”圆形”对象必定能够接受发送给”几何形”对象的消息。这意味着可以编写与”几何形”交互并自动处理所有与几何形性质相关的事物的代码。这种可替代性(
substitutability
)是OOP中最强有力的概念之一。
- 以上是Alan Kay总结的第一个面向对象语言、同时也是Java所基于的语言之一的
Smalltalk
的五个特性,这些特性表现了一种纯粹的面向对象程序实际方式。 - Booch对对象提出了一个更加简洁的描述: 对象具有状态、行为和标识。这意味着每一个对象都可以拥有内部数据(它们给出了该对象的状态)和方法(它们产生行为),并且每一个对象都可以唯一地与其他对象区分开来,具体来说,就是每一个对象在内存中都有一个唯一的地址。
每个对象都有一个接口:
- 亚里士多德大概是第一个深入研究类型(
type
)的哲学家,他曾提出过鱼类和鸟类这样的概念。所有对象都是唯一的,但同时也是具有相同的特性和行为的对象归属的类的一部分。 - 亚里士多德的这种思想被直接应用于第一个面向对象语言Simula, 它在程序中使用基本关键字
class
来引入新的类型。 - 尽管程序员们在面向对象程序设计中实际上进行的是创建新的数据类型,但事实上所有的面向对象程序设计语言都使用
class
这个关键词来表示数据类型。当看到类型一词时,可将其作为类来考虑,反之亦然。
有一部分程序员有着另外的理解: 类型决定接口,而类是该接口的一个特定实现。
- 因为类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型,例如所有浮点型数字具有相同的特性和行为集合。二者的差异在于,程序员通过定义类来适应问题,而不再被迫只能使用现有的用来表示机器中的存储单元的数据类型。
- 面向对象方法并不是仅仅局限于构建仿真程序。其实任何程序都是
程序员们所设计的系统的一个仿真,面向对象技术的应用确实可以将大量的问题很容易地降解为一个很简单的解决方案。 - 接口确定了对某一特定对象所能发出的请求。但是,在程序中必须有满足这些请求的代码。这些代码与隐藏的数据一起构成了实现。
每个对象都提供服务:
- 将每个对象看作是服务提供者的一个附带好处:
- 有助于提高对象的内聚性。
- 高内聚是软件设计的基本质量之一。
- 举出一个具体事例:
- 例如,在检查打印模式的模块中,程序员可以这样设计一个对象,让它去了解所有的格式和打印技术(彩印,墨印等)。但是问题出现了,这些功能对于一个对象来说太多了。这时候程序员应该设计三个或者更多的对象。
- 一个对象可以是所有可能的纸张排版的目录,它可以被用来查询有关如何打印一张纸张的信息;
- 另一个对象(或者对象集合)可以是一个通用的打印接口,它知道有关所有不同类型的打印机的信息(但是不包含任何有关薄记的内容,它更应该是一个需要购买而不是自己编写的对象);
- 这样,每个对象都有一个它所能提供服务的内聚的集合。
被隐藏的具体实现:
- 将程序开发人员按照角色分为类创建者(那些创建新数据类型的程序员)和客户端程序员(那些在其应用中使用数据类型的类消费者)。
Java
用三个关键字在类的内部设定边界:public
、private
、protected
。这些访问指定词(access specific
)决定了紧跟其后被定义的东西可以被谁使用。
public
表示紧跟其后的元素对任何人都是可用的;private
表示除类创建者和类型的内部方法之外的任何人都不能访问的元素。private
就像了类程序员与客户程序员之间的一堵墙,如果有人试图访问private
成员,就会在编译时得到错误信息。protected
关键字与private
作用相当,差别仅在于继承的类可以访问protected
成员,但是不能访问private
成员。
- 如下表所示(Java知己伙伴提出的):
访问范围 | private | default | protected | public |
---|---|---|---|---|
同一类中 | yes | yes | yes | yes |
同一包中 | no | yes | yes | yes |
子类中 | no | no | yes | yes |
全局范围 | no | no | no | yes |
Java
还有一种默认的访问权限,当没有使用前面提到的任何访问指定词时,它将发挥作用。这种权限通常被称为包访问权限,因为在这种权限下,类可以访问在同一个包(库构件)中的其他类的成员,但是在包之外,这些成员如同指定了private
一样。- 在这个访问权限的问题中,Big-man还是比较支持用代码去实现这个效果。
复用具体实现:
- 代码复用是面向对象程序设计语言所提供的最了不起的优点之一。
- 最简单的复用某个类的方式就是直接使用该类的一个对象,此外也可以将那个类的一个对象置于某个新的类中。
- 新的类可以由任意数量、任意类型的其他对象以任何可以实现新的类中想要的功能的方式所组成。因为是在使用现有的类合成新的类,所以这种概念被称为组合(
composition
),如果组合是动态发生的,那么它通常称为聚合(aggregation
)。 - 组合经常被视为“has-a”(拥有)关系,这和男女朋友间大拥有不太一样,就好比”电动车拥有电瓶”一样。
- 组合带来了极大的灵活性。新类的成员对象通常都被声明为
private
,使得新类的客户端程序不能访问它们。
继承:
-
-
解释性:
Java
语言是一种解释性语言,相对于C/C++
语言来说,用Java
语言写出来的程序效率低,执行速度慢。但它可以通过在不同平台上运行Java
解释器,对Java
代码进行解释,来实现”一次编写,到处运行”的目标。为了到达目标,牺牲效率还是值得的,而且,现在的计算机技术日新月异,运行速度越来越快,用户不会感到太慢。
适合分布式计算:
Java
语言具有强大的、易于使用的联网能力,非常适合开发分布式计算的程序。Java
应用程序可以像访问本地文件系统那样通过URL访问远程对象。- 使用
Java
语言编写Socket
通信程序比使用任何其他语言都简单。而且它还十分适用于公共网关接口(CGI)脚本的开发,另外还可以使用Java
小应用程序(Applet
)、Java
服务器页面(Java Server Page, JSP
)、Servlet
等手段来构建更丰富的网页。
拥有较好的性能:
- 由于Java语言是一种解释性语言,所以它的执行效率相对就会慢一些,但由于Java语言采用了下面两种手段,使其拥有较好的性能。
- Java语言源程序编写完成后,先使用Java伪编译器进行伪编译,将其转换为中间码(也称为字节码)再解释。
- 提供了一种”准实时“(
Just-in-Time, JIT
)编译器,当需要更快的速度时,可以使用JIT
编译器将字节码转换成机器码,然后将其缓冲下来,这样速度就会更快。
健壮、防患于未然的特征:
- Java语言在伪编译时,做了许多早期潜在问题的检查,并且在运行时又做了一些相应的检查,可以说是一种最严格的”编译器”。
- Java语言的这种”防患于未然”的手段将许多程序中的错误都扼杀在”摇篮”之中,经常有许多在其他语言中必须通过运行才会暴露出来的错误,在编译阶段就被发现了。
- 另外,在Java语言中还具备了许多保证程序稳定、健壮的特性,有效地减少了错误,也使Java应用程序更加健壮。
具有多线程处理能力:
- 线程是一种轻量级进程,是现代程序设计中必不可少的一种特性。多线程处理能力使程序具有更好的交互性、实时性。
Java
在多线程处理方面性能超群,具有让设计者惊喜的强大功能,而且在Java语言中进行多线程处理也很简单。
具有较高的安全性:
- Java语言在设计时在安全性方面考虑得很仔细,做了许多探究,使Java语言成为目前最安全的一种程序设计语言。
- 尽管Sun公司曾经许诺过: “通过Java可以轻松构建出防病毒、防黑客的系统”,但就在
JDK(Java Development Kit) 1.0
发布不久后,美国Princeton(普林斯顿)大学的一组安全专家发现了Java 1.0 安全特性中的第一例错误。从此,Java安全方面的问题开始被关注。不过至今所发现的安全隐患都很微不足道,而且Java开发组还宣称,他们对系统安全方面的Bugs非常重视,会对这些被发现的Bugs立即进行修复。另外,由于Sun公司开发了Java解释器的细节,所以有助于通过各界力量共同发现、防范、制止这些安全隐患。
是一种动态语言:
- Java是一种动态的语言,这表现在以下两个方面:
- 在Java语言中,可以简单、直观地查询运行时的信息。
- 可以将新代码加入到一个正在运行的程序中。
是一种中性结构:
- Java编译器生成的是一种中性的对象文件格式,也就是说,Java编译器通过伪编译器后,将生成一个与任何计算机体系无关的”中性”的字节码。
- 这种中性结构其实并不是Java首创的,在Java出现之前
UCSD Pascal
系统就已在一种商业产品中做到了这一点,另外,在UCSD Pascal
之前也有这种方式的先例,如在Niklaus Wirth
实现的Pascal
语言中就采用了这种结构降低一些性能,以换取更好的可移植性和通用性的方法。 Java
的这种字节码经过了许多精心的设计,使其能够很好地兼容于当今大多数流行的计算机系统,在任何机器上都易于解释,易于动态翻译成为机器代码。
Java程序的运行机制和Java虚拟机:
Java程序的运行机制:
Hello.java
->Hello.class
->110011001
-> 输出Hello
;- 在Java中源文件名称的后缀为
*.java
,之后通过编译使*.java
的文件生成一个*.class
文件,在计算机上执行*.class
文件,但是此时执行*.class
的计算机并不是一个物理上可以看到的计算机,而是Java自己设计的一个计算机——JVM
, Java也是通过JVM
进行可移植性操作的。
JVM:
- 在Java中所有的程序都是在
JVM
(Java Virtual Machine
)上运行的。JVM是在一台计算机上由软件或者硬件模拟的计算机。Java虚拟机(JVM
)读取并处理经编译过的、与平台(操作系统平台< Windows, Unix, Linux, Mac>)无关的字节码*.class
文件。Java解释器负责将Java虚拟机的代码在特定的平台上运行。
JackDan9 Thinking