首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 的嵌套类(内部类和静态嵌套类)

class NestedClass {        ...    } } 复制代码  内部类与静态嵌套类    嵌套类有静态和非静态两种,其中静态的称为静态嵌套类(static nested classes...),非静态的称为内部类(Inner Classes)  一个嵌套类是包含它的外部类的一个成员,内部类能够访问外部类的其他成员,而静态嵌套类没有访问外部类的权限  作为外部类的成员,嵌套类能被声明为private...一个静态嵌套类与其他任何 top-level class 一样和他的外部类的其他成员相互作用。...实际上,为了封装的便利性,一个静态嵌套类的作用机制和其他被封装的 top-level class相同。   ...由于静态嵌套类是通过外部类名来访问的:   OuterClass.StaticNestedClass   所以可以通过以下的语法来创建静态嵌套类的对象:   OuterClass.StaticNestedClass

88320

Java嵌套类

参考链接: Java嵌套接口 本文来自于Java深入解析——透析Java本质的36个话题  Java的嵌套类分为 静态成员类(静态嵌套类)、内部类(非静态嵌套类)、嵌套接口。...内部类还可以分为内部成员类、本地内部类、匿名内部类。  一、静态成员类  习惯上将它成为静态嵌套类。标记为在类中使用 static 声明的类。...静态成员类可以访问外围类的任何成员,包括声明为private的成员。但是非静态的外围成员,则需要经过恰当的对象引用才能访问。因为是静态成员类,所以可以不依赖于外围类而独立存在并访问。...在继承方面,静态成员类与外围类也没有什么区别,在访问权限允许的情况下,任何类都可以继承静态成员类,静态成员类也可以继承任何(允许继承的)类或者接口。...而静态成员又是不需要对象就可以直接访问的,由于这种依赖与矛盾关系,内部类不可以申明为静态成员(包括静态成员变量、静态方法、静态成员类或嵌套接口)或静态初始化块。

