举例讲解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"));
}
}
(0)

相关推荐

  • Java 基础之内部类详解及实例

     Java 基础之内部类详解及实例 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类 而心脏又在人体当中,正如同是内部类在外部内当中  实例1:内部类的基本结构 //外部类 class Out { private int age = 12; //内部类 class In { public vo

  • 深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    java中的类可以是static吗?答案是可以.在java中我们可以有静态实例变量.静态方法.静态块.类也可以是静态的. java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top level class).只有内部类可以为static.      静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同. (1)内部静态类不需要有指向外部类的引用.但非静态内部

  • java 内部类(匿名类,匿名对象,静态内部类)详解及实例

    内部类的介绍 定义在另外一个类中的类,叫内部类 成员内部类 1..new 创建成员内部类必须先创建外部类的实例,然后通过.new 创建内部类的对象 2..this 可以通过外部类的类名.this去访问外部类的所有属性和方法. public class Test1 { String name = "asnd"; public static void main(String[] args) { Test1 test1 = new Test1(); Inner mInner = test1.

  • 老生常谈 java匿名内部类

    匿名内部类: 1.匿名内部类其实就是内部类的简写格式. 2.定义匿名内部类的前提: 内部类必须是继承一个类或者实现接口. 3.匿名内部类的格式:  new 父类或者接口(){定义子类的内容} 4.其实匿名内部类就是一个匿名子类对象.而且这个对象有点胖.    可以理解为带内容的对象. 5.匿名内部类中定义的方法最好不要超过3个. abstract class AbsDemo { abstract void show(); } class Outer { int x = 3; /* class I

  • java中匿名内部类详解

    java匿名内部类: 1:匿名内部类,匿名内部类也就是没有名字的内部类. 2:匿名内部类的作用 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写. 3:匿名内部类的实现 匿名内部类的两种实现方式:第一种,继承一个类,重写其方法:第二种,实现一个接口(可以是多个),实现其方法. 4:匿名内部类的创建 匿名类是不能有名称的类,所以没办法引用它们.必须在创建时,作为new语句的一部分来声明它们. package com.mianshi.test; /** * 类名称:Anonymou

  • Java创建内部类对象实例详解

    Java创建内部类对象实例详解 要想使用new生成一个内部类的实例,需要先指向一个外部类的实例,也就是先生成外部类的实例, 因为内部类可以调用外部类的成员,当没有外部类实例的时候也就没有这些成员的内存空间,内部类在实例化的时候,调用外部类的成员就会出错,所以需要使用外部类的实例 + 点 + new 的方式实例化一个新的内部类 class TestInner{ public static void main(String [] args) { Outer outer = new Outer();

  • 简单谈谈java中匿名内部类构造函数

    先看看下面的代码能不能编译通过: public static void main(String[] args) { List l1 = new ArrayList(); List l2 = new ArrayList(){}; List l3 = new ArrayList(){{}}; System.out.println(l1.getClass() == l2.getClass() ); System.out.println(l2.getClass() == l3.getClass() );

  • 举例讲解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

  • JVM入门之类加载与字节码技术(类加载与类的加载器)

    1. 类加载阶段 1.1 加载阶段 将类的字节码载入方法区中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有: _java_mirror 即 java 的类镜像,例如对 String 来说,就是 String.class,作用是把 klass 暴 露给 java 使用 _super 即父类 _fields 即成员变量 _methods 即方法 _constants 即常量池 _class_loader 即类加载器 _vtable 虚方法表 _ita

  • php类自动加载器实现方法

    本文实例讲述了php类自动加载器实现方法.分享给大家供大家参考.具体如下: 这里autoload 可兼容以下格式: Cache_File_Json class_xxx.php xxx.class.php   xxx.php php代码如下: function __autoload($className){ $dirs=explode('_',$className); $fileName=array_pop($dirs); //print_r($dirs); $filePath=$fileName

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

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

  • 概述java虚拟机中类的加载器及类加载过程

    1. 类加载子系统 1.1 概述 类加载子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine 决定 加载的类信息存放于一块成为 :方法区的内存空间,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 字节码中的常量池加载到 方法区 -----> 运行时常量池信息 1

  • PHP实现的简单路由和类自动加载功能

    本文实例讲述了PHP实现的简单路由和类自动加载功能.分享给大家供大家参考,具体如下: 项目目录如下 入口文件index.php <?php define('WEBROOT', 'C:/Users/Administrator/Documents/NetBeansProjects/test'); require_once(WEBROOT.'/core/environment.php'); core__app::run(); // 类自动加载文件environment.php <?php //根据类

  • Yii2框架类自动加载机制实例分析

    本文实例讲述了Yii2框架类自动加载机制.分享给大家供大家参考,具体如下: 在yii中,程序中需要使用到的类无需事先加载其类文件,在使用的时候才自动定位类文件位置并加载之,这么高效的运行方式得益于yii的类自动加载机制. Yii的类自动加载实际上使用的是PHP的类自动加载,所以先来看看PHP的类自动加载.在PHP中,当程序中使用的类未加载时,在报错之前会先调用魔术方法__autoload(),所以我们可以重写__autoload()方法,定义当一个类找不到的时候怎么去根据类名称找到对应的文件并加

  • 深入浅出讲解Java中的枚举类

    目录 一.枚举类的使用 二.如何定义枚举类 背景:类的对象只有有限个,确定的.举例如下: > 星期: Monday (星期一).-.. Sunday (星期天) > 性别: Man (男). Woman (女) > 季节: Spring (春节).--.. Winter (冬天) > 支付方式: Cash (现金). WeChatPay (微信). Alipay (支付宝) BankCard (银 行卡). CreditCard (信用卡) > 就职状态: Busy . Fr

  • java类的加载过程以及类加载器的分析

    我们知道,我们写的java代码保存的格式是 .java, java文件被编译后会转换为字节码,字节码可以在任何平台通过java虚拟机来运行,这也是java能够跨平台的原因. 那JVM是如何来让我们写的java文件运行的呢? 这个问题通常的问法好像是:类是如何被加载的. 记得第一次遇见这个问题的时候,同学给我的回答是: 1.虚拟机会加载JDK里类的核心包 2.虚拟机会加载JDK里类的扩展包 3.虚拟机会加载JDK里类的系统包 4.虚拟机再会加载我们写好的java类. 初学的时候,大家都这么说,好像

  • 详解Java 类的加载机制

    一.类的加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接

随机推荐