1.局部内部类
局部内部类存在于方法块或者语句块中,不能有访问控制修饰符和static进行修饰
2.接口
- jdk1.8前的接口中只能有public abstarct类型的抽象方法和public static final类型的常量
- jdk1.8之后,接口中可以有static和default方法,其中由于接口可以多继承,如果多继承的接口中存在相同的静态方法不会报错,但是如果存在相同的默认方法,那么必须重写,否则编译报错。因为静态方法直接由
原接口.
调用,但是默认方法是可以继承下去的,所以必须只能有一个,就不能存在二义性。
interface A{
static void b(){
}
default void c(){
}
}
interface A1{
static void b(){
}
default void c(){
}
}
interface C extends A,A1{
@Override
default void c() {
}
}
3.继承和多态
解析:
多态:在运行时表现子类特性,当代码在new Sub的时候需要先去初始化父类,在运行callName的时候会去执行子类的callName方法,此时由于子类的baseName还没有初始化,所以就输出
null
3.2
解析:
- new B()-->super(5)-->子类.setValue(5)-->super.setValue(10)-->super.value=10
- 26行,getValue()-->super.value=11-->子类.setValue(11)-->super.value=22,第一次输出
22
- 26行value返回是11,子类.setValue(8)-->super.value=16
- 3行,getValue-->return 17,finally中setValue(17)-->super.setValue(34)-->super.value=34,第二次输出
34
- 第3行,返回17,第三次输出
17
4.ClassLoader
解析:
这题就比较坑了,Java中的ClassLoader共有四种,从底到顶分别为
Custom、AppClassLoader、ExtClassLoader、BootStrap
,但是需要注意的是,AppClassLoader的别名可以叫SystemAppClass,所以A是对的。双亲委派其实就是:现在需要Load A.class,那么就会按照这个顺序
Custom->Application->ExtClassLoader->BootStrap
进行loadClass,看看之前有没有Load进来过。没有Load过呢,就会按照这个顺序进行findClass, ExtClassLoader->Application->Custom
,比如说问你如何打破双亲委派,很显然,双亲委派是通过loadClass方法中不断使用parent.loadClass实现的,所以直接重写loadClass方法就可以打破了。
5.二进制运算
解析:这道题也是略有点坑,总觉得题目没有说清楚,首先明确一点,这里的a,b已经都是补码的状态了。其次需要知道-b=(~b)+1
开始运算:
-b = ~b+1 = "1000,0000,....,0000,0001";
a = "1111,0000,....,0000,0000";
a-b=0111,0000,....,0000,0001//这里是最高位产生了溢出,最终变成了正数,选C
6.编译几个class文件
解析:
一个Java文件中只能有一个主类,但是里面有几个类声明就会编译出几个class文件