这是我学习欧立奇《Java程序员面试宝典》第三版的笔记。这篇是基本语法部分。
ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象。
在Java中,字符只以一种形式存在,那就是Unicode。在JVM内部一切都由Unicode表示,而输出到外部后(JVM和OS的交界处就是各种输入/输出流)转换为其他形式的编码。
Java用了中间缓存变量的机制,所以,j=j++可换成如下写法:
temp=j;
j=j+1;
j=temp;
float z = 1.0编译不能通过。因为1.0是double型,需要1.0f才能通过。
可以使用包装类进行基本类型的强制转换。例如:
float f1=100.00f;
Float f2=new Float(f1);
Double d1=f2.doubleValue();
s+1为int, 不能直接赋值给short。
main方法必须是public的,但可以抛出异常、声明参数。
使用三目运算符时,Java会针对精度类型执行自动类型转换。
&、|与&&、||的重要区别是:前者是非短路运算,后者是短路运算。
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
>>32等于>>0
若有多个catch块,只会匹配其中一个异常类并执行catch块代码。
finally结构在return前被执行。
Java I/O(略)
判断一个数是不是2的阶次方数:将该数减1之后执行“与”操作
for循环可以不包括{},但仅限于执行语句。
利用筛选法查找素数(略)
一段程序可以建议垃圾回收执行,但不保证一定会被执行。
典型的内存泄露原因:全局集合、缓存、ClassLoader驻留在内存中
clone方法是在object中定义的,但只有实现了clonable接口,才可以调用clone方法,否则会抛出异常。
wait()是在Object类中定义的方法,而sleep不是。
Java内部类和C++嵌套类有什么区别?
C++:虽然嵌套类在封装类内部定义,但它是一个独立的类,基本上与封装类不相关。它的成员不属于封装类,同样,封装类的成员也不属于该嵌套类。嵌套类的出现只是告诉封装类有一个这样的类型成员供其使用。
Java:静态嵌套类与C++嵌套类类似,可以直接访问封装类的static成员,但是,如要访问非静态成员就要使用一个封装类的对象作为载体。非静态嵌套类允许我们直接访问封装类的所有成员,不论静态成员还是非静态。
map.entryset()返回entryset,顺序是随机的。
hashmap和hashtable有什么区别?
hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。
HashMap是Hashtable的轻量级实现(非线程安全的实现)。
Java中不可以覆盖构造函数,子类的构造函数会自动先调用父类的构造函数。
有默认的复制构造函数,但只提供位复制。
重载和覆盖的不同:
重载(overload):对于类的方法(包括从父类中继承的方法),方法名相同,参数列表不同的方法之间就构成了重载关系。
覆盖 (override):也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆盖了后,除非用super关键字,否则就无法再调用父类中的方法了。
静态方法不能被覆盖。
新建子类对象时,在父类的构造方法中调用了xxx方法,而xxx方法在子类中被覆盖过,则会在父类中直接调用子类的xxx方法。
匿名内部类不能继承其它类,但可以实现接口。
抽象类不能是final的。