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

为什么内部类的$0字段不是私有的?

内部类的$0字段不是私有的是因为内部类的$0字段是用来引用外部类对象的,它的访问权限与外部类的成员变量相同。在Java中,内部类可以访问外部类的私有成员,因此$0字段也可以被内部类访问到。

内部类是一个嵌套在其他类中的类,它可以访问外部类的成员变量和方法,包括私有成员。为了实现这种访问,编译器会在内部类中生成一个对外部类对象的引用,这个引用就是$0字段。通过$0字段,内部类可以访问外部类的成员。

内部类的$0字段不是私有的,这意味着在外部类之外的地方也可以访问到$0字段。但是,由于$0字段是编译器生成的,命名方式是$加上一个数字,所以在实际开发中很少直接使用$0字段。

总结起来,内部类的$0字段不是私有的是为了让内部类能够访问外部类的成员变量,它的访问权限与外部类的成员变量相同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么不是0,1,2,3,4?setTimeout的奇怪问题

网上看到这样一个题目: for(let i=0;i<5;i++){ setTimeout(function(){alert(i)},0) } 它输出的顺序并不是0,1,2,3,4,也不是固定的某一个顺序的数字...为什么是这样呢?...2、setTimeout并不是指定了间隔时间就一定会按指定时间执行。它只是说“在指定时间之后,加入队列,等待执行”。至于什么时候执行,要看进程队列的空闲程度。...3、alert()它会阻塞js的执行,此时js进程是暂停的。 4、题目中使用的是let,这相当于是使用闭包的方式来传入值。如果是var,那么就是直接执行完i=5之后再执行alert了。...这个题目很简单,但包含了几个关键的知识点,我把这个题目添加到了先行者旗下的js问答小组之中, 在我收到的回复邮件中,这个同学的回答很靠谱, ?

66890

Requests库(二十)为什么请求的json字段传入dict格式才正确而不是json格式

本次分享源于在微信群里有人问的一个问题,为什么在requests请求的时候,参数中有一个json的字段,传入dict就可以正常,传入json dumps后的数据请求就报错。...原因出现在哪里 首先来说,按照我们的习惯的来说的话,有json参数,就应该传入json的字符串,但是我们传入json的字符串就请求发送后了,预期不是我们想要的,但是我们传入dict 结果就是正确的...,按说,不应该啊,那么这是为啥呢,看到这里,我的想法就是是不是内部做了什么处理呢,于是乎开始查找问题的根本。...我们在这里可以看到,所有的最后都给了prepare_body的方法,我们看下这个方法实现了什么,过来之后,我们看到了如下的方法。 ?...问题的答案就是在这里,内部给你处理好了,当初我在群里也是这么回复的,其实问题很简单,查看里面的代码怎么实现的就知道了。里面的代码很简单,也很好找,顺着思路找下去即可。 写在最后 ?

