场景:
做题出现的问题错题
错题描述:
下面程序的执行结果是?
public class P {
public static int abc = 123;
static{
System.out.println("P is init");
}
}
public class S extends P {
static{
System.out.println("S is init");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(S.abc);//会输出什么?
}
}
选项如下:
A. P is init<br />123
B. S is init<br />P is init<br />123
C. P is init<br />S is init<br />123
D. S is init<br />123
原因分析:
属于被动引用不会出发子类初始化
子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化
答案:A
错题描述2:
@Override
面向对象程序设计方法的优点包含:
(多选题)选项如下 :
A 可重用性
B 可扩展性
C 易于管理和维护
D 简单易懂
原因分析:
我居然敢选D,胆子太肥了把。
这道题考察的面向对象的三大特点:
1. 封装性(可重用性)
2. 继承性(可扩展性)
3. 多态性 (易于管理和维护)
答案: A B C
错题描述3:
以下类型为Final类型的为()
A.HashMap
B.StringBuffer
C.String
D.Hashtable
原因分析:
StringBuilder , StringBuffer ,String 都是 final 修饰的,
其中String 的不可变性指的是使用字面量的方式创建d时,字符串的值是在字符串常量池中。
如果进行二次赋值,并没有改变常量池中的值,而是在常量池中创建一个新的值,变量指向新的值。
答案: B C
总结
1 子类引用父类的静态字段,调用父类构造方法,不调用子类构造方法
2 面向对象的封装,继承,多态
3 String底层被final修饰,不可变性指的是字符串常量池的值