Java核心技术(基础知识一)

一、Java 程序设计概述

1.1 Java“白皮书”的关键术语

  1. 简单性

    我们希望构建一个无须深奥的专业训练就可以进行编程的系统,并且要符合当今的标准惯例。因此,尽管我们发现C++不太适用,但在设计Java的时候还是尽可能地接近C++,以便系统更易于理解。Java剔除了C++中许多很少使用、难以理解、容易混淆地特性。在我们看来,这些特性带来地麻烦远远多于它们地好处。

    的确,Java地语法是C++的一个“纯净”版本。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等。然而,设计者并没有试图清除C++中所有不适当的特性。例如,switch语句的语法在Java中就没有改变。

    简单”的另一个方面是小。Java的目标之一是支持开发能够在小型机器上独立运行的软件。基本的解释器以及类支持大约仅为40KB,再加上基础的标准类库和线程的支持(基本上是一个自包含的微内核),大约需要增加175KB。

  2. 面向对象

    简单地讲,面向对象设计是一种程序设计技术。它讲重点放在数据(即对象)和对象地接口上。用木匠打一个比方:一个“面向对象的“木匠始终首先关注的是所制作的椅子,其次才是所使用的工具;一个”非面向对象的“木匠主要考虑的是所用的工具。再本质上,Java的面向对象能力与C++是一样的。

    开发Java时面向对象技术已经相当成熟。Java的面向对象特性与C++旗鼓相当。Java与C++的主要不同点在于多重继承,在Java中,取而代之的时简单的接口概念。与C++相比,Java提供了更丰富的运行时自省功能。

  3. 分布式

    Java是一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。
    Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就像访问本地文件一样。

  4. 健壮性

    Java的设计目标之一在于使得Java编写的程序具有多方面的可靠性。Java非常强调进行早期的问题检测、后期动态的(运行时)检测,以及消除容易出错的情况————Java与C/C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性。

    Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。至于第二点,对于曾经花费几个小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性。

  5. 安全性

    Java要适用于网路/分布式环境。为了实现这个目标,安全性颇受重视。使用Java可以构建防病毒、防篡改的系统。

    从一开始 ,Java就设计成能够防范各种攻击,其中包括:

    • 运行时堆栈溢出,这是蠕虫和病毒常用的攻击手段。
    • 破坏自己的进程空间之外的内存。
    • 未经授权读写文件。

    原先,Java对下载代码的态度是“尽管来吧!”。不可信代码在一个沙箱环境中运行,在这里它不会影响主系统。用户可以确信不会发生不好的事情,因为Java代码不论来自哪里,都不能脱离沙箱。

    不过,Java的安全模型非常复杂,Java开发包(Java Development Kit,JDK)的第一版发布后不久,普林斯顿大学的一些安全专家就发现一些小bug会允许不可信的代码攻击主系统。

    最初,安全bug可以快速修复。遗憾的是,经过一段时间之后,黑客已经很擅长找出安全体系结构实现中的小漏洞。Sun以及之后的Oracle为不断修复bug经历了一段很是艰难的日子。

    遭遇多次高调攻击之后,浏览器开发商和Oracle开始越来越谨慎。Java浏览器插件不再信任远程代码,除非代码有数字签名而且用户同意执行这个代码。

    注释:现在看来,尽管Java安全模型没有原先预想的那么成功,但Java在那个时代,确实相当超前。微软提供了一种与之竞争的代码交付机制,其安全性完全依赖于数字签名。显然这是不够的,因为微软自身产品的任何用户都可以证实,一些知名开发商的程序确实崩溃并对系统产生危害。

  6. 体系结构中立

    编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要Java运行时系统,这些编译后的代码可以i在许多处理器上运行。Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以动态地转换本地机器代码。

    当时,为“虚拟机”生成代码并不是一个新思路。诸如Lisp、Smalltalk和Pascal等编程语言多年前就已经采用了这种技术。

    当然,解释型虚拟机指令肯定会比全速运行机器指令慢很多。不过,虚拟机有一个选项,可以将执行最频繁的字节码序列转换成机器码,这一过程称为即时编译。

    Java虚拟机还有一些其他优点。它可以检查指令序列的行为,从而增强其安全性。

  7. 可移植性

    与C和C++不同,Java规范中没有“依赖具体实现”的地方。基本数据类型的大小以及有关运算的行为都有明确的说明。

    例如,Java中的int永远为32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器开发商指定的任何其他大小。唯一的限制只是int的字节数不能低于short int,并且不能高于long int。在Java中,数值类型有固定的字节数,这消除了代码移植时一个令人头痛的主要问题。二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串则采用标准的Unicode格式存储。

  8. 解释型

    Java解释器可以在任何移植了解释器的机器上直接执行Java字节码。由于连接是一个增量式且轻量级的过程,所以,开发过程也变得更加快捷,更加具有探索性。

  9. 高性能

    尽管对解释后的字节码性能已经比较满意,但在有些场合下还需要更高的性能。字节码可以(在运行时)动态的转换成对应运行这个应用的特定CPU的机器码。

    使用Java的头几年,许多用户不同意“对性能已经比较满意”的说法。不过,现在的即时编译器已经非常出色,可以与传统编译器相媲美,而且在某些情况下甚至超越了传统编译器,原因是它们有更多的可用信息。例如,即时编译器可以监控哪些代码频繁执行,并优化这些代码以提高速度。更为复杂的优化是消除函数调用(即“内联”)。即时编译器知道哪些类已经加载。基于当前加载的类集合,如果一个特定的函数不会被覆盖,就可以使用内联。必要时,以后还可以撤销这种优化。

  10. 多线程

    多线程可以带来更快的交互响应和实时行为。

    并发程序设计绝非易事,不过Java在这方面表现很出色,可以很好的管理这个工作。

  11. 动态性

    从很多方面来看,Java与C或C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端却没有任何影响。在Java中找出运行时类型信息十分简单。

    当需要为正在运行的程序增加代码时,动态性将是一个非常重要的特性。一个很好的例子:从Internet下载代码,然后在浏览器上运行。如果使用C或C++,这确实难度很大,不过Java设计者很清楚动态语言可以很容易的实现运行程序的演进。最终,他们将这一特性引入这个主流程序设计语言中。