95520
  • 直观理解:为什么一阶导为0不是极值点的充分条件?

    对一元函数f(x)来说,就极值而言,一阶导为0是极值点的必要但不充分条件。 一阶导为0且二阶导非负是极小值的充要条件。 这是为什么呢? 今天我们尝试直观地解释这个问题。 根据泰勒展开: ?...如果满足:一阶导为0,二阶导非负,因此,dx不论是多少,f(x) 一定不比 f(x0) 小,所以 f(x0)是极小值。...对于多元函数而言,泰勒展开的主要区别在于:二阶导变成了Hessian矩阵(红框所示),如下所示: ? 只有红框的矩阵一直非负,我们才能说这是极小值,可类别一元函数的情况。...了解的同学或许已经看出,红框与左右两侧连起来,就是重要的一个定义:(半)正定二次型,定义如下: ? 一直大于等于0 它就是这么引出来的,也是我们为什么需要半正定这个概念的原因(之一)。...明天考研,祝同学们在考场上镇定自若,冷静思考,考出理想成绩,实现自己的梦想!

    3.9K21

    为什么 C# 的 string.Empty 是一个静态只读字段,而不是一个常量呢?

    进一步可以发现 string.Empty 实际上是一个静态只读字段,而不是一个常量。 为什么这个看起来最适合是常量的 string.Empty,竟然使用静态只读字段呢?...也就是说,string.Empty 字段并不是一个普通的字段,对它的调用会被特殊处理。但是是如何特殊处理呢?...string.Empty 需要是一个静态只读字段而不是常量?...String 类的构造函数(注意不是静态构造函数,String 类的静态构造函数是特殊处理不会调用的); 而如果这是一个静态字段,那么编译器可以在不做特殊处理的情况下,生成 ldsfld string...当然,事实上编译器也可以针对此场景做特殊处理,但为什么不是在编译这一层进行特殊处理,我已经找不到出处了。 本文引申的其他问题 能否反射修改 string.Empty 的值? 不行!

    1.1K00

    深入理解Java内部类

    内部类就是定义在一个类中的另外一个类,是一种从属关系。在没有实际了解内部类之前,我始终困惑,为什么要在一个类中定义另外一个类,这不是增加代码结构复杂度么?...现在才大致能知道这种设计的优势是大于其劣势的。比如,我们可以通过内部类解决类的单继承问题,外部类不能再继承的类可以交给内部类继承。我们可以通过定义内部类来实现一个类私属于一个类,实现更好的封装性。...上述代码中,外部类的非静态私有字段age在静态内部类中使不允许访问的,而静态字段name则是可访问的。下面我们看,如何创建一个静态内部类的实例对象。...对于Out中所有的私有成员(也就是内部类分离出去之后不能访问的成员),增设了可供调用的access$xxx方法,从而实现内部类与外部类之间的联系。这就是他们的本质。...主要思路还是将内部类抽离出来,通过初始化传入外部类的实例以达到对外部类所有成员的访问。只是在匿名内部类中,被依托的父类不是他的外部类。

    1.2K80

    深入理解static关键字

    定义在方法、构造方法、代码块 内 的变量被称为局部变量; 定义在方法参数 中 的变量被称为参数。...平常我们见的最多的 static 方法就是 main 方 法,至于为什么 main 方法必须是 static 的,现在应该很清楚了。...# 2.5 类加载顺序 我们前面提到了类加载顺序这么一个概念,static 修饰的变量和静态代码块在使用前已经被初始化好了,类的初始化顺序依次是 加载父类的静态字段 -> 父类的静态代码块 -> 子类静态字段...而在类的构造器中,是有隐含的 this 绑定的,因为构造方法是和类绑定的,从这个角度来看,构造器不是静态的。...是专门用来执行实例方法的指令;从这个角度来讲,构造器也不是静态的。

    34720

    Java 内部类及其原理

    如用private修饰,则只能在外部类的内部访问。 2.局部内部类 局部内部类是定义在一个方法或作用域中的类,它的访问权限仅限于方法内或作用域内。 ? 局部内部类也可以返回,像这样: ?...可以看到,内部类其实拥有外部类的一个引用,在构造函数中将外部类的引用传递进来。 匿名内部类为什么只能访问局部的final变量?...可以看出,java将局部变量m直接进行复制,所以其并不是原来的值,若在内部类中将m更改,局部变量的m值不会变,就会出现数据不一致,所以java就将其限制为final,使其不能进行更改,这样数据不一致的问题就解决了...匿名内部类为什么访问外部类成员字段不用final?...上面说了,final关键字是为了解决数据不一致的问题,因为内部类中存有外部类的引用,所有对外部类中字段的修改都会真实的反映到外部类实例本身,所以不需要用final来修饰。

    57040

    IPv6技术详解:基本概念、应用现状、技术实践(上篇)

    IPv6(IPv4对比:type字段为0x0800); 2)IPv6的头部字段,和IPv4差别巨大(可以猜测到,IPv6和IPv4无法兼容)。...值得一提的是,在IPv6协议下,传输层L4协议UDP、TCP是强制需要进行校验和的(IPv4是可选的); 5)IPv6报文头部中的Next Header字段表示“承载上一层的协议类型”或者“扩展头部类型...字段很类似; 当不是以上3种协议类型的时候,IPv6报文头部紧接的是扩展头部。...对比IPv4,分片信息是记录在IPv4报文头部的分片字段中。 IPv6的扩展头部类型有很多种,除了上述的分片头部,还有路由头部、逐跳可选头部等,具体的可以参考RFC2460。...可能看到这里,有同学会跳出来说:IPv6不是为了解决IPv4地址耗尽的问题吗,既然IPv6的地址空间那么大,可以为每一个网络节点分配公网IPv6的节点,那为什么IPv6还需要支持私网?

    5.6K43

    java面向对象相关知识

    (单一职责原则想表达的就是"高内聚",写代码最终极的原则只有六个字"高内聚、低耦合",所谓的高内聚就是一个代码模块只完成一项功能,在面向对象中,如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则...任何时候都不要继承工具类,工具是可以拥有并可以使用的,而不是拿来继承的。) 迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。...再复杂的系统都可以为用户提供一个简单的门面 如何通过反射获取和设置对象私有字段的值?...可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了...内部类可以引用他包含类的成员吗,如果可以,有没有什么限制吗? 一个内部类对象可以访问创建它的外部类对象的内容,内部类如果不是static的,那么它可以访问创建它的外部类对象的所有属性内部类。

    57310

    java内部类和静态内部类区别_静态内部类对象的创建

    this.item = element; this.next = next; this.prev = prev; } } 它为什么被定义成静态呢...从之前的学习中,我们应该对静态这个关键字有一定的了解,静态代表它是属于类的,而不是属于实例的。我们可以通过类名直接对静态的玩意儿直接进行引用,但这里的Node静态内部类却是私有的。...,存在一个隐藏的外部类引用字段,在构造内部类时,用于指向外部类的引用。...每次生成一个非静态的内部类实例,都会有这样的操作。 恰巧Node类只是外部类的一个组件,他不需要引用外部类的任何字段,所以,把它声明成静态的能减小不必要的消耗。...所以,在定义一个内部类时,如果该内部类不需要引用外部类的非静态属性/方法,则应该将它声明为静态的。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    65810

    Java入门必背100条

    不可以使用0或非 0 的整数替代false和true。...体现二 不对外暴露的私有的方法 体现三 单例模式(将构造器私有化) 体现四 如果不希望类在包外被调用,可以将类设置为缺省的。...一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。...CompareA.super.method3(); CompareB.super.method3(); } 90、内部类的分类:成员内部类(静态、非静态 )、局部内部类(方法内、代码块内、构造器内...91、成员内部类的理解: 一方面,作为外部类的成员 调用外部类的结构 可以被static修饰 可以被4种不同的权限修饰 另一方面,作为一个类: 类内可以定义属性、方法、构造器等 可以被final

    1.2K20

    死磕Java内部类(一篇就够)

    为什么需要内部类? 为什么内部类(包括匿名内部类、局部内部类),会持有外部类的引用? 为什么匿名内部类使用到外部类方法中的局部变量时需要是final类型的? 如何创建内部类实例,如何继承内部类?...Lambda表达式是如何实现的? 为什么需要内部类? 要回答这个问题,先要弄明白什么是内部类?...Job类对task进行了一层封装,这里Job是私有的,所以外界是感知不到Job的存在的,所以有了内部类第一个优势。...run() { } } 生成的类只有一个构造器,参数就是Demo类型,而且保存到内部类本身的this$0字段中。...到这里我们其实已经可以想到,内部类持有的外部类引用就是通过这个构造器传递进来的,它是一个强引用。 验证我们的想法 怎么验证呢?

    96930

    java安全编码指南之:序列化Serialization

    在反序列化的过程中,JVM会首先判断serialVersionUID 是否一致,如果不一致,那么JVM会认为这不是同一个对象。...readResolve和writeReplace 如果class中的字段比较多,而这些字段都可以从其中的某一个字段中自动生成,那么我们其实并不需要序列化所有的字段,我们只把那一个字段序列化就可以了,其他的字段可以从该字段衍生得到...不要序列化内部类 所谓内部类就是未显式或隐式声明为静态的嵌套类,为什么我们不要序列化内部类呢?...序列化在非静态上下文中声明的内部类,该内部类包含对封闭类实例的隐式非瞬态引用,从而导致对其关联的外部类实例的序列化。 Java编译器对内部类的实现在不同的编译器之间可能有所不同。...; } this.age = age; } 不要在readObject中调用可重写的方法 为什么呢?

    52721

    Java编程思想第五版(On Java8)(十一)-内部类

    一个匿名类,它通过实例初始化实现构造(匿名内部类不可能有构造器)。 第一个例子展示了在方法的作用域内(而不是在其他类的作用域内)创建一个完整的类。...为什么需要内部类 至此,我们已经看到了许多描述内部类的语法和语义,但是这并不能同答“为什么需要内部类”这个问题。那么,Java 设计者们为什么会如此费心地增加这项基本的语言特性呢?...通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括 private 成员...局部内部类 前面提到过,可以在代码块里创建内部类,典型的方式是在一个方法体的里面创建。局部内部类不能有访问说明符,因为它不是外围类的一部分;但是它可以访问当前代码块内的常量,以及此外围类的所有成员。...我们分别使用局部内部类和匿名内部类实现了这个功能,它们具有相同的行为和能力,既然局部内部类的名字在方法外是不可见的,那为什么我们仍然使用局部内部类而不是匿名内部类呢?

    1.1K61

    全球 IPv4 地址耗尽,IPv6 来了!

    可以看到,IPv6 数据报文和 IPv4 有很大的差别: 数据链路层(L2)的 type 字段标识为 0x86dd,表示承载的上层协议是 IPv6 IPv4 对比:type 字段为 0x0800...IPv6 报文头部中的 Next Header 字段表示“承载上一层的协议类型”或者“扩展头部类型”。...对比 IPv4,分片信息是记录在 IPv4 报文头部的分片字段中。 IPv6 的扩展头部类型有很多种,除了上述的分片头部,还有路由头部、逐跳可选头部等,具体的可以参考 RFC2460。...可能看到这里,有同学会跳出来说:IPv6 不是为了解决 IPv4 地址耗尽的问题吗,既然 IPv6 的地址空间那么大,可以为每一个网络节点分配公网 IPv6 的节点,那为什么 IPv6 还需要支持私网?...IPv4 报文头部中的协议字段,不是我们熟悉的 TCP(6)/UDP(17)协议,而是 IPv6-in-IPv4 专属的隧道协议类型。

    3.2K10

    夯实Java基础系列18:深入理解Java内部类及其实现原理

    让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 非静态内部类有一个很大的优点:可以自由使用外部类的所有变量和方法...与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。...直到这里还没有解释为什么是final 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...匿名内部类为什么只能访问局部的final变量?...,进行替换,将无法确定的值放到了内部类的常量池中,并在构造函数中将其从常量池取出到字段中。

    1.2K10

    夯实Java基础系列18:深入理解Java内部类及其实现原理

    让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 非静态内部类有一个很大的优点:可以自由使用外部类的所有变量和方法...与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。...需要注意的是:局部内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。...直到这里还没有解释为什么是final 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...可以看到,java将编译时已经确定的值直接复制,进行替换,将无法确定的值放到了内部类的常量池中,并在构造函数中将其从常量池取出到字段中。

    41910

    Java之static作用的全方位总结

    而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。   static成员变量的初始化顺序按照定义的顺序进行初始化。...; } } 为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。...(5)方法内的类    方法内创建的类(注意方法中也能定义类),不能加访问修饰符。另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被事先编译了。...);    嵌 套类与普通的内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段, 也不能包含嵌套类。...同样,内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制:外围类的名字,加上$,再加上内部类名字。

    1.6K21

    Java基础15:深入剖析Java枚举类

    初探枚举类 在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红、黄、绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素...枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等的,不是必须使用equals方法的哟。....class、com/mikan/Day$4.class,也就是说这四个命名字段分别使用了内部类来实现的;同时添加了两个方法values()和valueOf(String);我们定义的构造方法本来只有一个参数...在枚举常量初始化时,会自动为初始化这两个字段,设置相应的值,所以才在构造方法中添加了两个参数。即: 另外三个枚举常量生成的内部类基本上差不多,这里就不重复说明了。...而每个枚举常量是一个静态常量字段,使用内部类实现,该内部类继承了枚举类。所有枚举常量都通过静态代码块来进行初始化,即在类加载期间就初始化。

    68400
    领券