int fourthBitFromRight = (n&8)/8 = (n & (1<<3) >> 3
2、>>>对前面的位补0,而>>对前面的位填符号位。Java中没有<<<。
3、移位操作符右边的参数要先进行模32运算(当左边的变元是long型,则模64),如1<<35 = 1<< 3 = 8。浮点运算的中间结果程度是不一致的。有些处理器适用80bit浮点存储器,有些则使用64bit、80bit。直到最后才把结果截断为64bit,这样做会产生更准确的结果,还能避免指数溢出,而64bit的所有中间计算都被截断,不仅可能产生溢出,而且速度慢。Strictfp修饰的方法必须使用严格的浮点运算,以产生再生结果(满足可移植性)。
4、要得到完全可预测的结果比快速性能更为重要的话,请使用StrictMath类。
5、数字之间的合法转化。P44。
6、布尔值和任何数字类型之间不能强制类型转换。
7、只有字符串常量会被共享,而表达式常量产生的结果并不共享。“= =”是判定两个串是否在同一位置。
8、String name = JOptionPane.ShowInputDialog(“xx?”);将启动一个新线程,故要用System.exit(0);结束程序。
9、java.text.NumberFormat可产生下列数据的标准格式化器:数字、货币、百分数。不过该类和地区locale是相关。类Format.printf(“%8.2f”,1000.0/3.0)有类似C的效果。
10、数组定义 int [] a 等价于int a[];
11、数组常量只能在初始赋值时可用,如int [] a= {1,2};而不能int [] a;a= {1,2}。
12、长度为0的数组是合法的,如new int[0];但是数组若没初始化,则不能进行任何操作。
13、不要编写返回指向可变对象的引用的访问方法;确实需要的话,返回clone对象。
14、final的实例变量必须保证在构造函数结束之后它的值已被赋值,否则无法编译。
15、System类中有一个setOut方法可以把System.out(静态变量)设置为另一个流,是因为该方法是本地方法,本地方法可以绕过java语言的访问控制机制。
16、java总是使用传值调用,对象引用是通过值来传递的。一个有力的证明是方法不能让对象参数指向新的对象。
17、声明一个对象时实例字段的执行顺序:
1)初始化所有实例字段为默认值(0,false,null),
2)按类声明中出现的次序依次执行所有字段初始化语句和初始化块;
3)调用构造函数执行。
18、里氏替代原则:只要程序需要一个超类对象,那么就可以用一个子类对象替代它——多态。
19、如果方法是private、static、final或是构造函数,编译器能准确地判断应该调用哪个方法,这称为静态绑定,开销要小。而动态绑定需要查找方法表。
20、超类转化为子类,应先使用instanceof操作符进行类型检查。
21、编写完美equals示例:
class Employee
//父类equals
class Employee
{
intfield1;
Date field2;
//...
publicboolean equals(Object o)
{
//1、是否是同一个对象
if(this==o) returntrue;
//2、如果null,返回false
if(o==null) returnfalse;
//3、如果类不匹配,就不可能相等。注意用instanceof不严格
if(this.getClass()!=o.getClass()) returnfalse;
//4、转型并测试所有字段,这里field1是基本类型,field2是非基本类型
Employee other = (Employee)o;
returnthis.field1==other.field1 && this.field2.equals(other.field2);
}
}
//子类equals
class Manager extends Employee
{
longfield3;
Object field4;
//...
publicboolean equals(Object o)
{
//1、调用父类代码
if(!super.equals(o)) returnfalse;
//2、检查子类中特有的字段
Manager other = (Manager)o;
returnthis.field3==other.field3 && this.field4.equals(other.field4);
}
}
22、若没有覆盖Object的toString方法,会打印出类名和对象的内存位置。
23、ArrayList:数组列表。可自动调整大小的数组。
24、Class类的实例一一对应于所有对象及基本类型的运行时类型,有三种方法可以得到:
1)Class c1=对象名.getClass();
2)Class c1=Class.forName(“类名”);
3)Class c1=类名.class;
然后可以用c1.newInstance();建立新对象,但这里调用的是默认构造函数,想要调用其它构造函数,就要使用Constructor类中的newInstance方法。
25、接口中的方法自动就是public的,字段自动为public static final,不能有实例字段和静态方法;
26、内部类能够访问其所属外部类中的私有域而其它普通类则不行。
内部类实例含有一个隐式引用,指向哪个实例华它的外部对象,通过这个指针,内部类可以访问外部对象的全部状态。静态内部类没有这种隐含指针。
27、内部类对象并不是外部类的实例字段,而是外部类方法中的局部变量。
28、只有内部类才可能是私有的。普通类总是具有包可见性或公有可见性。私有的普通类是没有意义的。
29、内部类放在方法块中称为局部内部类,其优点有
1)能够对外部完全隐藏;
2)不仅能访问外部类中的字段,还能访问final的局部变量。
30、静态内部类:只是把一个类隐藏在另一个类中,并不需要内部类具有对外部对象的引用。声明一个内部类为静态的可去掉生成的引用。
31、Swing——“被绘制的”非对等体用户界面类。JFrame
AWT——窗口工具箱的底层机制(如事件处理)。Frame
32、得到屏幕大小:Toolkit.getDefaultToolkit().getScreenSize();
33、得到事件队列:EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
34、applet的生命周期:
Init()(只执行一次)-〉start()(可多次)-〉stop()(可多次)-〉destroy()(只一次)
35、全部异常类都是Throwable的子类,Throwable又分为Error和Exception。Error描述运行中的内部错误以及资源耗尽的情况,不应该抛出。Exception又分为RuntimeException和IOException。
36、RuntimeException包括:1)错误的类型转换;2)数组访问越界;3)试图访问空指针;
IOException包括:1)试图从文件尾读数据;2)试图打开一个错误格式的URL;3)试图构造一个并不存在的Class对象。
37、RuntimeException的原则:如果出现一定是你的错误。程序员可以通过预防加以解决。
38、Error子类以及RuntimeException子类是未检查异常。其它异常为已检查异常。
39、子类覆盖的方法中所能抛出的“已检查异常”绝对不能超过其父类方法所抛的异常。
40、通常处理异常的最佳方法是让调用者来处理错误,即在方法名后throws;捕捉并处理那些已知如何处理的异常,而传递那些不知如何处理的异常。
41、只能throws已检查异常,Error和RuntimeException不能被throws。但是,所有异常都可以被catch,我们更多是catch已检查异常。
42、使用异常的建议:
1)异常控制不能代替简单的测试;(只有在异常情况下才使用异常)
2)不要过分细化异常;
3)不要压制异常,至少要catch它,但可以不处理;
4)不要羞于传递异常。
43、Java中三种处理系统失败的机制:1)抛出异常;2)日志功能;3)断言功能。
44、断言失败是不能恢复的错误,仅仅用在程序开发和测试阶段,日志是在整个程序生命周期中都使用。
45、对象序列化机制算法:
1)保存到磁盘的所有对象都获得一个序列号;
2)当要保存一个对象时,先检查对象是否已经保存;
3)如果以前保存过,只需写入已保存的具有序列号X的对象标识;否则才保存它的所有数据;
读数据时,逆转上述过程。
浙公网安备 33010602011771号