举例讲解Java的内部类与类的加载器_java

内部类

class A {
  //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用
  class Inner1 {
    int k = 0;
    // static int j = 0; //A加载后,Inner1没有加载,所以这个 静态变量j 无法立即使用,报错
    final int z = 0;
    /*static void say1() { 

    }*/
    void say2() { 

    } 

  }
  //Inner2 在A加载好后就可以使用了
  static class Inner2 {
    int k = 0;
    static int j = 0;
    final int z = 0;
    static void say1() { 

    }
    void say2() { 

    }
  }
  // 调用内部类
  void c() {
    final int x = 0;// final 修饰后,可以由局部内部类调用
    new A().new Inner1();// 非静态内部类Inner1,需要它所属的类的对象调用
    new A().new Inner1().say2(); 

    A.Inner2.say1();
    new A.Inner2().say2();// 非静态方法say2(),需要它所属的类的对象调用 

    class Inner3 {
      void print() {
        System.out.println(x);
      }
    }
    /*
     * 方法中的局部内部类的调用,需要在声明后 因为,
     * 在方法里的执行顺序是 从上往下,而这个类
     * 就相当于一个 局部 变量 当然 要先声明,再使用
     */
    new Inner3().print();
  } 

}

类的加载器 java.lang.ClassLoader
java.lang.ClassLoader 类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即java.lang.Class 类的一个实例。除此之外,ClassLoader 还负责加载 Java 应用所需的资源,如图像文件和配置文件等。不过本文只讨论其加载类的功能。为了完成加载类的这个职责,ClassLoader 提供了一系列的方法:
getParent() 返回该类加载器的父类加载器。
loadClass(String name) 加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。
findClass(String name) 查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。
findLoadedClass(String name) 查找名称为 name 的已经被加载过的类,返回的结果是 java.lang.Class 类的实例。
defineClass(String name, byte[] b, int off, int len) 把字节数组 b 中的内容转换成 Java 类,返回的结果是 java.lang.Class 类的实例。这个方法被声明为final 的。
resolveClass(Class<?> c) 链接指定的 Java 类。

public class ClassLoaderTest extends ClassLoader {
  public static void main(String[] args) throws SecurityException, NoSuchMethodException { 

    // 根类加载器,加载的核心类库
     URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
     for (URL u : urls) {
     System.out.println(u);
     }
    // 扩展类 加载器,,加载的系统属性:java.ext.dirs 返回的路径下的 class
    System.err.println("扩展类(extention classLoader)加载器"
        + ClassLoader.getSystemClassLoader().getParent());//非继承关系,只是意义上
    System.out.println(System.getProperty("java.ext.dirs"));
    // 应用(系统 application classLoader)类加载器,, 加载系统环境变量 PATH 或 CLASSPATH
    // 指定的JAR包和类路径
    System.err.println("应用(系统)类加载器" + ClassLoader.getSystemClassLoader());
    // System.out.println(System.getenv("PATH"));
    // System.out.println(System.getenv("CLASSPATH"));
}
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 内部类
, 类
加载器
java 静态内部类 加载、java 内部加载机制、java内部类加载、java 内部类加载顺序、举例说明内部收益率,以便于您获取更多的相关知识。

时间: 2024-11-08 12:03:58

举例讲解Java的内部类与类的加载器_java的相关文章

解析Java虚拟机中类的初始化及加载器的父委托机制_java

类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始化: 2.在静态代码块中进行初始化. 没有经过显式初始化的静态变量将原有的值.   一个比较奇怪的例子: package com.mengdd.classloader; class Singleton { // private static Singleton mInstance = new Singleton();// 位置1 // 位置

举例讲解Java设计模式编程中模板方法模式的运用实例_java

模板方法模式定义为: 在一个方法中定义了一个算法的骨架或者步骤,而将一些步骤延迟到子类中去实现.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某一些步骤. 模板方法在基类中定义了一个操作的流程顺序,能够保证该步骤按序进行,有一些步骤的具体实现在基类中已经声明,而将一些变化的步骤的具体实现交给了子类去实现,从而就达到了延迟一些步骤到子类中,模板方法一个最大的好处就是能够设定一个业务流程能够按照一定严格的顺序执行,控制了整个算法的执行步骤. 这个方法将算法定义成一组步骤,其中凡是想让

举例讲解Java中数组和字符串类型的使用方法_java

Java数组 数组是具有相同数据类型的一组数据的集合,Java支持多为数组,一维数组的每个基本单元都是基本数据类型的数据,二维数组就是每个基本单元是一维数组的一维数组,以此类推,n维数组的每个基本单元都是n-1为数组的n-1维数组.下面以一维数组为例说明Java数组的用法. 1.数组声明 数组声明有如下两种形式(方括号的位置不同): int arr[]; int[] arr2; 2.数组初始化 数组初始化也有两种形式,如下(使用new或不使用new): int arr[] = new int[]

Java 从Jar文件中动态加载类

由于开发的需要,需要根据配置动态加载类,所以简单测试了一下JAVA动态加载类 定义接口 package loader; public interface HelloIface {     public String hello();          public String sayHi(String name); } 实现接口 在其他插件类实现此接口,并导出为jar,如D:/tmp/test.jar package loader; public class HelloImpl impleme

代码分析-一道Java笔试题,求解答(关于类的加载与初始化)

问题描述 一道Java笔试题,求解答(关于类的加载与初始化) 自己查了一些资料,还是看不懂这个程序的输出结果,求各位详细解释初始化和执行过程,谢! public class Alibaba { public static int k = 0; public static Alibaba t1 = new Alibaba("t1"); public static Alibaba t2 = new Alibaba("t2"); public static int i =

Class类的加载以及类的产生原理java学习 第十天

/*当类产生一个实例的时候会加载类的Clsaa对象  JVM根据类名加载class字节码文件 文件 java中所有类都是从object产生的 为什么这么说呢  ?   比如说我们自己定义的类  的 Class对象会自动调用 newInstance函数来返回object类对象  然后 转换成我们的类  当然我们也可以利用这点来获取 一个 我们定义的类的对象 然后进行操作  类的静态代码段是在类加载的时候才会执行 也就是 new Class() */class  Test{ public  stat

jvm系列(一):java类的加载机制

java类的加载机制   1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个类被"首次主动使用"时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载

spring启动component-scan类扫描加载过程---源码分析

最近因为写书的事情,一段时间没有写博客了,有朋友最近问到了spring加载类的过程,尤其是基于annotation注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里会从WEB中使用spring开始,中途会穿插自己通过new ClassPathXmlApplicat

类的加载顺序

问题描述 在java中,例如在一个Student类中,其属性和方法就不详细的介绍了,在Students1=newStudent();和Students2=newStudent()他们的加载顺序?是怎么加载的? 解决方案 解决方案二:按照创建的顺序加载,由ClassLoader加载的解决方案三:建议多看书,你这提问说实话看不懂,只有Student一个类,何谈顺序解决方案四:按你写代码的顺序加载咯解决方案五:肯定有Object了,然后在加载你运行的那个类的字节码,然后在加载Studet的字节码,初始