java核心技术卷I 第1-3章 笔记

java核心技术卷I 第1-3章

本书将详细介绍下列内容:

● 面向对象程序设计

● 反射与代理

● 接口与内部类

● 异常处理

● 泛型程序设计

● 集合框架

● 事件监听器模型

● 使用Swing UI工具箱进行图形用户界面设计

● 并行操作

Ⅱ(高级特性)涉及企业特性以及高级的用户界面程序设计,其中详细讨论下列内容:

● 流API

● 文件处理与正则表达式

● 数据库

● XML处理

● 注释

● 国际化

● 网络编程

● 高级GUI组件

● 高级图形

● 原生方法

第一章 java程序设计概述

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

1)简单性2)面向对象3)分布式4)健壮性5)安全性6)体系结构中立7)可移植性8)解释型9)高性能10)多线程11)动态性

1.2.1 简单性
  • 的确,Java语法是C++语法的一个“纯净”版本。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等
  • 简单的另一个方面是小。Java的目标之一是支持开发能够在小型机器上独立运行的软件。基本的解释器以及类支持大约仅为40KB;再加上基础的标准类库和对线程的支持(基本上是一个自包含的微内核)大约需要增加175KB。
1.2.2 面向对象
  • 简单地讲,面向对象设计是一种程序设计技术。它将重点放在数据(即对象)和对象的接口上
1.2.3 分布式
  • Java有一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。
1.2.4 健壮性
  • Java的设计目标之一在于使得Java编写的程序具有多方面的可靠性。Java投入了大量的精力进行早期的问题检测、后期动态的(运行时)检测,并消除了容易出错的情况

  • Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。

1.2.5 安全性
  • Java适用于网络/分布式环境。为了达到这个目标,在安全方面投入了很大精力。使用Java可以构建防病毒、防篡改的系统。

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

    • 运行时堆栈溢出。如蠕虫和病毒常用的攻击手段。
    • 破坏自己的进程空间之外的内存。
    • 未经授权读写文件。
1.2.6 体系结构中立
  • 编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,这些编译后的代码可以在许多处理器上运行。
  • Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。
1.2.7 可移植性
  • 与C和C++不同,Java规范中没有“依赖具体实现”的地方。基本数据类型的大小以及有关运算都做了明确的说明。
  • 例如,Java中的int永远为32位的整数,而在C/C++中,int可能是16位整数、32位整数
  • 唯一的限制只是int类型的大小不能低于short int,并且不能高于long int。在Java中,数据类型具有固定的大小,这消除了代码移植时令人头痛的主要问题。
  • 二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串是用标准的Unicode格式存储的。
1.2.8 解释型
  • Java解释器可以在任何移植了解释器的机器上执行Java字节码。
  • 由于链接是一个增量式且轻量级的过程,所以,开发过程也变得更加快捷,更加具有探索性。
1.2.9 高性能
  • 尽管对解释后的字节码性能已经比较满意,但在有些场合下还需要更加高效的性能。字节码可以(在运行时刻)动态地翻译成对应运行这个应用的特定CPU的机器码。
1.2.10 多线程
  • 多线程可以带来更好的交互响应和实时行为。
  • 我们不再追求更快的处理器,而是着眼于获得更多的处理器,而且要让它们一直保持工作。
1.2.11 动态性
  • 它能够适应不断发展的环境。库中可以自由地添加新方法和实例变量,而对客户端却没有任何影响。在Java中找出运行时类型信息十分简单。
  • 需要将某些代码添加到正在运行的程序中时,动态性将是一个非常重要的特性。一个很好的例子是:从Internet下载代码,然后在浏览器上运行。Java设计者很清楚动态语言可以很容易地实现运行程序的演进。最终,他们将这一特性引入这个主流程序设计语言中。

1.3 Java applet(程序)与Internet

  • 用户从Internet下载Java字节码,并在自己的机器上运行。在网页中运行的Java程序称为applet。要使用applet,需要启用Java的Web浏览器执行字节码。
  • 不需要安装任何软件。任何时候只要访问包含applet的网页都会得到程序的最新版本。最重要的是,要感谢虚拟机的安全性,它让我们不必再担心来自恶意代码的攻击。
  • 网页中插入一个applet就如同在网页中嵌入一幅图片。applet会成为页面的一部分。文本环绕着applet所占据的空间周围。关键的一点是这个图片是活动的。它可以对用户命令做出响应,改变外观,在运行它的计算机与提供它的计算机之间传递数据。

1.4 Java发展简史

image-20210408111732663

1.5 关于Java的常见误解

