专业的JAVA编程教程与资源

网站首页 > java教程 正文

2020年Java基础面试题及答案汇总(2020java基础面试题)

temp10 2024-09-21 03:55:26 java教程 8 ℃ 0 评论

 什么情况下会触发类的初始化?

  (1)、遇到 new, getstatic, putstatic, invokestatic 这4条字节码指令。

2020年Java基础面试题及答案汇总(2020java基础面试题)

  (2)、使用 java.lang.reflect 包的方法对类进行反射调用。

  (3)、初始化一个类的时候,如果发现其父类还没有进行过初始化,则先初始化其父类(注意:

  如果是接口的话,则不要求初始化父类)。

  (4)、当虚拟机启动时,用户需要指定一个要执行的主类(包含 main()方法的那个类),虚拟机会先初始化这个主类。

  (5)、当使用JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getstatic, REF_putstatic, REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则先触发其初始化。

  外加几种不会初始化的例子:

  (1)、同类子类引用父类的静态字段,不会导致子类初始化。至于是否会触发子类的加载和验证,则取决于虚拟机的具体实现。

  (2)、通过数组定义来引用类,也不会触发类的初始化。例如下面这个语句:

  1Animal[] a = new Animao[10];

  并不会触发 Animal 类的初始化。

  (3)、引用一个类的常量也不会触发初始化。

  谈谈你对解析与分派的认识。

  1.方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期间是不可变的,即“编译时可知,运行不可以变”,这类目标的方法的调用称之为解析。

  Java 语言中符合“编译器可知,运行期不可变”这个要求的方法,主要包括静态方法和私有方法两大类。

  2.解析调用一定是个静态的过程,在编译期就完全确定,在类加载的解析阶段就将涉及的符号引用全部转变为可以确定的直接引用,不会延迟到运行期再去完成。而分派(Dispatch)调用则可能是静态的也可能是动态的。于是分派方式就有静态分派和动态分派。

  下面我来解释下静态分派和动态分派。

  静态分派

  看下面这段程序

  1//定义几个类 2 3public abstract class Animal { 4 } 5class Dog extends Animal{ 6 } 7class Lion extends Animal{ 8 } 910class Test4{ 11 public void run(Animal animal){12 System.out.println("动物跑啊跑");13 }14 public void run(Dog dog){15 System.out.println("小狗跑啊跑");16 }17 public void run(Lion lion){18 System.out.println("狮子跑啊跑");19 } 20 //测试21 public static void main(String[] args){22 Animal dog = new Dog();23 Animal lion = new Lion();;24 Test4 test4 = ew Test4();25 test4.run(dog);26 test4.run(lion);27 }28}

  运行结果是

  动物跑啊跑

  动物跑啊跑

  相信大家学过重载的都能猜到是这个结果。但是,为什么会选择这个方法进行重载呢?虚拟机是如何选择的呢?

  在此之前我们先来了解两个概念。

  先来看一行代码:

  Animal dog = new Dog();

  对于这一行代码,我们把Animal称之为变量dog的静态类型,而后面的Dog称为变量dog的实际类型。

  现在我们再来看看虚拟机是根据什么来重载选择哪个方法的。

  对于静态类型相同,但实际类型不同的变量,虚拟机在重载的时候是根据参数的静态类型而不是实际类型作为判断选择的。并且静态类型在编译器就是已知的了,这也代表在编译阶段,就已经决定好了选择哪一个重载方法。

  由于dog和lion的静态类型都是Animal,所以选择了run(Animal animal)这个方法。

  静态分派的典型应用就是方法的重载的,现在应该知道什么是静态分派了吧?

  动态分派

  和静态分派类似,所谓动态分派就是就是根据方法的实际类型来选择调用哪个方法,而实际类型是需要到达运行期才能知道。像重写就是动态分派的典型应用了。

  如何定义个类加载器?你使过哪些或者你在什么场景下需要个定义的类加载器吗?

  可以把自己自定义的类加载器继承 ClassLoader,然后重写 findClass() 方法,把自己的类加载逻辑写到 findClass() 方法中去。

  使用类加载器的场景:

  加载特定路径的 class 文件

  热部署加载 class 文件

  从网络中加载一个加密的 class 文件


原文:2020年Java基础面试题及答案汇总

作者:动力节点

来源:微信公众号

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表