66730
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java嵌套类

    参考链接: Java中的嵌套接口 java程序语言允许你在一个类里面再声明另一个类,这样的类成为嵌套类,说明如下:   class OuterClass {     ...    ...非静态嵌套类可以访问它的封装类的其他成员,即使这些成员声明是private。静态嵌套类不能访问封装类的其他成员。...类的逻辑分组—如果一个类只是被其他一个类使用,那么合乎逻辑的是把它嵌套到该类,让这两个类在一起。嵌套这样的帮助类可以让包更加精简。   ...更可读性,可维护性的代码—在顶级类里嵌套小类,让代码更靠近使用的地方。   静态嵌套类   和类方法,类变量一样,一个静态嵌套类是和它的外部类关联的。...就像静态类方法一样,一个静态嵌套类不能直接引用封装类的实例变量或者方法—它只能通过封装类的引用访问它们。   注意:一个静态嵌套类访问它的封装类(和其他类)的实例成员,就像访问其他顶级类一样。

    1.3K20

    类加载器与类的加载过程

    类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。...加载的类信息存放于一块称为方法区的内存空间。...除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 类加载器ClasLoader角色 class file存在于本地硬盘上...Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。...由于Java采用的是懒加载策略,只有当我们需要用到这个类的时候才会去加载他  初始化阶段就是执行类构造器方法()的过程。

    18230

    类的加载

    概念 类加载 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象 链接:将Java类的二进制代码合并到...JVM的运行状态之中的过程 验证:确保加载的类信息符合JVM规范,没有安全方面的问题 准备:正式为类变量(static)分配内存并设置类变量默认初始化值的阶段,这些内存都将在方法区中进行分配 解析:虚拟机常量池的符号引用...(类构造器是构造类的信息的,不是构造该类对象的构造器) 当初始化一个类的时候,如果发现其父类还没有初始化,则需要先触发其父类的初始化 虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步 什么时候会发生类的初始化...比如:当通过子类引用父类的静态变量,不会导致子类初始化 通过数组定义类引用,不会触发此类的初始化 引用常量不会触动此类的初始化(常量在链接阶段就存入调用类的常量池中了) 类加载的作用 将class文件字节码内容加载到内存中...类缓存 标准的JavaSE类加载起器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。

    28810

    【Android 逆向】类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )

    , Extention ClassLoader 加载额外的 /lib/ext 类库 , Application ClassLoader 加载开发者自己开发的类库 ; 加载完 开发者 开发的类库 后 ,...ClassLoader 应用类加载器 Application ClassLoader 自定义类加载器 Custom ClassLoader 在双亲委托机制中 , 上层的类加载器 是 下层类加载器 的父类...类加载任务 之后 , 也会 委托 父类的父类 类加载器 执行 ; 委托操作 , 会一直传递到 最顶层的 启动类加载器 Bootstrap ClassLoader ; 如果 启动类加载器 Bootstrap...; 同理 , 父类 委托 给子类的 类加载任务 , 如果 子类类加载器 可以完成加载 , 成功返回 , 如果子类类加载器无法完成加载 , 就再次 将 类加载任务 委托给 子类的子类 , 继续向下传递 ;...无法 被替代 , 系统类只能由 启动类加载器 Bootstrap ClassLoader 加载 , 应用类加载器 加载被篡改的 Java 核心类是无效的 ;

    89130

    友元类和嵌套类

    嵌套类 c++允许将类的声明放在另外一个类中,在另外一个类中声明的类被称为嵌套类。对类进行嵌套的主要目的是为了帮助实现另外一个类,并避免名称冲突。...类的嵌套和包含 包含往往意味着将类对象作为另外一个类的成员,而嵌套不创建类成员,而是定义一种类型,该类型仅在包含嵌套类声明中有效。...嵌套类的作用域特征: 声明位置 包含它的类是否可以使用它 从包含它的类派生而来的类是否可以使用它 在外部是否可以使用 私有部分 是 否 否 保护部分 是 是 否 公有部分 是 是 是,通过类限定符来使用...(注:嵌套结构和枚举与嵌套类相似,也适用于上表。)...类声明的位置决定了类的作用域和可见性。类可见后,访问控制规则(公有、私有、保护、友元)决定程序对嵌套类成员的访问权限。

    74040

    类加载器 超详解:什么是类加载器,类加载器作用及应用场景,类加载时机,类加载的完整过程,类加载器分类

    文章目录一、什么是类加载器、类加载器作用1.1 定义与作用1.2 应用场景二、类加载时机三、类加载的完整过程3.1 加载3.2 验证3.3 准备3.4 解析3.5 初始化3.6 使用3.7 小节四、类加载的分类...【理解】4.1 概述4.2 JDK8及之前的版本4.2.1 启动类加载器4.2.2 扩展类加载器和应用程序类加载器扩展类加载器应用程序类加载器4.3 JDK9之后的类加载器4.4 ClassLoader...四、类加载的分类【理解】4.1 概述类加载器分为两类,一类是Java代码中实现的,一类是Java虚拟机底层源码实现的。...代码中,无法通过Java代码获取底层的虚拟机启动类加载器)在Arthas中可以通过sc -d 类名的方式查看加载这个类的类加载器详细的信息,如通过上图可以看到,java.lang.String类的类加载器是空的...路径中要包含原来ext文件夹,同时在最后加上扩展的路径。应用程序类加载器应用程序类加载器会加载classpath下的类文件,默认加载的是项目中的类以及通过maven引入的第三方jar包中的类。

    11910

    java类的加载过程和类加载器的分析

    记得第一次遇见这个问题的时候,同学给我的回答是: 1.虚拟机会加载JDK里类的核心包 2.虚拟机会加载JDK里类的扩展包 3.虚拟机会加载JDK里类的系统包 4.虚拟机再会加载我们写好的java类。...再次之前我想补充一个名词解释,类加载器:虚拟机把  实现 类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流” 这个过程的代码称为类加载器 1....加载 加载只是类加载过程的一个阶段而已,但往往被大家弄成了这就是类的加载过程,所以才有了博文开头时同学给我的那个回答; 希望大家不要混淆出这个很相似的名词,从而对类加载有所误读。...()方法来进行加载; 结合第一步加载可以这么理解,  1.首先要启动→   启动类加载器,这时会调用启动类加载器的父加载器,但由于启动类加载器时所有类的父加载器, 所以其父加载器为空(相当于Object...是所有类的父类,这种感脚~),然后它就会调用自己的findClass方法来自启动加载 ; 2.标准扩展类加载器启动时就会借助其父类 启动类加载器 作为父加载器 来启动了; 3.系统类加载器启动时就会借助其父类

    1.5K80

    Java类加载-加载

    这就是虚拟机的类加载。 类加载概念 ? 上图是类加载和卸载的整个过程示意图,其中验证、准备、解析统称为连接阶段。...类加载-加载阶段 加载是类加载的第一个阶段,加载阶段的主要目标是: 通过一个类的全限定名来获取定义此类的二进制字节流 将字节流的静态信息结构转换为方法区(元数据区)的运行时数据结构 在内存中生成一个代表这个类的...非数组类的加载需要通过类加载器实现,既可以使用系统的提供的引导类加载,也可以使用用户自定义的类加载器去完成,关于类加载器后续我会单独写一篇文章来介绍,并且实现我们自己的一个类加载器。...对于数组类来说,数组类是由Java虚拟机直接创建的,但是数组中的元素类型需要通过类加载器加载。数组类的可见性与数组中元素的可见性一致,如果元素不是引用类型,数组类的可见性将默认为public。...本期类加载的加载阶段就介绍到这,下期我们会讲解类加载的连接阶段,我们下期再见!!!

    1.3K40

    java类的加载过程和类加载器的分析

    记得第一次遇见这个问题的时候,同学给我的回答是: 1.虚拟机会加载JDK里类的核心包 2.虚拟机会加载JDK里类的扩展包 3.虚拟机会加载JDK里类的系统包 4.虚拟机再会加载我们写好的java类。...再次之前我想补充一个名词解释,类加载器:虚拟机把  实现 类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流” 这个过程的代码称为类加载器 1....加载 加载只是类加载过程的一个阶段而已,但往往被大家弄成了这就是类的加载过程,所以才有了博文开头时同学给我的那个回答; 希望大家不要混淆出这个很相似的名词,从而对类加载有所误读。...()方法来进行加载; 结合第一步加载可以这么理解,  1.首先要启动→   启动类加载器,这时会调用启动类加载器的父加载器,但由于启动类加载器时所有类的父加载器, 所以其父加载器为空(相当于Object...是所有类的父类,这种感脚~),然后它就会调用自己的findClass方法来自启动加载 ; 2.标准扩展类加载器启动时就会借助其父类 启动类加载器 作为父加载器 来启动了; 3.系统类加载器启动时就会借助其父类

    60350

    jvm的类加载器(classloader)及类的加载过程

    什么叫类加载(classloader)? 类加载简单的说就是JVM通过类加载器ClassLoader,把.class文件中的信息,拼装成Class对象放入内存中。...连接过程又分为 验证->准备->解析 加载(Load) 指的是类加载,即class loading,虚拟机加载完成三件事情: 通过一个类的全限定名来获取定义此类的二进制字节流; 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构...JAVA ClassLoader(类加载器)分类 Bootstrap Classloader(启动类加载器) 最顶层的加载类,由C或C++语言实现。...即在类加载的时候,系统会判断当前类是否已经被加载,如果已经被加载,就会直接返回可用的类,否则就会尝试加载,在尝试加载时,会先请求双亲处理,如果双亲请求失败,则会自己加载。...最后 虚拟机加载过程及类的加载器相关知识的了解,有利于今后自定义一些jar包的时候可以做为基础知识进行深入。比如当了解自定义类加载器后可以在些基础上开发对应的动态jar包进行相关的动态加载。

    1.9K21

    java类加载的过程 父_类加载机制原理

    类的加载过程 当Java程序需要使用某个类时,如果该类还未被加载到内存中,JVM会通过加载、连接(验证、准备和解析)、初始化三个步骤来对该类进行初始化。...类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。...除此之外,所有引用类的方式都不会触发初始化, 称为被动引用。 类的加载 加载是类加载过程的一个阶段,这两个概念一定不要混淆。...通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种来源: 从本地文件系统加载class文件; 从一个ZIP、 JAR、 CAB或者其他某种归档文件中提取Java class文件,JDBC...如果有了直接引用, 那引用的目标必定已经在内存中存在 类的初始化 初始化阶段是类加载过程的最后一步 , 前面的几个阶段, 除了在加载阶段用户应用程序可以通过自定 义类加载器參与之外, 其余动作完全由虚拟机主导和控制

    71520

    类加载

    ,因为开发人员既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载 加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中, 而且在Java堆中也创建一个...例如,A a=new A(), 一个类真正被加载的时机是在创建对象的时候,才会去执行以上过程,加载类。当我们测试的时候,最先加载拥有main方法的主线程所在类 Java虚拟机有预加载功能。...加载机制 全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入 双亲委托,先让父类加载器试图加载该类,...,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成加载请求(它管理的范围之中没有这个类)时,子加载器才会尝试着自己去加载 ?...自定义加载器 既然JVM已经提供了默认的类加载器,为什么还要定义自已的类加载器呢?

    49830

    java的类加载

    类加载机制 JVM类加载机制分为五个部分: 加载,验证,准备,解析,初始化 加载 加载是类加载过程中的一个阶段,会在内存中生成一个代表这个类的java.lang.Class 对象,作为方法区这个类的各种数据的入口...初始化 初始化阶段是类加载的最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器之外,其他操作都有JVM主导 到了初始化阶段,才开始真正执行类中定义的java程序代码 初始化阶段是 执行类构造器...什么时候触发类加载 什么情况需要开始类加载过程的第一阶段(加载)呢? Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。...,定义了main方法的那个类 类加载器 虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提 供了 3 种类加载器: 启动类加载器(Bootstrap ClassLoader...实现自定义的类加载器 当一个类收到了类加载请求,它首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成 没一个层次的类加载器都是如此,因此所有的加载请求都会传送到启动类加载器中 只有当父类加载器反馈自己无法完成这个请求的时候

    85520

    类的加载时机

    上文:对象的内存是如何布局的? ---- ? 类的加载主要有三步:加载->连接->初始化。连接过程又分为 验证->准备->解析。 ?...类是通过.java---complier----.class---classloader--Class,然而这个加载又分为以上的7大步骤,那什么时候类开始加载?什么条件必须会加载?...; } public static final String HELLOWORLD = "hello world"; } 结果: hello world 接口类的加载 接口类加载与类大致相同...,区别如下: 接口不要求父类全部初始化完毕; 接口不能使用static{}代码块; 最后 类的加载时机分为7个阶段,每个阶段都有详细的工作,当然除了加载和卸载其它阶段可能存在并行,而非顺序执行。...这里只是简要介绍加载的相关引用问题,关于类加载器,再详细深入。

    30620

    java 类的加载

    6.通过java.exe调用类的方法时 类加载器 根类加载器 扩展类加载器 系统类加载 其他加载方式都是属于被动加载...引用静态[常量]不会导致该类的初始化. 类的加载阶段 类的加载就是将class的二进制读取到内存中,然后将字节流静态存储结构转换为方法去中运行的数据结构,并在堆中生成该类的Class对象,作为入口....类加载的最终就是堆中的一个对象,不管被加载多少次,对应堆中对象始终是同一个, 在栈中形成对对象的引用....类加载器之间严格遵守父委托机制 Bootsrap 根加载器 主要负责核心类库的加载,例如java.lang 包加载 扩展类加载器 扩展类加载器的父类是根加载器,主要用于加载java_home 下的jre...系统类加载器 负责加载classpath下的类库资源 双亲委托机制 当一个类加载器调用loadclass之后,它并不会直接将其进行加载,而是先交给当前类加载器的父加载器尝试加载直到最顶层的父加载器,然后再依次向下进行加载

    76010

    类的加载(二)

    懒加载类的加载 在上篇文章类的加载(一)中,我们聊到了非懒加载类的加载。当时我就有个疑问,什么是非懒加载类?是不是还有个懒加载类?二者的区别是什么?接下来我们就来区分一下懒加载类和非懒加载类。...懒加载类 VS 非懒加载类 其实区分是否为懒加载类的标准很简单,就是看是否实现了+load方法: 如果实现了load方法,就说明该类是非懒加载类。...非懒加载类的实现相对于懒加载类要提前,非懒加载类在编译期就会实现。 如果没有实现load方法,就说明该类是懒加载类,懒加载类在真正使用的时候才会去实现。...所以,除了那些手动覆写了+load方法的类之外,其余的类基本都是懒加载类,也就是说,这些懒加载类会在使用的时候才会真正去实现。...懒加载类的加载 我们上面提到,所有的懒加载类都是在使用到的时候去实现的,那么使用的场景有哪些呢? 第一个使用场景就是被其他的子类继承。

    61520
    领券