JAVA基础知识

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’异常

【史上最全阿里 Java 面试题总结】

【String、StringBuffer和StringBuilder的区别】

【java类的实例化顺序】

【class.forname和classloader区别】

【final关键字的作用】

【JAVA中final关键字的作用】

【在自己的代码中,如果创建一个 java.lang.String 类,这个类是否可以被类加载器加 载?为什么】

你可能感兴趣的:(JAVA基础知识,面试)