在结束本章之前,我们列出了一些关于Java的常见误解,同时给出了解释。

  • Java是HTML的扩展
    • Java是一种程序设计语言;HTML是一种描述网页结构的方式除了用于在网页上放置Java applet的HTML扩展之外,两者没有任何共同之处。
  • 2.使用XML,所以不需要Java
    • Java是一种程序设计语言;XML是一种描述数据的方式。可以使用任何一种程序设计语言处理XML数据,而Java API对XML处理提供了很好的支持。此外,许多重要的第三方XML工具采用Java编写。有关这方面更加详细的信息请参看卷Ⅱ。
  • 所有的Java程序都是在网页中运行的
    • 所有的Java applet都是在网页浏览器中运行的。这也恰恰是applet的定义,即一种在浏览器中运行的Java程序
    • 然而,**大多数Java程序是运行在Web浏览器之外的独立应用程序。**实际上,很多Java程序都在Web服务器上运行并生成用于网页的代码。

第二章 Java程序设计环境

2.1.3 安装库源文件和文档
  • 库源文件在JDK中以一个压缩文件src.zip的形式发布必须将其解压缩后才能够访问源代码。建议按照下面所述的步骤进行操作。很简单:
    • 1)确保JDK已经安装,并且jdk/bin目录在执行路径中。
    • 2)在主目录中建立一个目录javasrc。
    • 3)在jdk目录下找到文件src.zip。
    • 4)将src.zip文件解压缩到javasrc目录。
  • src.zip文件中包含了所有公共类库的源代码。
  • 要想获得更多的源代码(例如:编译器、虚拟机、本地方法以及私有辅助类),请访问网站:http://jdk8.java.net。

2.5 构建并运行applet

  • 如何构建和运行一个applet,以及如何在Web浏览器中显示

  • 首先,打开终端窗口并转到CoreJava/v1ch02/RoadApplet,然后,输入下面的命令:

  • image-20210408114513543

    • 第一条命令是大家已经非常熟悉的调用Java编译器的命令。它将RoadApplet.java源文件编译成字节码文件RoadApplet.class。
    • 不过这一次不要运行java程序。首先,使用jar工具将类文件打包到一个“JAR文件”。然后调用appletviewer程序,这是JDK自带的一个工具,可以用来快速测试applet。 需要为这个程序指定一个HTML文件名,而不是一个Java类文件名。
  • 显示了在applet查看器窗口中显示的内容。

image-20210408114913019

  • RoadApplet/RoadApplet.html内容

  • <p><applet code="RoadApplet.class" archive="RoadApplet.jar" 
               width="400" height="400" alt="Traffic jam visualization">
    </applet></p>
    
    • 这会告诉applet查看器加载applet,其代码存储在RoadApplet.jar中。applet会忽略除applet标签外的所有HTML标签。

第三章java的基本程序设计结构

3.1 一个简单的Java应用程序

