zoukankan      html  css  js  c++  java
  • Java常用知识整理

    一、ClassLoader

      当运行一个Java 程序时,JVM启动,运行bootstrap classLoader(启动类加载器),将Java核心的API加载进来;接着调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class;这就是一个程序最基本的加载过程。

      最常用的两个方法应该是ClassLoader.loadClass(String name , boolean resolve)和Class.forName(String name) ,这两个方法都是用来加载Class的,但在作用上却有一些区别。

      loadClass的方法是被保护的,用户能够直接调用的是loadClass(String name) , resolve默认为false,即不解析类,则说明loadClass在加载类的时候不对该类进行解析,因此不会初始化该类。forName(String name ) 等同于Class.forName("className",true,CALLCLASS.class.getClassLoader),即在加载的时候就会将该类进行解释和初始化

      在JVM加载类时需要经过三个步骤:装载、连接、初始化。

      装载:

      1.通过类的全名产生对应类的二进制数据流。(注意,如果没找到对应类文件,只有在类实际使用时才抛出错误。)

      2.分析并将这些二进制数据流转换为方法区(JVM 的架构:方法区、堆,栈,本地方法栈,pc 寄存器)特定的数据结构(这些数据结构是实现有关的,不同 JVM 有不同实现)。这里处理了部分检验,比如类文件的魔数的验证,检查文件是否过长或者过短,确定是否有父类(除了 Obecjt 类)。

      3.创建对应类的 java.lang.Class 实例(注意,有了对应的 Class 实例,并不意味着这个类已经完成了加载链链接!)。

      连接:

      1.验证,即验证class是否符合规则,如检查 final class 又没有被继承,检查静态变量的正确性等等;

      2.准备,对类的成员变量分配空间。虽然有初始值,但这个时候不会对他们进行初始化(因为这里不会执行任何 Java 代码)。具体如下:所有原始类型的值都为 0。如 float: 0f, int: 0, boolean: 0(注意 boolean 底层实现大多使用 int),引用类型则为 null。

      3.解释,为类、接口、方法、成员变量的符号引用定位直接引用。这一步是可选的,可以在符号引用第一次被使用时完成,即所谓的延迟解析(late resolution)。但对用户而言,这一步永远是延迟解析的,即使运行时会执行 early resolution,但程序不会显示的在第一次判断出错误时抛出错误,而会在对应的类第一次主动使用的时候抛出错误!

      初始化:

      1.如果基类没有被初始化,初始化基类。

      2.有类构造函数,则执行类构造函数。

    说明:Java中字符只以一种形式存在,那就是Unicode

            在生成对象的过程中,会先初始化对象的成员变量,然后再执行构造器。也就是说类中的变量会在任何方法(包括构造器)调用之前得到初始化,即使变量散步于方法定义之间。父类的构造器调用以及初始化过程一定在子类的前面,即父类的构造函数一定会被调用。

    二、类型转换

      简单数据类型由低级到高级的顺序为(byte,short,char)- int - long - float - double ;

      低级到高级可自动转换,高级到低级、同级之间都需要强制转换。

      1. 默认1.0表示的是double型,如果需要表示float,需写为1.0f。

      2.  当char x= 'x' ; int i = 10;  公式false? i : x 输出的值为120,因为两者都是变量,会将低级升级到高级的表示形式;false?10:x ,x的输出仍为x,是因为Java编程规范中提到当两个表达式有一个是常量表达式(10),另外一个是T类型,且常量表达式可以被T表示时,输出结果是T类型。

      3. 若byte a = 1, byte b = 2 , a * b 的数据类型却是int ,因为在计算时会将byte,char 类型数据都转为int.

      4.三目运算是右结合性。

    三、异常

      Error和exception都是继承自Throwable类。

      Error是不可控制的,经常用来表示系统错误或者底层资源的错误。

      Exception可以是可被控制(checked) 或不可控制的(unchecked),应该在应用层进行处理,throw表示抛出一个异常,throws是在方法体外部声明可能会抛出某些异常。

    程序必须捕获或声明所有的非运行时异常。

    四、串行化

       Java的“对象串行化”能够将实现了Serializable接口的对象装换成一组byte,这样日后要用的时候就能够把这些对象恢复出来,并重新构建该对象。串行化主要任务是写出对象实例变量的数值,如果变量是另一对象的引用,则引用对象也要串行化,这个过程是递归的。

      串行化能够保存对象的非静态成员变量,即不能保存任何成员方法和静态的成员变量,且保存的只是变量的值,对于任何修饰符都不能保存。

      transient 关键字,用来表示一个域不是该串行化的一部分。该关键字使用场景如:为了保证用户信息的安全性,仅串行化用户名而不串行化用户密码。因为串行化过后可能会将数据存放至磁盘或网络上,不在java安全机制控制之中。

    五、内存管理

       Java 的内存管理就是内存的分配和释放,程序员需要通过关键字new来为每个对象申请内存空间,所有的对象都在中分配空间。

      对象的释放则是由垃圾回收器来管理。判断一块内存空间是否符合垃圾回收器的收集标准只有两个:

        1. 给对象赋予空值null , 以后再也没有调用过。

        2. 给对象赋予新值,即重新分配了内存。

      为了更好地了解垃圾回收机制,我们可以用有向图来表示,即对象为有向图的顶点,引用关系为有向图的边,有向边从引用者指向被引用者。从有向图的起始点(如main进程)不可达的对象都时符合垃圾回收机制回收的对象。

      内存泄露就是存在一些被分配的对象,这些对象包含两个特点:

        1. 在有向图中对象是可达的。

        2. 对象是无用的,即这些对象永远不会再被使用。

      Object 的clone方法是protected ,不能直接调用,子类必须实现Cloneable接口。    

      

  • 相关阅读:
    设计模式复习-状态模式
    设计模式复习-观察者模式
    设计模式复习-建造者模式
    设计模式复习-外观模式
    推荐算法-协同过滤
    设计模式复习-模板方法模式
    设计模式复习-原型模式
    设计模式复习-代理模式
    神经网络与机器学习 笔记—泛化和交叉验证
    神经网络与机器学习 笔记—改善反向传播的性能试探法
  • 原文地址:https://www.cnblogs.com/xuexue-bit/p/5125933.html
Copyright © 2011-2022 走看看