类加载方式:
显式加载(传入类全限定名的加载)、动态加载(编译时类可以缺席的加载):
ClassLoader.loadClass(className) :只执行装载过程。
Class.forName(className):执行类的装载、链接、初始化过程。https://www.cnblogs.com/heyjia/p/11338612.html
Class.forName(className)是初始化类,newInstance()是实例化类。new是初始化加实例化类。(new关键字和Class类的newInstance()的区别:https://blog.csdn.net/qq_33704186/article/details/86596614)
隐式加载(非传入类全限定名的加载)、静态加载(编译时类不可以缺席的加载):
创建类对象
使用类的静态域
创建子类对象
使用子类的静态域其他特殊的隐式加载:
在JVM启动时,BootStrapLoader会加载一些JVM自身运行所需的class
在JVM启动时,ExtClassLoader会加载指定目录下一些特殊的class
在JVM启动时,AppClassLoader会加载classpath路径下的class,以及main函数所在的类的class文件。https://blog.csdn.net/jiyiqinlovexx/article/details/51090751
方法调用方式:
显式调用(写明调用方法)、隐式调用(未写明调用方法)举例:
(1)toString()调用:
显式调用:System.out.println(object.toString());
隐式调用:System.out.println(object);
(2)父类无参构造方法调用:
显式调用:public class Person { public Person (){ System.out.println("Person ()"); } } public class Student extends Person { public Student(){ super(); } public static void main(String[] args) { new Student(); } }
隐式调用:
public class Person { public Person (){ System.out.println("Person ()"); } } public class Student extends Person { public Student(){ } public static void main(String[] args) { new Student(); } }
方法分派方式:
动态分派:根据实际类型(变量实例类型)分派方法版本。如子类给父类赋值,父类调用方法时,根据实例类型,即子类类型匹配子类方法。运行阶段确定方法版本,由JVM负责。
静态分派:根据静态类型(变量声明类型)分派方法版本。如方法重载,根据参数声明类型匹配方法。编译阶段确定方法版本,由编译器负责。Java是静态多分派,动态单分派语言。