学会复盘-d1

1.Java

1.做题

       

 1.

           jar         将许多文件组合成一个jar文件

            javac    编译

            javadoc 它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。

           javah 把java代码声明的JNI方法转化成C\C++头文件。 JNI可参考java核心技术卷二第12章

2.

类变量(静态变量)在类加载过程的准备阶段会进行一次赋值,一般是空值或constantValue属性值,同时在初始化阶段会调用类构造器再进行一次赋值。而实例变量在创建对象时会调用实例构造器进行一次赋值。因此无论是类变量还是实例变量,在使用前都是非空的。而局部变量没有初始化过程,在使用前必须赋值。

3.

一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职:

  • Bootstrap ClassLoader     负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
  • Extension ClassLoader      负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
  • App ClassLoader           负责加载当前java应用的classpath中的所有类。

比较两个类是否相等,只有这两个类是由同一个类加载器加载才有意义。否则,即使这两个类是来源于同一个Class文件,只要加载它们的类加载器不同,那么这两个类必定不相等。

补充:

  • 1. 什么是类加载器?

把类加载的过程放到Java虚拟机外部去实现,让应用程序决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。  

  • 2. 有哪些类加载器,分别加载哪些类

类加载器按照层次,从顶层到底层,分为以下三种: 
(1)启动类加载器 : 它用来加载 Java 的核心库,比如String、System这些类 
(2)扩展类加载器 : 它用来加载 Java 的扩展库。

(3) 应用程序类加载器 : 负责加载用户类路径上所指定的类库,一般来说,Java 应用的类都是由它来完成加载的。

  • 3. 双亲委派模型

我们应用程序都是由以上三种类加载器互相配合进行加载的,还可以加入自己定义的类加载器。称为 类加载器的双亲委派模型 ,这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用 组合关系 来复用父加载器的。

  • 4. 双亲委托模型的工作原理

是当一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个加载请求的时候,子加载器才会尝试自己去加载。

  • 5. 使用双亲委派模型好处?(原因)

第一:可以避免重复加载,当父亲已经加载了该类的时候,子类不需要再次加载。

第二:考虑到安全因素,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类装载器。

4.

ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。ThreadLocal 不是用于解决共享变量的问题的,不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制.  静态变量若要共享的话,必须要进行同步,即使有副本。

5.

堆和栈的区别

6.集合常考

7.构造方法调用

1.使用new创建对象会自动调用构造方法

   Person person=new Person();

          但不是所有的创建对象的时候会调用,比如clone方法(对象的复制),

          序列化的时候也会创建对象,这是有jvm创建的,所以也不会调用

2. 在类的其他构造方法中可以用this()的方式调用其他构造方法;

3. 在类的子类中则可以通过super调用父类中指定的构造方法;

4. 在反射中可以使用newInstance()的方式调用。

            1.使用Class类的newInstance方法会调用构造方法

             Person person=(Person) Class.forName("com.Person").newInstance();

           2.用反射中的constructor类 的newInstance 调用构造方法

           Constructor  constructor=Person.class.getConstructor ();

              Person person=constructor.newInstance();

猜你喜欢

转载自blog.csdn.net/nowfuture/article/details/89812746
d1
今日推荐