在生活和工作中有很多碎片时间可以用来看书,但通常书籍一般都五六百页,常常忘记自己看到哪里,遂开文章记录.选择这本书因我专业基础并不扎实,而且安卓也是基于java,此书可以弥补自己的不足。若看完本书将购买《Java核心技术卷2 高级特性(原书第9版)》。
第一章:Java程序设计概述
本章主要讲述了Java中关键的术语:简单性、面向对象、网络技能、健壮性、安全性、体系结构中立、可移植性、解释型、高性能、多线程、动态性。
面向对象有三个特征:封装、继承、多态。
因面试遇到过这个问题,在这里详细说明一下面向对象的定义和三个特征。
面向对象:
(1)对象
首先说明对象,对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。用一句装b的话来说,万物皆对象。
(2)对象的状态和行为。
对象具有状态,一个对象用数据值来描述它的状态。
对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
(3)类。
具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是独享的行为的抽象,用操作名和实现该操作的方法来描述。
(4)类的结构。
在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
①一般--具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。
②整体--部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。
(5)消息和方法。
对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
类中操作的实现过程叫做方法,一个方法有方法名、返回值、参数、方法体。
(6)面向对象
面向对象是一种思想,它基于面向过程,强调的是具备功能的对象,让对象调用方法解决问题。在开发中,要完成特定的功能就要去寻找具备相应功能的对象,如果找不到对象就创建对象,适用对象,维护完善对象。比如人们想吃饭,可以去饭馆买着吃也可以自己做,自己做就是面向过程,需要买菜、洗菜、做饭、再吃饭。去饭馆就是面向对象,给钱然后吃饭。省去了做的过程。再比如洗衣服,如果没有女朋友就得自己洗,就是面向过程。女朋友给洗呢,就是面向对象,但也有有了女朋友也面向过程的情况……
面向对象的思想特点是 1.让复杂的事情简单化。2.更符合人类的思维要求。3.角色从执行者变为指挥者。
(7)面向对象特征:封装
封装就是把不需要对外暴露的状态信息隐藏在对象内部,不允许外部程序直接访问对象的信息,而是通过该类对外提供公共的访问方式对其访问和操作。好处是将变化隔离,提高了安全性,便于使用,提高了重用性。
(8)面向对象特征:继承
当多各类中有很多共性的内容时,我们可以把这些共性内容抽取出来封装成一个类,让这些类与这个封装的类产生关系,这种关系就是继承。Java只支持单继承,但能够多层次继承。接口能够单继承,也能够多继承。
好处是提高了代码的复用性,提高了代码的维护性,提高了代码的扩展性,让类与类产生了关系,是多态的前提。弊端是增强了类与类的耦合性。
(9)面向对象特征:多态
多态就是同一事物在不同时刻表现出来的不同状态。
体现是父类引用指向子类对象,父类引用作为参数可以接收其子类对象,接口引用作为参数可以接收其实现类对象。
前提是类与类之间要有关系,要么继承,要么实现,要有方法重写,父类或者接口指向子类对象。
好处是提高了代码的维护性,提高了代码的扩展性
弊端是父类引用只能调用父类的方法,不能调用子类特有的方法和属性。
向上转型:父类或者父接口指向子类对象。
向下转型:把那个引用强制转为子类对象。
多态中成员方法和变量的特点:一般方法编译看左边(父类)运行看右边(子类),静态方法编译看左边运行看左边,变量是编译看左边运行看左边。
java 1.0版本 1996年 内容为语言本身 类与接口的数量211个
java 1.1版本 1997年 内容为内部类 类与接口的数量477个
java 1.2版本 1998年 内容为无 类与接口的数量1524个
java 1.3版本 2000年 内容为无 类与接口的数量1840个
java 1.4版本 2002年 内容为断言 类与接口的数量2723个
java 5.0版本 2004年 内容为泛型类型、“for each”循环、可变元参数、自动装箱、元数据、枚举、静态导入 类与接口的数量3279个
java 6版本 2006年 内容为无 类与接口的数量3793个
java 7版本 2011年 内容为基于字符串的switch、变形操作符、二进制字面量、异常处理改进 类与接口的数量4024个
第二章:Java程序设计环境
下载JDK、配置环境变量
开发工具(IDE):eclipse
applet已经很少有人使用,忽略。
第三章:Java的基本程序设计结构
java对大小写敏感
类名是以大写字母开头的名词,每一个单词的第一个字母都大写
整型 int4字节 short2字节 long8字节 byte1字节
浮点类型 float4字节 double8字节
char类型 通常表示字符常量 \b退格 \t制表 \n换行 \r回车 \"双引号 \'单引号 \\反斜杠
boolean布尔类型
变量、变量初始化
常量名使用全大写
运算符+-*/ ++ -- 前缀方式先先进性+-再运算,后缀方式使用原来的值。== !=
位运算符&(与)|(或)^(亦或)~(非)
数学常量与函数 Math.sin cos tan atan
数值类型之间的转换,强制类型转换
字符串 检测字符串是否相等equals “”和null 字符串的api
输入输出 格式化输出 Scanner
控制流程 条件语句 if()else{} 循环语句 while(true){} for(int x =1;x<=10;i++){} 多重选择 switch (case){}case可以为char byte short int 枚举
大数值BigInteger BigDecimal
数组 int[] a=new int[100] java中允许数组的长度为0 for each 循环(增强for) 数组排序 Arrays.sort
第四章:对象与类
1.面向对象程序设计概述(OOP)
Pascal设计设出书《算法+数据结构=程序》,面向对象程序设计将数据放在第一位,然后再考虑操作数据的算法。
1.1类
封装,关键在于绝对不能让类中的方法直接地访问其他类的实例域,所有类的父类Object
1.2类与类之间的关系
依赖(uses-a)一个类的方法操纵另一个类的对象,我们可以说一个类依赖另一个类。
聚合(has-a)一个对象包含另外一个对象
继承(is-a)类a扩展类b,类a不但包含从类b继承的方法,还会拥有一些额外的功能。
在java中任何对象变量的值都是对存储在另外一个地方的一个对象的引用,new操作符的返回值也是一个引用。
对实例域作出修改的方法成为更改器方法(mutator method)比如set和add方法,仅访问实例域而不进行修改的方法成为访问器方法(accessor method)比如get方法。
多个源文件的使用(109页)?
静态方法由类名直接调用,而不是用对象调用。
方法参数:一个方法不可能修改一个基本数据类型的参数,而对象引用作为参数就不能同了。
比如,double percent=10; tripleValue(percent);
public static void tripleValue(double x){x=3*x}
经过以上步骤,最终x还是等于10.
如果:harry=new Employee(...); tropleSalary(harry);
public static void tripleSalary(Employee x){x.raiseSalary(200)};
最终x和harry引用的Employee中的属性增加了3倍?大概是这个意思吧。
最终说明Java程序设计语言对对象采用的不是引用调用,实际上对象引用进行的是值传递。
Java程序设计语言中方法参数的使用情况:
一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
一个方法可以改变一个对象参数的状态。
一个方法不能让对象参数已用一个新的对象。
2.对象构造
重载:多个方法有相同的名字、不同的参数。返回值不属于方法签名的一部分,不能有两个名字相同,参数类型也相同却返回不同类型值的方法。
如果类中没有构造器,系统会提供一个无参构造,如果只有一个有参构造,不能使用无参构造创建对象。
类的参数名可以采用this.name 的形式访问实例域,this指示隐式参数,也就是被构造的对象。如果构造器的第一个语句形如this(...),这个构造器将调用同一个类的另一个构造。比如Android中自定义View 构造参数中,一个参数的调用两个参数的,两个参数调用三个参数的构造。
java有垃圾回收机制,可以为任何一个类添加finalize方法,这个方法将在垃圾回收器清楚对象之前调用。
3.包
类导入的两种形式,静态导入,包作用域,类路径,设置类路径,文档注释
4.类的设计技巧
一定要保证数据私有、一定要对数据初始化、不要在类中使用过多的基本类型、不是所有的域都需要独立的域访问器和域更改器、将职责过多的类进行分解、类名和方法名要体现他们的职责。
第五章:继承
1.类、超类和子类
超类不能使用子类的方法,子类能使用父类的方法和属性(域)。在子类方法中第一行添加super 便可先调用父类的方法,也可调用超类的构造器,如果没有调用,将自动调用。
2.多态
Employee e;
e=new Employee(...); 员工是一个员工
e=new Manager(...);经理是一个员工
动态绑定:
①编译器会获得所有可能被调用的候选方法
②编译器将查看调用方法时提供的参数类型,并进行匹配,这个过程称为重载解析
③如果是private方法static方法final方法或者构造器,编译器会准确知道调用哪个方法,这个称为静态绑定
④虚拟机预先为每个类创建了一个方法表,列出了签名和实际调用的方法,如果子类没有会在超类中查找。
3.final修饰类不可被继承,方法自动称为final方法,修饰方法不能被覆盖。String类也是final类。
强制类型转换:
double x =3.405; int nx=(int)x; 将x转换为整数,舍弃了小数部分。只能在继承层次内进行类型转换。
抽象类:
实现类重写抽象方法,类不含抽象方法,也可以将类声明为抽象类,抽象类不能被实例化(不能new),但可以创建具体子类。
受保护访问:
如果超类的属性设置为proteced,子类可以访问,其他类不可以。
4.Object所有类的超类
可以使用Object类型的变量引用任何类的对象。在java中只有基本数据类型不是对象。
相等测试与继承:Java语言规范要求equals方法具有下面的特性,自反性、对称性、传递性、一致性。
使用instanceof检测?调用getClass检测。
hashCode方法(散列码)
toString方法返回标示对象值的字符串
5.泛型数组列表?
给集合添加泛型,不必指出数组的大小,使用add将任意多的元素添加到数组中,使用size()替代length计算元素的数目,使用a.get(i)替代a[i]访问元素。
6.对象包装器与自动装箱
Integer 是int 的包装器,包装器还有Long、Float、Double、Short、Byte、Character、Void和Boolean.
list.add(Integer.valueof(3))这种变换成为自动装箱。int n=list.get(i)称为自动拆箱。
7.参数数量可变的方法。
方法参数为Object…args 是可变参数
枚举类:public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE}这个声明定义的类型是一个类,刚好有4个实例。每个枚举类型都有一个静态的values方法,它将返回一个包含全部枚举值的数组。
8.反射,能够分析类能力的程序称为反射。
反射可以用来:在运行中分析类的能力,在运行中查看对象,例如,编写一个toString方法供所有类使用。实现通用的数组操作代码。利用Method对象,这个对象很像C++中的函数指针。
Class类.Object类的getClass方法将会返回一个Class类型的实例。
异常捕获,try{}catch(Exception e ){}
利用反射分析类的能力-检查类的结构?
在运行时使用反射分析对象?
使用反射编写泛型数组代码,调用任意方法。
9.继承设计的技巧
将公共操作和域放在超类,不要使用受保护的域,使用继承实现“is-a”关系,除非所有继承的方法都有意义否则不要使用继承,在覆盖方法时不要改变预期的行为,使用多态而非类型信息,不要过多地使用反射。
第六章:接口与内部类
1.接口
在Java程序设计语言中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。
接口绝不能含有实例域,也不能在接口中实现方法,接口中所有方法都是public的。
接口不是类,不能new,但能声明接口的变量。接口中不能包含实例域和静态方法,可以包含常量,接口中的域被自动设为public static final.
类实现多个接口,使用逗号将实现的各个接口分隔开。
2.回调 是一种常见的设计模式,可以指出某个特定事件发生时应该采取的动作。
3.内部类 定义在另一个类中的类。
特点:
①内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
②内部类可以对同一个包中的其他类隐藏起来
③当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
局部内部类、匿名内部类、静态内部类
代理:利用代理可以在运行时创建一个实现了一组特定接口的新类,这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。
第七章:图形程序设计
略。
第八章:事件处理
略。
第九章:Swing用户界面组件
略。
第十章:部署应用程序和applet
1.部署应用程序:JAR文件、清单文件、可运行jar文件、沙箱?签名代码
2.应用程序首选项存储
属性映射:是一种存储键/值对的数据结构。属性映射经常被用来存放配置信息。?
特性:键和值都是字符串、键/值对可以很容易地写入文件或者从文件读出、用二级表存放默认值。
Properties() 创建一个空的属性映射
Properties(Properties defaults) 用一组默认值创建空的属性映射
Preferences API :提供了一个与平台无关的中心知识库,在Windows中,Preferences类用来注册存储信息。这个类具有树状结构,每个节点的路径类似于包名,api的设计者建议配置节点路径与程序中的包名匹配。每个节点都有一个用来存放键、值的独立表,用户可以用这张表存放数字,字符串或字节数组,但不适合存放序列化的对象。
第十一章:异常、断言、日志和调试
1.处理错误
异常分类:Throwable类
Error 类层次结构描述了Java运行时系统内部错误和资源消耗错误。
Exception层次结构分为RuntimeException 和 IOException.
RuntimeException包括:错误的类型转换,数组访问越界,访问空指针
IOException包括:试图在文件尾部后面读取数据、试图打开一个不存在的文件、试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。
声明已检查异常:在方法参数后面 throws FileNotFoundExcption.
声明情况包括以下4种:调用一个抛出已检查异常的方法、程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常、程序出现错误、java虚拟机和运行时库出现的内部错误。
捕获异常:try{}catch(ExceptionType e){} 如果在try中的代码抛出了catch中的异常,执行catch后的代码。
可以捕获多个异常,再次抛出异常与异常链、finally子句,一定会执行的语句、带有资源的try语句?分析堆栈跟踪元素
使用异常机制的技巧:异常处理不能代替简单的测试、不要过分地细化异常、利用异常层次结构、不要压制异常、在检测错误时,苛刻要比放任更好。
2.使用断言
assert 条件;比如 和 assert 条件:表达式;比如 assert i%3==2;
这两种形式都会对条件进行检测,如果结果为false,则抛出一个AssertionError 异常。在第二种形式中,表达式将被传入AssertionError的构造器,并转换成一个消息字符串。
3.记录日志
日志系统管理者是一个名为Logger.global的默认日志记录器
Logger.getGlobal().info("File->Open menu item selected");在默认情况下,这条记录会显示出如下所示的内容:
May 10,2013 10:12:15 PM LoggingImageViewer fileOpen
INFO:File->Open menu item selected
取消所有日志:Logger.getGlobal().setLevel(Level.OFF);
高级日志:日志记录级别 logger.setLevel(Level.FINE) SEVERE WARNING INFO 。。。
修改日志管理器配置,本地化?、处理器记录格式为xml、过滤器、格式化器、使用调试器
第十二章:泛型程序设计
1.类型的参数的魅力在于:使得程序具有更好的可读性和安全性。
泛型类?、泛型方法?、类型变量的限定?、泛型代码和虚拟机?
2.约束与局限性
/**
* instanceof运算符用法
* 运算符是双目运算符,左面的操作元是一个对象,右面是一个类.当
* 左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false
*
* 说明:(1)一个类的实例包括本身的实例,以及所有直接或间接子类的实例
* (2)instanceof左边操作元显式声明的类型与右边操作元必须是同种类或右边是左边父类的继承关系,
* (3)不同的继承关系下,编译出错
*/
不能使用基本类型实例化类型参数、运行时类型查询只适用于原始类型、不能创建参数化类型的数组、不能实例化类型变量、泛型类的静态上下文中类型变量无效、不能抛出或捕获泛型类的实例、注意擦除后的冲突、都没看懂???
通配符类型:Pair extends Employee>
通配符的超类型限定、无限定通配符、通配符捕获、反射和泛型
第十三章:集合
1.集合接口
数据结构
队列:可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数,当需要收集对象,并按照先进先出的规则检索对象时就应该使用队列。
队列的实现方式有两种,一种是循环数,另一种是用链表。
集合类的基本接口是Collection接口
add方法,Iterator 迭代器,一个是添加的方法,一个是反复调用next方法,访问集合中每个元素。从java5.0可用for each表达,
链表:在Java程序设计语言中,所有链表都是双向链接的,即每个节点还存放着指向前驱节点的引用。
数组列表、散列集、散列码、在java中散列表用链表数组实现,每个列表被称为桶。
树集,TreeSet、队列与双端队列、优先级队列、
数据结构:映射表 用来存放键/值对,如果提供了键就能查找到值。
映射表的视图有三种,键集、值集合和键/值对集。
专用集与映射表类
弱散列映射表、连接散列集和连接映射表、枚举集与映射表
EnumSet类没有公共的构造器,可以使用静态工厂方法构造。
2.集合框架
两个基本接口:Collection和Map.
boolean add(E element) 、V put(k key,V value) 插入添加 V get(k key) 读取某个元素
视图与包装器:轻量级集成包装器、子范围、不可修改的视图、同步视图、检查视图、关于可选操作的说明、批操作、集合与数组之间的转换、
3.算法
排序与混排Collections.sort、二分查找、简单算法、编写自己的算法
遗留的集合:hashtable类、枚举、属性映射表、栈、位集。
第十四章:多线程
1.多线程
一个程序同时执行多个任务,通常每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序称为多线程程序。
多进程与多线程的区别在于每个进程拥有自己的一整套变量,而线程则共享数据。
void start();启动这个线程,将引发调用run()方法立即返回,并且新线程将并行运行。
void run();调用关联Runnable的run方法
2.中断线程
interrupt 方法可以用来请求终止线程。
3.线程状态
new(新创建)、Runnable(可运行)、Blocked(被阻塞)、Waiting(等待)、Timed waiting(计时等待)、Terminated(被终止)
4.线程属性
线程优先级(setPriority)、守护线程(setDaemon(true))、未捕获异常处理器、
5.同步
锁对象(synchronized)、条件对象
锁可以用来保护代码片段,任何时刻只能有一个线程执行被保护的代码。
锁可以管理视图进入被保护代码段的线程。
锁可以拥有一个或多个相关的条件对象。
每个条件对象管理那些已经进入被保护的代码段但还不能运行的线程。
同步阻塞、监视器概念、final变量、原子性、死锁、线程局部变量、锁测试与超时、读/写锁、为什么弃用stop和suspend方法
6、阻塞队列
7、线程安全的集合
高效的映射表、集合和队列,写数组的拷贝,较早的线程安全集合(Vector和Hashtable),Callable与Future
8、执行器,线程池,预定执行,控制任务组、同步器、线程与Swing?
本书已看完,还有些不懂的地方以后再向其他人请教吧。看了本书卷二的目录,发现比较深并且与安卓关系不大,暂时先不看了吧。