第一章 概述
名词解释
体系结构中立:java编译器会生成与特定的计算机体系结构无关的字节码,只要有java运行时系统,就可以在许多处理器上运行,而且还可以跨素的翻译成本地机器的代码。
高性能:它通过即时编译器,一次把字节码编译为本地代码,并将结果缓存起来,在需要的时候重新调用,从而提高运行速度。
可移植性:各种类型的数据都明确的规定了其大小,不随处理器的改变而改变;二进制有严格的格式,这样就能轻松移植到其他处理器上执行。
第三章 JAVA语法基础
1.书中提到JAVA中的每个类都要有一个main方法,但我们平时设计的类里都没有main方法,怎么解释?
2.在jdk 5.0中用p表示指数。
3.浮点数不适合用于禁止出现舍入误差的金融计算中,因为浮点数采用的是二进制系统表示的,而在二进制中无法精确表示出0.1,就好象十进制无法精确表示出1/3一样,这时应该用BigDecimal。
4.熟悉math类和String类的常用方法。
5.JAVA中将String类的对象称为不可变字符串,原因是不能修改JAVA字符串,平时所谓的修改,只是将字符串变量指向了另外个字符串常量。equals方法判断两字符串内容是否相等,而‘==’检测两字符串的内存位置是否相等。
6.大数值BigInteger、BigDecimal,可以处理任意长度的数值,但是他们没有+ 、*等运算,而是使用他们的add()、multiply()方法。
7.Arrays类(不是Array类)方法:sort(type[] a)排序,binarySearch(type[] a,v)二分查找法查找v所在的位置,若数组a事先没有排序结果将返回负数。
第四章 类和对象
关键句子:
1. 一个对象并没有实际包含对象,而仅仅引用一个对象。
2. 为了保持数据的隐藏性,强烈建议将实例域标记为private。
3. 一发方法可以访问所属类的所有对象的私有数据。
4. 本地方法可以修改由final修饰的常量值。
5. 因为静态方法不能操作对象,所以不能在静态方法中访问实例域。但是,静态方法可以访问自身类的静态域。
6. 方法参数使用:
JAVA中的参数传递都是值传递。
1).一个方法不能修改一个基本数据类型的参数。
2).一个方法可以改变一个对象参数的状态。
3).一个方法不能让对象参数引用另一个对象(如果可以那就是指针即引用传递了)。
7. 变量在使用前必须进行初始化,否则会出现编译时错误,而域如果不初始化将为默认值(0、false或null)。
8. 仅当类没有提供任何构造器时,系统才会提供一个默认的构造器。若类提供了至少一个构造器,但是没有
提供默认的构造器,那么在构造对象时若不提供参数将视为不合法。
9. 调用构造器的步骤:
1).所有数据域被初始化为默认值(0、flase或null)。
2).按顺序执行所有域初始化语句和初始化块。
3).如果构造函数第一行调用了另一个构造器,则先执行第二构造器,再执行第一构造器主体部分。
10. 创建一类对象的方法称为工厂方法,如NumberFortmat类中的getNumberInstance()方法,此方法返回类型为
NumberFormat的对象。
11. 对静态域进行初始化可以使用静态初始化块,用static{}标志。可以利用静态初始化块写一个没有main函数
的程序。
12. 用类似import java.util.*;的形式导入所使用的类,对代码的大小没有任何负面影响,但是读者不易知道程序
加载了哪些类,可读性差一些。
13. 静态导入:JDK 5.0增加了导入静态方法和静态域的功能,但可读性明显降低,在使用Math类的方法和使用
Calendar类的常量时可以使用这种静态导入,使代码简洁。
14. 虚拟机如何定位类?
有关时间的两个类:Date类和GregorianCalendar类,前者用来表示时间点,后者是人们所熟悉的日历表示形式,用不同的类表示不同的概念是个很好的思想。
时间操作:
获取当前时间
获取某个时间的某个格式
设置时间
时间有关计算
涉及到的类有java.util.Date;java.sql.Date;java.text.SimpleDateFormate;java.util.Calendar;
1.获取当前时间直接用Date()既可。
2.获取时间格式 用到时间格式化类SimpleDateFormate,首先创建一个格式化的实例,并指定其时间模式与区
域;然后去格式化原始时间。代码示例:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日_HH时mm分ss
秒",Locale.SIMPLIFIED_CHINESE);//定义一个格式化器,包括一个模式和时区
String timeStr = sdf.format(new Date()); //真正格式化当前时间
3.设置时间 与获取时间类似,这里只写出代码示例
SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");
Date date = sdf.parse("2006年07月01日_14时00分00秒");
4.时间计算
主要用到Calendar类,此类可以轻松获取当前时间的年、月、日、小时、分、秒,获取到这些值后关于计算
只是简单整型数学算术了。代码示例:
Calendar ca1 = Calendar.getInstance();
Calendar ca2 = Calendar.getInstance();
ca1.setTime(date1);
ca2.setTime(date2);
int distanceHour = ca2.get(Calendar.HOUR_OF_DAY) - ca1.get(Calendar.HOUR_OF_DAY);
第五章 继承
1. super不能指向一个对象,不即不代表当前类对象引用,也不代表超类对象引用,他只是一个调用超类方法
的一个关键字。如果子类没有显式的调用超类的构造器,则将自动地调用超类默认的构造器。
2. 一个对象变量可以引用多种实际类型的现象被称为多态。尤其是一个对象变量可以引用其子类的对象。在
运 行时能够自动地选择调用的适当方法的现象称为动态绑定。如果方法是private、static、final或者构造器,
那么编译器可以准确地知道应该调用哪个方法。我们将这种调用方式称为静态绑定。在覆盖一个方法时,
子类方法不能低于超类方法的可见性。
4. 如果将一个类声名为final,其方法将自动地成为final,而它的域则不一定是final的。
5. 强制类型转换规则:只能在继承层次内进行类型转换;在将超类转换成子类之前,应该使用instanceof方法进
行检查。
6. 抽象类:它有什么必要?它可以包括非抽象方法和具体数据,不包含抽象方法的类也可以声名为抽象类,
但它仍然不可以实例化。可以定义一个抽象类型的对象变量,但它只能引用非抽象子类的对象。
7. 数据封装原则之一,在本类做了任何修改不影响其他地方。
8. 4个访问修饰符的可见性:private只对本类可见;public对所有类可见;protected对本包及所有子类可见;默
认对本包可见。
9. Object类的equals方法设计讲究很多原则,他用于比较两个对象是否相等,是比较两个对象的内存地址是否
相等。若子类不覆盖此方法,相等性比较将也是比较两个变量是否引用同一快内存空间,这显然是没有任
何意义的,所以设计类时一般要覆盖掉Object类的equals方法。
10. hashCode方法:是由对象导出的一个没有规律的整型值,所以若x和y是两个不同对象,其散列码基本上不
会相等。Object的散列码值是对象的存储地址。若子类重写了Object的equals方法,也必须重写Object的
hashCode,因为两个对象相等,他们必须保证有相同的散列码。
11. toString()方法,用于返回表示对象状态值的字符串,Object中的toString()方法得到类名和散列码,很多方法
都覆盖了Object的toString方法,用于输出对自己有意义的结果
12. ArrayList是一个采用类型参数的泛型类。此功能在JDK5.0以后才出现。
13. 将基本数据类型如 int转换为包装类型如 Integer的构成叫打包,反过来叫拆包。在JDK5.0以前必须手工地
插入打包和拆包的代码,现在编译器可以自动的进行打包拆包动作。
14. JDK5.0以后支持参数个数可变的方法。
15. 反射:这个久闻的词对我来说一直很神秘,今天拜读了这章内容,了解了一些概念,但仍然没有领会到
其中的原理,只听说spring的IOC就是基于这个原理而设计的。这里我只记录一些需要记忆性的概念、方
法,至于深层的原理,还得再来一遍了。
能够分析类能力的程序称为反射。可以利用反射机制:
a. 在运行时分析类的能力。
b. 在运行时查看对象,例如,编写一个toString方法供所有类使用。
c. 实现数组的操作代码。
d. 利用Method对象,使用一个叫“对象指针”的东西。
反射是一个功能强大但复杂的机制,它的主要使用对象是工具构造者,并不针对项目开发中的代码编写
者。
16. Class类:在程序运行期间,JAVA运行时系统始终为所有的对象维护一个被称为运行时的类型标志。这个
信息保存着每个对象所属的类足迹。虚拟机利用运行时信息选择相应的方法执行。可以通过专门的JAVA
类访问这些信息。保存这些信息的类被称为Class。虚拟机为每个类型管理着一个Class对象。
java.lang.Class类:
static Class forName(String className)返回类名为className的Class对象。
Object newInstance()返回一个该类的实例。
典型的应用在加载数据库驱动时,先创建一个驱动类的对象,再返回该类的实例。
Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
17. 使用反射分析类的能力(检查类的结构):
在java.lang.reflect包中有三个类Field、Method、Constructor分别用语描述类的域、方法和构造器。公用的方
法有getName()--返回该条目的名字;getModifiers()返回一个整形数值,此数值用于判断该条目的修饰符。
Class类的getFields、getMethods、getConstructors方法将分别返回类支持的Public域、方法和构造器数组,其
中包括类的公有成员。Class类的getDeclareFields、getDeclareMethods、getDeclareConstructors方法将分别返回
类中声明的全部域、方法和构造器,其中包括私有域,但不包括超类中的条目。
... ...
第六章 接口与内部类
1. 接口不是类,而是一组对类的需求描述,这些类要遵从接口描述的同意格式进行定义。接口中的所有方法
自动地属于public,域自动的属于public static final,因此在声明方法时,不必提供关键字public,但为了增强
代码阅读性,依然要加上关键字public。接口不能含有实例域和静态方法,但可以包含常量。
2. JAVA机制提供接口的必要性:JAVA是一种强制类型语言,在调用方法的时候编译器将会检查这个方法是
否存在。检查接口中是否存在此方法比在本类中检查是否存在此方法要快得多?
3. 书中提到的一个有用例子:Arrays类中有个sort(Object[] a)方法,可以对a中的元素排序,但要求数组中的元
素必须实现compareable接口,并且在元素对象中要提供具体的compareTo()方法。compareTo()方法的设计很
有讲究,其一是要符合“反对称”原则。
4. 对象克隆:生成一个对象的一个拷贝,对它进行修改不会影响原来对象的状态。默认的克隆操作是“浅拷
贝”,它并没有克隆包含在对象中的对象,比方说user.menus。为了实现对象的深烤贝,我们应该重写
Object类的clone()方法,对对象内部的对象域再进行克隆。
5. 使用clone()方法并不必须要实现Cloneable,因为clone()方法可以从Object类中继承过来;是这样的吗?
6. 回调:是一种设计模式,在这种设计模式中,可以指出某个特定事件发生时应该采取的动作。但如下:
for(int i = 0;i < 10;i++){
if(i == 5){
System.out.println("i's value is:" + i);
}
}
即当i==5时采取out.println()事件,这算是回调吗?回调与方法调用区别在哪里?
7. 内部类:定义在类中的类。它有如下特点:
a. 内部类方法可以访问该类定义的所在的作用域中的数据,包括私有的数据。
b. 内部类可以对同一个包中的其他类隐藏起来。
c. 当想定义一个回调函数,又不想编写大量代码时,使用匿名内部类非常便捷。
对于 ${c}完全不能理解,内部类到底有多大必要,没有体会。
8. 代理:...
第11章 异常与调试
俩概念--1、已检查异常,需要我们进行声明或捕获的异常类型,当异常发生时,我们要寻找合适的处理器进行异常处理;2、未检查异常,要么不可控制(error),要么就应该避免他们的发生(数组下标越界)。
posted on 2007-08-11 01:55
杨爱友 阅读(1066)
评论(2) 编辑 收藏