Java的连接与初始化

原文作者:iceAeterna
原文链接:http://www.cnblogs.com/iceAeterNa/p/4876747.html

序言

Java虚拟机通过装载、连接、初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证、准备、解析三个部分。其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再去解析。

解析

解析过程可以推迟到类的初始化之后再进行,但这是有条件的,Java虚拟机必须在每个类或接口主动使用时进行初始化。
以下为主动使用的情况:

  • 创建某个类新的实例(无论直接通过new创建出来的,还是通过反射、克隆、序列化创建的)
  • 使用某个类的静态方法
  • 访问某个类或接口的静态字段
  • 调用JavaAPI中的某些反射方法
  • 初始化某个类的子类(要求其祖先类都要被初始化,否则无法正确访问其继承的成员)
  • 启动某个标明为启动类的类(含有main()方法)
    主动使用会导致类的初始化,其超类均将在该类的初始化之前被初始化,但通过子类访问父类的静态字段或方法时,对于子类(或子接口、接口的实现类)来说,这种访问就是被动访问,或者说访问了该类(接口)中的不在该类(接口)中声明的静态成员。

Java之静态绑定和动态绑定

概念

  • 程序绑定:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来,Java中绑定分为绑定分为 静态绑定动态绑定
  • 动态绑定:在面向过程中又称为后期绑定,在程序运行期进行了绑定,根据实际情况有选择的进行绑定
  • 静态绑定:在面向过程中又称为前期绑定,在程序编译期进行了绑定,即在还没运行时,就已经加载到内存

    对比

  • 动态绑定
    • 又称为后期绑定
    • 发生在运行时期
    • 虚方法(可以被子类重写的方法)会根据运行时的对象进行动态绑定
    • 动态绑定使用对象信息来完成
    • 典型应用是方法的重写(Override)
  • 静态绑定
    • 又称为前期绑定
    • 发生在编译时期
    • 使用private或static或final修饰的变量或者方法(包括构造方法)
    • 静态绑定使用类信息来完成
    • 典型应用是方法重载(Overload)

Java重载匹配优先级

前情提要

Java面向对象的三个基本特征:继承、封装和多态;多态主要体现在重载和重写;

示例代码

无意间看到这样一个问题,为了方便直观,就用代码来描述问题,有这样一个类:

public class OverloadPriority {

    public static void print(Object arg) {
        System.out.println("parameter type = Object");
    }

    public static void print(int arg) {
        System.out.println("parameter type = int");
    }

    public static void print(long arg) {
        System.out.println("parameter type = long");
    }

    public static void print(double arg) {
        System.out.println("parameter type = double");
    }

    public static void print(float arg) {
        System.out.println("parameter type = float");
    }

    public static void print(char arg) {
        System.out.println("parameter type = char");
    }

    public static void print(Character arg) {
        System.out.println("parameter type = Character");
    }

    public static void print(char... arg) {
        System.out.println("parameter type = char...");
    }

    public static void print(Serializable arg) {
        System.out.println("parameter type = Serializable");
    }

    public static void print(Comparable<?> arg) {
        System.out.println("parameter type = Comparable");
    }

    public static void main(String[] args) {
        // int
        print('g');
    }

}
| | 总字数统计:93.5k