image-20210408161055384

  • 首先,Java区分大小写。如果出现了大小写拼写错误,程序将无法运行
  • 关键字public称为访问修饰符(accessmodifier),这些修饰符用于控制程序的其他部分对这段代码的访问级别
  • 关键字class表明Java程序中的全部内容都包含在类中。这里,只需要将类作为一个加载程序逻辑的容器程序逻辑定义了应用程序的行为。
  • Java中定义类名的规则很宽松。名字必须以字母开头,后面可以跟字母和数字的任意组合。长度基本上没有限制。但是不能使用Java保留字(例如,public或class)作为类名
  • 标准的命名规范为(类名FirstSample就遵循了这个规范):类名是以大写字母开头的名词。如果名字由多个单词组成,每个单词的第一个字母都应该大写(这种在一个单词中间使用大写字母的方式称为骆驼命名法
  • 源代码的文件名必须与公共类的名字相同,并用.java作为扩展名。因此,存储这段源代码的文件名必须为FirstSample.java
  • 如果已经正确地命名了这个文件,并且源代码中没有任何录入错误,在编译这段源代码之后就会得到一个包含这个类字节码的文件。Java编译器将字节码文件自动地命名为FirstSample. class,并与源文件存储在同一个目录下。
  • 使用下面这行命令运行这个程序:(请记住,不要添加.class扩展名。)
    • java FirstSample
  • 当使用 java ClassName运行已编译的程序时,Java虚拟机将从指定类中的main方法开始执行,因此为了代码能够执行,在类的源文件中必须包含一个main方法。

接下来,研究一下这段代码:

image-20210408161911849

  • 上面这个main方法体中只包含了一条语句,其功能是:将一个文本行输出到控制台上。
  • 在这里,使用了System.out对象并调用了它的println方法。注意,点号(·)用于调用方法。Java使用的通用语法是object.method(parameters)
  • 在这个示例中,调用了println方法并传递给它一个字符串参数。这个方法将传递给它的字符串参数显示在控制台上。然后,终止这个输出行,使得每次调用println都会在新的一行上显示输出。
  • 对于一个方法,即使没有参数也需要使用空括号。例如,**不带参数的println方法只打印一个空行。**下面的语句来调用:System.out.println();
  • System.out还有一个print方法,它在输出之后不换行。

3.2 注释

    1. 在每行的注释前面标记//
    2. 使用/*和 */将一段比较长的注释括起来。
    3. 可以用来自动地生成文档。这种注释以/ * *开始,以 * /结束
  • 在Java中,/ * * /注释不能嵌套。也就是说,不能简单地把代码用/ 和 * /括起来作为注释,因为这段代码本身可能也包含一个/。

3.3 数据类型

Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。

  • 在Java中,一共有8种基本类型(primitive type)
    • 有4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char1种用于表示真值的boolean类型。
    • Java有一个能够表示任意精度的算术包,通常称为**“大数值”(bignumber)。虽然被称为大数值**,但它并不是一种新的Java类型,而是一个Java对象。
3.3.1 整型

整型用于表示没有小数部分的数值,它允许是负数。Java提供了4种整型

image-20210408162833159

在通常情况下,int类型最常用。但如果表示星球上的居住人数,就需要使用long类型了。byte和short类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组

  • 在Java中,整型的范围与运行Java代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。

  • 由于Java程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。

  • 长整型(long)数值有一个后缀L或l(如4000000000L)。

  • 十六进制数值有一个前缀0x或0X(如0xCAFE)。八进制有一个前缀0,例如,010对应八进制中的8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。

  • **从Java 7开始,加上前缀0b或0B就可以写二进制数。**例如,0b1001就是9。

  • 同样是从Java 7开始,还可以为数字字面量加下划线,如用1_000_000(或0b1111_0100_0010_0100_0000)表示一百万。这些下划线只是为了让人更易读。Java编译器会去除这些下划线。

  • 注意,Java没有任何无符号(unsigned)形式的int、long、short或byte类型。

  • Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ 。

    • long a = 55555555; //编译成功,在int表示的范围内(21亿内)。整型自动转换 小=》大

      long b = 55555555555;//不加L编译错误,已经超过int表示的范围。

3.3.2 浮点类型

浮点类型用于表示有小数部分的数值。在Java中有两种浮点类型,具体内容如表3-2所示。image-20210408163652996

  • double表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值)。
  • 绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足需求。
  • 实际上,只有很少的情况适合使用float类型,例如,需要单精度数据的库,或者需要存储大量数据。
  • float类型的数值有一个后缀F或f(例如,3.14F)。没有后缀F的浮点数值(如3.14)默认为double类型。当然,也可以在浮点数值后面添加后缀D或d(例如,3.14D)。
  • 可以使用十六进制表示浮点数值。例如,0.125=2-3可以表示成0x1.0p-3。在十六进制表示法中,使用p表示指数,而不是e。注意,尾数采用十六进制,指数采用十进制。指数的基数是2,而不是10。

所有的浮点数值计算都遵循IEEE 754规范。具体来说,下面是用于表示溢出和出错情况的三个特殊的浮点数值:

● 正无穷大 ● 负无穷大 ● NaN(不是一个数字

例如,一个正整数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NaN。

  • 常量**Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN(以及相应的Float类型的常量)分别表示这三个特殊的值,**但在实际应用中很少遇到。

  • 不能这样检测一个特定值是否等于Double.NaN:

    • if(x == Double.NaN) //never true
      
  • 所有“非数值”的值都认为是不相同的。然而,可以使用Double.isNaN方法:

    • if(Double.isNaN(x))//check whether x is "not a number"
      

警告 :

  • 浮点数值不适用于无法接受舍入误差的金融计算中。例如,命令System.out.println(2.0-1.1)将打印出0.8999999999999999,而不是人们想象的0.9。
  • 这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数1/10。这就好像十进制无法精确地表示分数1/3一样。//TODO 为什么无法表示
  • 如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类
3.3.3 char类型

**char类型原本用于表示单个字符。**不过,现在情况已经有所变化。如今,有些Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值。

Unicode:一种字符编码标准。简而言之,这是一个文本字符(数字,字母,标点符号)与二进制代码对应的表格

  • char类型的字面量值要用单引号括起来。例如:'A’是编码值为65所对应的字符常量。它与"A"不同,"A"是包含一个字符A的字符串。

  • char类型的值可以表示为十六进制值其范围从\u0000到\uffff

  • 转义序列\u࿱

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值