1.分析如下程序,并基于问题进行解答
Class<?> c1=Object.class;
Class<?> c2=Class.forName(“java.lang.Object”);
Class<?> c3=new Object().getClass();
问题?
1)Object 类被加载了几次?1次
2)c1,c2,c3指向的对象是同一个吗?
3)c2 对应的泛型"?"可以换成Object吗? 不可以
2.分析如下程序,并基于问题进行解答
class A{
static{
System.out.println(“A.static”);
}
}
问题:
- A 类被加载时一定会执行静态代码块?不一定
- static 代码块是否执行与类的加载方式有关?正确
3.说说你了解JDK中的默认类加载器,以及
采用的类加载机制?
1)类加载器:(ClassLoader)
a)AppClassLoader (自己写的类)
b)ExtClassLoader (jre/lib/ext)
c)BootStrapClassLoader(jre/lib/)
2)默认类加载机制:双亲委派模型
4.我们可以自己写类加载器吗?你是从哪里了解到
要自己写类加载器以及为什么要自己写?
可以,在使用tomcat中间件,mybatis,spring等框架
时,发现内部都使用了自定义的类加载器.
5.你了解的类加载有哪些阶段?
1)加载
2)连接
3)初始化
6.分析如下程序,回答相关问题
class A{
static int a=100;
static final int b=200;
static{}
}
class B extends A{
static{}
}
问题:
1)当我们基于B访问A类的a属性时
a)A类会被加载吗?会
b)B类会被加载吗?会
c)A的static代码块会执行吗?会
d)B的static代码块会执行吗? 不会 (因为B为被动加载)
思考:基于B访问A类的b属性时又会怎样执行?
7.分析如下程序,给出优化策略?
class A{
static int[] array=new int[1024*1024];
public static void show(){}
}
当我们访问A类的show()方法时会触发A类的加载,并且初始化
array这个数组,请问如何设计可以延迟array的初始化(这个数组
还必须使用static修饰)?
方案:将array数组的初始化放到一个静态内部类中以实现延迟
加载.
8.分析如下程序,给出相关结果
Object o1=new Object();
Object o2=new Object();
请问:
1)o1==o2; 不等于
2)o1.equals(o2);不等
3)o1.hashCode()==o2.hashCode(); 不一定
9.如何理解JAVA中的实例对象,以及其作用?
1)实例对象本质就是内存中的一块区域.
2)其作用:封装数据(pojo),处理业务(controller,service,dao)
10.如何理解对象逃逸?
对象在方法内创建,但在方法外有引用,这样的对象可以理解为
逃逸对象,而逃逸对象只能分配堆中,不能栈上分配.
11.什么样的对象可能会分配在栈上?
1)方法内部创建的小对象
2)对象没有逃逸
12.说说Java中堆内存的构成,以及对象的分配?
1)构成:年轻代(伊甸园区,2个幸存区),老年代
2)大部分新创建的实例对象都会存储在伊甸园区,假如比较大
且伊甸园区没有足够的存储空间,可以直接分配在老年代.