1.2 JAVA语言的演进

版本 年份 新语言的特性 类与接口的数量
1.0 1996 语言本身 211
1.1 1997 内部类 477
1.2 1998 strictfp修饰符 1524
1.3 2000 1840
1.4 2002 断言 2723
5.0 2004 泛型类、“for each”循环、可变元参数、自动装箱、元数据、枚举、静态导入 3279
6 2006 3793
7 2011 基于字符串的选择语句、菱形运算符、二进制字面量、异常处理增强 4024
8 2014 lambda表达式、包含默认方法的接口、流和日期/时间库 4240
9 2017 模块、其他的语言和类库增强 6005

二、Java 程序设计环境

2.1、安装Java开发工具包

2.1.1、下载JDK

  • Java术语

    术语名 缩写 解释
    Java Development Kit(Java开发工具包) JDK 编写Java程序的程序员使用的软件
    Java Runtime Environment(Java运行时环境) JRE 运行Java程序的用户使用的软件
    Server JRE(服务器JRE) —— 在服务器上运行Java程序的软件
    Standard Edition(标准版) SE 用于桌面或简单服务器应用的Java平台
    Enterprise Edition(企业版) EE 用于复杂服务器应用的Java平台
    Micro Edition(微型版) ME 用于小型设备的Java平台
    Java FX —— 用于图形化用户界面的一个备选工具包,在Java11之前的某些Java SE发布版本中提供。
    OpenJDK J2 一个过时的术语,用于描述1998~2006年之间的Java版本
    Software Development Kit(软件开发工具包 SDK 一个过时的术语,用于描述1998~2006年之间的JDK
    Update u Oracle公司的术语,表示Java 8 之前的bug修正版本
    NetBeans —— Oracle公司的集成开发环境

    已经看到,JDK 是Java Development Kit的缩写。有点混乱的是:这个工具包的版本1.2~版本1.4被称为Java SDK。在某种场合下,还可以看到这个过时的术语。在Java10之前,还有一个术语是Java运行环境(JRE),它只包括虚拟机。这并不是开发人员想要的,只是专门为不需要编译器的用户提供。
    接下来,你会看到大量的JavaSE,相对于JavaEE和JavaME,JavaSE是Java标准版。
    Java2这种提法始于1998年。当时Sun公司的销售人员感觉以增加小数点后面数值的方式改变版本号并没有反映出JDK1.2的重大改进。但是,由于在发布之后才意识到这个问题,所以他们决定开发工具包的版本号仍然沿用1.2,接下来的版本是1.3、1.4和5.0。不过,Java平台被重新命名为Java2。因此,就有了Java2 Standard Edition Software Development Kit(Java2 标准版软件开发包)5.0版,即 J2SE SDK 5.0。
    幸运的是,2006年版本号得到简化。Java标准版的下一个版本取名为 JavaSE 6 ,后来,又有了Java SE 7 和Java SE 8。
    不过,”内部“版本号却分别是1.6.0、1.7.0和1.8.0。到了Java SE 9,这种混乱终于终结,版本号变为9,以及后来的9.0.1.(为什么没有使用9.0.0作为初始版本呢?为了保留一点兴奋感,版本号规范要求在主版本和第一次安全更新之间的短暂间隔中删除版本号末尾的零。)
    在Java9之前,有32位64位两个版本的Java开发工具包。现在Oracle公司不再开发32位版本。要使用 OracleSDK,你需要有一个64位的操作系统。
    对于Linux,还可以在RPM文件和**.taz.gz文件**之间做出选择。我们建议使用后者,这样可以在你希望的任何位置直接解压缩这个压缩包。

2.1.2 设置 JDK

下载JDK之后,需要安装这个开发工具包并明确要在哪里安装,后面还会需要这个信息。

  • 在Windows上,启动安装程序,会询问你要在哪里安装JDK。最好不要接受路径名中包含空格的默认位置,如:C:\Program Files\Java\jdk-11.0.x。取出路径名中Program Files 部分就可以了。
  • 在Mac上,运行安装程序。这会把软件安装到/Library/Java/JavaVirtuaMachines/jdk-11.0.x.jdk/Contents/Home。用查找功能找到这个目录。
  • 在Linux上,只需要把 .tar.gz 文件解压缩到你选择的某个位置,如你在的主目录,或者 /opt 。如果从RPM文件安装,则要反复检查是否安装在 /usr/java/jdk-11.0.x 上。

解释:安装目录用jdk表示。例如,谈到jdk/bin 目录时,是指 /opt/jdk-11.0.4/bin 或者 C:\Java\jdk-11.0.4\bin 目录。

在Windows或Linux上安装JDK时,还需要另外完成一个步骤:将jdk/bin 目录添加到可执行路径中——可执行路径是操作系统查找可执行文件时所遍历的目录列表。

  • 在Linux中,需要在 ~/.bashrc 或 ~/.bash_profile 文件的最后增加这样一行:

    export PATH=jdk/bin:$PATH # 一定要使用JDK的正确路径,如:/opt/jdk-11.0.4。
    
  • 在Windows10中,在 Windows Settings(Windows设置)的搜索栏中键入 environment(环境),选择 Edit environment variables for your account(编辑账户的环境变量,参图 2-1)。会出现一个Environment Variables(环境变量)对话框。(它可能隐藏在Windows设置对话框后面。如果实在找不到,可以同时按住Windows和R键打开Run(运行)对话框,从这个对话框运行 system.cpl,然后选择Advanced(高级)标签页,再点击Environment Variables(环境变量)按钮。)在User Variables(用户变量)列表中找到并选择一个名为Path的变量。点解Edit(编辑)按钮,再点击New(新建)按钮,增加一个变量,值为jdk\bin 目录(参考图2-2)。
    保存所做的设置。之后新打开的所有命令提示窗口都会正确的路径。
    可以按如下方式测试是否正确:打开一个终端窗口,键入(参考图2-3)

    javac -version
    

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、JDBC(Java Database Connectivity)提供连接各种关系数据库的统一接口。   2、EJB(Enterprise JavaBeans)使得开发者方便地创建、部署和管理跨平台的基于组件的企业应用。   3、Java RMI(Java Remote Method Invocation)用来开发分布式Java应用程序。一个Java对象的方法能被远程Java虚拟机调用。这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用程序都是用Java写的。   4、Java IDL(Java Interface Definition Language) 提供与CORBA(Common Object Request Broker Architecture)的无缝的互操作性。这使得Java能集成异构的商务信息资源。   5、JNDI(Java Naming and Directory Interface)提供从Java平台到的统一的无缝的连接。这个接口屏蔽了企业网络所使用的各种命名和目录服务。   6、JMAPI(Java Management API)为异构网络上系统、网络和服务管理的开发提供一整套丰富的对象和方法。   7、JMS(Java Message Service)提供企业消息服务,如可靠的消息队列、发布和订阅通信、以及有关推拉(Push/Pull)技术的各个方面。   8、JTS(Java transaction Service)提供存取事务处理资源的开放标准,这些事务处理资源包括事务处理应用程序、事务处理管理及监控。   在Java技术中,值得关注的还有JavaBeans,它是一个开放的标准的组件体系结构,它独立于平台,但使用Java语言。一个JavaBean是一个满足JavaBeans规范的Java类,通常定义了一个现实世界的事物或概念。一个JavaBean的主要特征包括属性、方法和事件。通常,在一个支持JavaBeans规范的开发环境(如Sun Java Studio 和IBM VisualAge for Java)中,可以可视地操作JavaBean,也可以使用JavaBean构造出新的JavaBean。JavaBean的优势还在于Java带来的可移植性。现在,EJB (Enterprise JavaBeans) 将JavaBean概念扩展到Java服务端组件体系结构,这个模型支持多层的分布式对象应用。除了JavaBeans,典型的组件体系结构还有DCOM和CORBA,关于这些组件体系结构的深入讨论超出了本书的范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值