2021.6.4错题整理
1、Java中的关键字
Java Language Keywords
Here is a list of keywords in the Java programming language. You cannot use any of the following as identifiers in your programs. The keywords const and goto are reserved, even though they are not currently used. true, false, and null might seem like keywords, but they are actually literals; you cannot use them as identifiers in your programs.
java中true ,false , null在java中不是关键字,也不是保留字,它们只是显式常量值,但是你在程序中不能使用它们作为标识符。
其中const和goto是java的保留字。java中所有的关键字都是小写的,还有要注意true,false,null, friendly,sizeof不是java的关键字,但是你不能把它们作为java标识符用。
2、接口与抽象类
1、一个类可以有多个接口;
2、一个类只能继承一个父类;
3、接口中可以不声明任何方法,和成员变量
interface testinterface{
}
4、抽象类可以不包含抽象方法,但有抽象方法的类一定要声明为抽象类
abstract class abstclass{
abstract void meth();
}
3、ArrayList的扩容机制
Arraylist默认数组大小是10,扩容后的大小是扩容前的1.5倍,最大值小于Integer 的最大值减8,如果新创建的集合有带初始值,默认就是传入的大小,也就不会扩容
private static final int DEFAULT_CAPACITY = 10; private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity)
{ // overflow-conscious code int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0) newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
4、关于StringBuffer
1.String对象不可变、StringBuffer对象可变的含义: 举个例子:String str = "aa"; str = "aa"+"bb"; 此时str的值为"aabb",
但是"aabb"不是在开始的字符串"aa"后面直接连接的"bb",
而是又新生成了字符串"aabb",字符串"aa"一旦被初始化,
那么它的值不可能再改变了。
StringBuffer strb = StringBuffer("aa"); strb.append("bb");
此时的strb的值也为"aabb",但是"aabb"是直接在开始的字符串"aa"后面连接的“bb”,并没有生成新的字符串。
5、关于数组
A 数组是对象,因为可以调用方法,从上面的输出结果可以看出不同类型的数组具有不同的类
B 数组长度是不能动态调整的
C Java中的数组中的数据是连续存储在一块内存中的,所以可以通过下标(即偏移量)的方式访问
D 查看源码可以知道数组的equals方法是object的equals,比较的是内存地址
6、关于final
- final用于声明属性、方法和类:
- final属性不可变,指的是引用不可变,而不关心指向对象内容的变化,被final修饰的变量必须初始化
- final方法不可被子类重写,可以实现inline(内联)的机制
- final类不可以被继承(如String、StringBuffer),所有的方法不可以被重写,但其内的非final变量可以被修改
- finaally作为异常处理的一部分,只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定被执行(特殊情况不会被执行,如try语句前出现异常或try语句块中出现的异常没有被捕获),经常被用在需要释放资源的情况下或是释放锁
- finalize是Object类的一个方法,在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收(一旦垃圾回收器准备好释放对象占用的空间,将首先调用该方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存),从功能上来说,finalize()方法与c++中的析构函数比较相似,但是Java采用的是基于垃圾回收器的自动内存管理机制,所以finalize()方法在本质上不同于C++中的析构函数。
判定一个对象objA是否可回收,至少要经历两次标记过程:
-
如果对象objA到GC Roots没有引用链,则进行第一次标记。
-
进行筛选,判断此对象是否有必要执行finalize()方法
- 如果对象objA没有重写finalize()方法,或者finalize()方法已经被虚拟机调用过,则虚拟机视为“没有必要执行”,objA被判定为不可触及的。
- 如果对象objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建的、低优先级的Finalizer线程触发其finalize()方法执行。
- finalize()方法是对象逃脱死亡的最后机会,稍后GC会对F-Queue队列中的对象进行第二次标记。如果objA在finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA会被移出“即将回收”集合。之后,对象会再次出现没有引用存在的情况。在这个情况下,finalize方法不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的finalize方法只会被调用一次。
7、this和super
1. 构造器中第一行默认是super(),一旦直接父类的构造器中没有无参的,那么必须显式调用父类的某个有参构造。
2. 构造器中第一行的super()可以换成this(),但是this()和super()只能出现一个。
3. super,this关键字与super(),this()不是一回事,前者表示当前调用者的父类与其本身,后者是为了构造器相互调用。

浙公网安备 33010602011771号