1. JAVA中的几种基本数据类型是什么,各自占用多少字节
int 32bit
short 16bit
long 64bit
byte 8bit
char 16bit
float 32bit
double 64bit
boolean 1bit
2. String,Stringbuffer,StringBuilder的区别
String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁;
StringBuffer对象则代表一个字符序列可变的字符串;
StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
3. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序
- 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
- 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
- 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
- 父类构造方法
- 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
- 子类构造方法
4. Class.forName和ClassLoader区别
(1) class加载到JVM中有三个步骤:
- 装载:(loading)找到class对应的字节码文件;
- 连接:(linking)将对应的字节码文件读入到JVM中;
- 初始化:(initializing)对class做相应的初始化动作;
(2) Class.forName(“className”)
其实这种方法调运的是:Class.forName(className, true, ClassLoader.getCallerClassLoader())方法
参数一:className,需要加载的类的名称。
参数二:true,是否对class进行初始化(需要initialize)
参数三:classLoader,对应的类加载器
(3) ClassLoader.laodClass(“className”)
其实这种方法调运的是:ClassLoader.loadClass(name, false)方法
参数一:name,需要加载的类的名称
参数二:false,这个类加载以后是否需要去连接(不需要linking)
(4) 两种方式的区别
forName("")得到的class是已经初始化完成的
loadClass("")得到的class是还没有连接的
一般情况下,这两个方法效果一样,都能装载Class。
但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了
5. final的用途
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的变量不可以被改变
(1)如果引用为基本数据类型,则该引用为常量,该值无法修改;
(2) 如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
(3) 如果引用时类的成员变量,则必须当场赋值,否则编译会报错
参考资料:
6. 在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?
即使自定义了自己的类加载器,强行使用defineClass()方法去加载一个以‘java.lang’开头的类也不会成功,如果尝试这样做的话,将会收到一个由虚拟机自己抛出的‘java.lang.SecurityException:Prohibited package name:java.lang’异常