资源描述
知识点总结
1 环境搭建及开发
1.1 环境变量
:的安装目录;
:指定一个路径列表,用于搜索在编译或运行时需要用到的类(文件);
:指定一个路径列表,用于搜索可执行文件。
1.2 应用
编译: 类名;
运行: 类名;
打包: (把当前目录下的目录下的所有文件压缩到文件中)。
2 变量及常量
中的常量用保留字来实现。
变量:局部变量( )、实例变量( )、类变量( );任何变量在使用前都必须初始化,局部变量必须显示初始化,实例变量在类的构造方法被调用时初始化(分配默认值),类变量在类被加载时被初始化。
3 标识符
3.1 命名
在语言中,标识符的定义规则是以字母、下划线、美元符开始,后面可以跟字母、下划线、美元符、数字。
因为语言使用字符集,所以对字母不仅限于英文,还可以是日文、韩文、阿拉伯文、中文等。
区分大小写,没有字数限制。
3.2 关键字
3.2.1
方法中不能有和关键字(方法不是“面向对象”的,而是“面向类”的)。
方法中只能访问所属类的方法和变量。
数据成员的初始化:在第一次生成该类的对象时初始化。
3.2.2
1) 数据
a)
l 更加典型的定义方式是 ;
l 占用一段不能改变的存储空间;
l 代表编译时常量,即在编译器就能知道其值(如果只声明为或者,是在运行时才知道值)。
l 全部用大写字母命名,单词之间用下划线隔开。
b) 数据及引用
l 数据的值不能被改变;
l 引用是指无法将其指向一个新的对象(数组也是一种引用),对象本身的值是可以改变的。
c) 空白(声明为却未赋初始值)
l 可以做到根据对象有所不同,又保持恒定不变的特性;
l 必须保证使用前已经初始化:在定义处赋值或者在构造器中赋值。
2) 参数
l 无法在方法中更改引用所指向的对象。
3) 方法
l 禁止覆盖,防止任何继承类修改它的定义;
l 方法都是的,因此方法无法覆盖。
4) 类
l 不允许继承该类;
l 类中的所有方法都隐式指定为的。
3.2.3
主要作用:防止对象的敏感信息被序列化,保证安全性。
用于在一个特定对象的一个域上关闭序列化,当该对象被序列化时,型变量不包含在序列化表示中。
原因:对于某些敏感信息(如密码),一经序列化处理,便可以通过读取文件或者拦截网络传输的方式访问到。
4 运算符
4.1 算术运算符
4.1.1 “/”运算符
如果被除数和除数都是整数,那么商也是整数;
如果被除数和除数中有一个是浮点数,商是浮点数;
当被除数是整数类型时,零不能作为除数(运行时报错);当被除数是浮点型时,除数为0,结果为。
4.1.2 “%”运算符
既可以对整型数据取模,也可以对实型数据取模;
任何整数都不能对0取模;
不管是整型还是实型的取模运算,余数的符号及被除数的符号相同(若,结果的符号及a相同)。
4.2 位运算符
<<:左移
>>:带符号右移(最高位为0则补0,为1则补1)
>>>:无符号右移(补0)
如果对、、类型的数据进行移位处理,那么在移位进行之前,它们会被转换为类型,并且得到的结果也是一个类型的值。
对、、进行运算时,都会得到一个结果,必须将其显示地类型转换回原来的类型,在窄化转换的过程中可能会造成信息的丢失。
4.3 赋值运算符
如果赋值运算符两边的数据类型不相同,则需要进行类型转换,即“向左看齐”;如果这种转换是由小向大的转换,系统将自动进行,如果是由大向小的转换,则需强制类型转换。
5 数据类型
将对象存储在堆里,故用来创建一个小的对象,特别是小的简单的变量,往往不是很有效,因此,不用来创建对象,而是创建一个并非是引用的自动变量,这个变量直接存储值,并置于堆栈中,因此更加高效。
基本数据类型
整型:, , ,
实型:,
字符型:
布尔型:
复合数据类型
数组
类
接口
5.1 整型变量
数据类型
所占位数
值范围
8位
-128~127
16位
-32768~32767
32位
-231 ~ 231-1
64位
-263 ~ -263-1
在进行带有、、三种类型并存的表达式运算时,系统都会将和都先提升为类型。
5.2 浮点型变量
l 单精度浮点型:32位;
l 双精度浮点型:64位。
5.3 字符型数据
数据类型
所占位数
值范围
16位
0~65536
l 单引号括起来的单个字符;
l 反斜杠(\)开头的字符;
l \u后接4位十六进制数字。
6 数组
6.1 初始化
在声明数组时并不为其分配存储空间,因此在声明数组时不能指定数组的长度。
7 字符串
对象是不可变的,类中每一个看起来会修改值的方法,实际上都是创建了一个全新的对象,以包含修改后的字符串内容,而最初的对象则丝毫未动。
当把对象作为方法的参数时,实际上是复制了一份引用。
:字符串常量
:字符串变量(非线程安全)
:字符串变量(线程安全)
7.1
= (“”); ——在内存的堆中创建一个””字符串对象
= “”; ——在 中创建””字符串对象
7.2
及有什么区别?
的长度是不可变的,对象中存放的字符串对象不可修改;的长度是可变的。因此如果经常需要增加、删除或者修改字符串中的某些字符,用就不方便,为了提高效率节省空间,应该使用。
7.3
8 流程控制
8.1 &
跟在后面的值必须是常量,不能是变量或表达式;
()中,是一个整数表达式,因此传递给和语句的参数应该是、、。
9 异常处理
一般及硬件有关,由系统直接处理,不需程序员处理
(运行时异常)
其它异常,必须
9.1 常见的运行时异常
数组下标越界
索引下标越界
强制类型转换异常
空指针异常
字符串非法转换数字格式
9.2 常见的检查时异常
找不到相关类
访问类被拒绝
线程被另一个线程中断
请求的域不存在
请求的方法不存在
抛出异常的时候,异常处理程序会按照代码的书写顺序找出“最近”的处理程序,找到匹配的处理程序之后,它就认为异常将得到处理,然后就不再继续查找。
查找的时候并不要求抛出的异常和处理程序声明的异常完全匹配,派生类的对象也可以匹配其基类的处理程序。
10 内存管理
10.1 垃圾回收
10.1.1 垃圾回收的优点
的垃圾回收机制使得程序员不再需要显示地分配和释放内存,避免了很多潜在的问题,如“内存泄露”。
10.1.2 何时垃圾回收
为了提高系统效率,垃圾回收器通常只在满足以下两个条件时才运行:
l 有对象可回收;
l 系统需要回收。
垃圾回收线程是一种低优先级的线程,只在系统空闲时才有机会运行,但在系统内存量过低的时候,可能会突发地执行来挽救内存资源。
垃圾回收器不可以被强制执行,但程序员可以通过调用()方法来建议执行垃圾回收器。
10.1.3 垃圾回收算法
根集:正在执行的程序可以访问的引用变量的集合;
大多数垃圾回收算法都使用了根集( )的概念。垃圾收集首先需要从根开始确定哪些是可达的和哪些是不可达的;从根集可达的对象是活动对象,不能作为垃圾被回收;根集通过任意路径都不可达的对象满足被回收的条件。
的垃圾回收机制有多个算法,其中最简单的是引用计数法,是用来判断对象是否已经被抛弃的,其它算法都是用来确定何时回收以及如何回收。
引用计数法没有使用根集:当发现某对象的引用计数为0时,就将该对象列入待回收列表。
10.1.4 其它
l 垃圾回收只及内存有关;
l 对象可能不被垃圾回收。
如果没有面临内存即将耗尽的情形,是不会浪费时间去执行垃圾回收的,即无论是垃圾回收还是都不保证一定会发生,所以不能过分依赖它们。
10.2 ()方法
用途:每个对象都有一个继承自类的()方法,用于回收除内存之外的系统资源,如文件和网络连接等。
何时被调用:一旦垃圾回收器准备好释放某个对象占用的存储空间,则将首先调用其的()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
()方法可以被明确地调用,但它不能进行垃圾回收;如果某对象的()方法在执行时出现异常,该对象仍然可以被垃圾回收器回收。
11 系统
11.1
(1) 为什么使用?
1.4的.*包中引入了新的 类库,其目的在于提高速度;速度的提高来自于所使用的数据结构更接近操作系统执行的方式:通道和缓冲器。
1.4以前,一直使用流的方式完成,所有的被视为单个字节的移动,通过对象一次移动一个字节;及原来的有相同的作用和目的,但是它使用的是块,因此效率更高。
(2) 概述
l 什么是通道?
通道是对原包中流的模拟,到任何目的地(或者来自任何地方)的数据都必须通过一个对象。
通道及流的不同之处在于通道是双向的,而流只在一个方向上流动,通道可以读、写或者同时读写。
l 什么是缓冲区?
缓冲区实质上是一个容器对象;发给一个通道的所有数据必须先放到缓冲区中,同样地,从一个通道中读取的所有数据也必须先放到缓冲区中。
(3) 非阻塞技术
关键技术:观察者模式。
监控端口,如果有内容进来,会自动通知,这样就不必开启多个线程死等,实现了流畅的,不阻塞了。
11.2 内存映射文件()
内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。有了内存映射文件,我们就可以假定整个文件都放在内存中,而且可以把它当做非常大的数组来访问。
11.3 对象序列化
的对象序列化将那些实现了接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可以通过网络进行,这意味着序列化机制能够自动弥补不同的操作系统之间的差异。
“持久化”意味着一个对象的生存周期并不取决于程序是否正在执行,它可以生存于程序的调用之间。通过将一个序列化对象写入磁盘,然后在重新调用程序时恢复该对象,就能够实现持久化的效果。
对象序列化的概念主要是为了支持两种特性:一是的远程方法调用( , ),二是 。
l 序列化的意义如下:
1) 对象序列化可以实现分布式对象。主要应用例如:要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样;
2) 另外,序列化不仅保存一个对象的数据,而且递归保存对象中引用的每个对象的数据,可以将整个对象层次写入字节流中。
l 序列化的步骤:
1) 创建对象,然后将其封装在一个对象内;
2) 调用()即可将对象序列化,并将其发送给。
l 反序列化步骤:
1) 将一个对象封装在一个对象内,然后调用();
2) 将获得的引用向下转型。
12 面向对象
12.1 多态
方法的多态性:重载&重写。
12.1.1 重载
l 一个类中;
l 多个相同的方法名;
l 参数的个数、顺序、类型不相同。
12.1.2 重写
l 继承类中;
l 子类继承父类的方法;
l 子类可以覆盖父类的方法,但是不能降低方法的访问权限。
l 不能比父类方法抛出更多的异常(只能比父类抛出的异常少,或者是其子类)。
12.2 向上转型
把对某个对象的引用视为对其基类的引用。
向上转型中,调用的是子类的方法而不是基类的方法。
12.3 动态绑定
虚拟机调用一个类方法时,它会基于对象应用的类型(通常在编译时可知)来选择所调用的方法。相反,当虚拟机调用一个实例方法时,它会基于对象实际的类型(只能在运行时得知)来选择所调用的方法,这就是动态绑定。
在处理类中的成员变量时,并不是采用运行时绑定,而是一般意义上得静态绑定,所以在向上转型的情况下,对象的方法是子类的方法,但是属性是基类的属性。如果试图调用子类的成员变量,可以将其封装成的形式。
12.4 识别对象和类信息
l ( ),运行时类型识别
l 反射:允许在运行时发现和使用类型信息
12.4.1 运行时类型识别
在中,所有的转型都会得到检查。即使只是进行一次普通的括弧形式的类型转换,在进入运行期时仍然会对其进行检查,以确保它是我们所希望的类型,如果不是,就会返回一个,这种在运行期间对类型进行检查的行为称作“运行时类型识别”()。
l 类型信息的表示:对象
每个类都有一个对象(同名的文件)。
l 生成对象:类加载器
类加载器的工作时机:当程序第一次创建对某个类的静态成员的引用时,就会将该类动态加载到中(构造方法也被当作类的静态方法)。
l 为了使用某个类需要做的准备工作
1) 加载
由类加载器执行。检查该类的对象是否已经加载,如果尚未加载,则在所指定的路径下查找文件(字节码);一旦某个类的对象载入内存,它就用来创建该类的所有对象。
2) 链接
执行验证字节码、为静态域分配存储空间等操作。
3) 初始化
首次引用类的静态方法或非常数静态域时,对其初始化。
l 获得对象的引用的方法
1) (类的全限定名)
如果该类还没有被加载,则加载它,并自动初始化。
2) 类名
不会自动初始化
3) 对象()
l 查询对象的类型信息
1) 对象 类名
2) 类名(对象)
用和来比较对象时,不会考虑继承;而用和()判断时,会考虑类型信息(即是否从属于该类,是该类还是该类的派生类)。
12.4.2 反射
l 和反射的区别:
:编译器在编译时打开和检查文件
反射:文件在编译时是不可获取的,在运行时打开和检查文件(从本地机器上获得或者从网络获得)。
12.5 继承
继承的几个原则:
l 子类方法的访问权限不能弱于基类方法的访问权限;
l 子类方法抛出的异常不能大于基类方法抛出的异常;
l 的字段和方法不能被覆盖。
12.6 抽象类及抽象方法
抽象方法是否可以同时为?是否可以同时为?是否可以同时为?
答:因为父类的方法只能被子类的方法覆盖,不能表现出多态,因为多态是通过引用来实现的,所以和不可以同时使用;
方法是通过引入或其它本地语言来实现的,但在抽象方法中无法引入不同的实现,所以也不能同时使用;
因为同步的是同一对象,而不是不同实现的不同对象,所以和也不能同时使用。
l 当一个类中包含有抽象方法时,该类必须被限定为抽象类;
l 继承抽象类的子类必须实现基类中的所有抽象方法,否则便也是抽象类。
12.7 接口
接口的特征:
l 接口没有构造方法;
l 接口中声明的变量均为、、的;
l 接口中定义的方法均为和的;
l 接口中的数据成员必须初始化,而且均为常量。
l 接口本身具有或者包访问权限两种可视性;
l 接口中不提供任何方法体;
l 接口内所有的域都是和的;
l 接口内所有元素的可视性都是。
12.8 类的加载及初始化
类的加载及初始化过程为:
l 加载必要的类:先加载超类再加载子类,在加载过程中初始化数据成员。
l 先执行超类的构造器,再执行子类的构造器;在执行构造器之前,初始化数据成员,对于没有提供初始值的数据成员,将基本类型设为默认初始值,对象引用设为。
l 即:超类的成员变量→子类的成员变量→超类的成员变量→超类的构造方法→子类的成员变量→子类的构造方法。
12.9 内部类
l 在外部类的静态方法或者在外部类以外的地方创建内部类对象:
l 内部类用于外部类所有元素的访问权限;
l 用于在内部类中生成对外部类的引用,如;
l 用于在程序中其它地方创建对内部类的引用;必须使用外部类对象创建内部类对象,如:
= ();
= ();
每个类都有一个文件,由此产生对象。内部类的文件有严格的命名规则,即:
$
13 容器
13.1 的选择
底层实现
特性
适用场合
版本较低,避免使用
数组
访问快速
默认选择;
需要执行大量的随机访问
双向链表
插入和删除代价低廉
要经常在表中插入或删除元素
最佳做法:将做为默认首选,只有当需要额外的功能,或者当程序的性能因为经常从表中间进行插入和删除而变差的时候,才去选择。如果元素数量固定,既可以使用,也可以使用数组。
13.2 的选择
的特性:
l 不保存重复元素,元素必须实现()方法;
l 不保证维护元素的次序。
底层实现
特性
适用场合
散列
查询速度最快;
元素必须定义()方法
默认选择
散列+链表
具有的查询速度;
内部使用链表维护元素插入的次序;
元素必须定义()方法
红-黑树
可以从中提取有序的序列;
元素必须实现接口
13.3 的选择
底层实现
特性
适用场合
散列表
插入和查询的开销是固定的;
可以通过构造方法设置容量和负载因子,调整性能
默认选择
链表
取得元素的顺序是其插入次序,或者最近最少使用次序;
插入时比略慢,但迭代时更快
红黑树
总是保证有序;
可以通过()方法返回一个子树
弱键映射,允许释放映射所指向的对象
线程安全,不涉及同步加锁
用 代替 () 进行比较;
插入操作不会随着尺寸变大而明显变慢
14 多线程
14.1 线程的五种状态
l 创建状态:一个对象后,新建的线程对象便处于创建状态;此时它已经有了内存空间,但是还没有为其分配资源,所以还处于不可运行状态。
l 就绪状态:调用()方法你,线程便由创建状态进入就绪状态;此时,线程进入线程队列排队,等待为其服务。
l 运行状态:被调用并获得等资源时,便进入运行状态,自动调用()方法。
l 阻塞状态:如果发生了以下几种情况中的一种,便说明线程进入了阻塞状态:1,调用了该线程的()方法;2,调用该线程的()方法;3,调用该线程的()方法;4,该线程正在等待操作完成。当引起阻塞的原因被消除后,线程进入就绪状态。
l 终止状态:调用线程的()方法或者()方法。
请说明什么是线程?
线程是程序执行过程中,能够执行程序代码的一个执行单位,每个程序都至少有一个线程,即程序本身。
15 包和访问控制
16 类集框架
17 数据库
17.1 数据库编程
( )
25 / 25
展开阅读全文