首页
学习
活动
专区
工具
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问答小组之中, 在我收到回复邮件中,这个同学回答很靠谱, ?

64490

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

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

91320

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

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

3.5K21

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

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

1K00

深入理解Java内部类

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

1.2K80

深入理解static关键字

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

22620

Java 内部类及其原理

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

53240

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还需要支持网?

4.5K42

java面向对象相关知识

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

55210

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

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

63210

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

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

92130

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

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

46321

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

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

1K61

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

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

1.2K10

全球 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.1K10

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

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

40510

Java之static作用全方位总结

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

1.6K21

Java程序员一定要学会这个内部类技巧,不然很难成为架构师

我们可以利用内部类来解决 类单继承问题,外部类不能再继承类可以交给内部类继承 我们可以通过定义内部类来实现一个类属于一个类,实现更好封装性 代码优化:它需要更少代码 专注于Java架构师技术分享...我们说内部类是可以访问外部类私有字段和私有方法,对于静态内部类,它遵循一致原则,只能访问外部类静态成员。...上述代码中,外部类非静态私有字段age在静态内部类中是不允许访问,而静态字段name则是可访问。下面我们看,如何创建一个静态内部类实例对象。...In,我们成员内部类可以直接访问外部类成员字段和成员方法,因为它是关联着一个外部类实例。...主要思路还是将内部类抽离出来,通过初始化传入外部类实例以达到对外部类所有成员访问。只是在匿名内部类中,被依托父类不是部类

34400
领券