java 内部类编译 静态内部类/非静态内部类区别 内部类会被编译器生成同外部类一样的顶级类。只不过非静态内部类会持有外部类的引用。...域编译 静态field,非静态field编译 热部署不支持field/method增加和删除和 clinit方法的修改,静态field的初始化和静态代码块会被编译在编译器合成的方法clinit中,非静态字段的初始化会被编译在编译器生成的...(invoke static) 3.获取类的静态域的值(sget) 非静态field,非静态代码块 类的构造函数会被编译器翻译成init方法,会先进行非静态field和非静态代码块的初始化。...支持非静态字段和非静态代码块修改,热部署只是将init构造函数作为普通的方法变更。...final static引用类型因为会被翻译到clinit方法中,热部署失败。
java 内部类编译 静态内部类/非静态内部类区别 内部类会被编译器生成同外部类一样的顶级类。只不过非静态内部类会持有外部类的引用。...域编译 静态field,非静态field编译 热部署不支持field/method增加和删除和 clinit方法的修改,静态field的初始化和静态代码块会被编译在编译器合成的方法clinit中,非静态字段的初始化会被编译在编译器生成的...(invoke static) 3.获取类的静态域的值(sget) 非静态field,非静态代码块 类的构造函数会被编译器翻译成init方法,会先进行非静态field和非静态代码块的初始化。...支持非静态字段和非静态代码块修改,热部署只是将init构造函数作为普通的方法变更。...final static引用类型因为会被翻译到clinit方法中,热部署失败。 泛型编译 为什么需要泛型 Java泛型完全有编译器实现,由编译器执行类型检查和类型推断,生成非泛型字节码,称之为擦除。
下面讨论一下 static(静态) 修饰符的含义: 当我们说某个事物是静态时,就意味着该字段或方法不依赖于任何特定的对象实例 。 即使我们从未创建过该类的对象,也可以调用其静态方法或访问其静态字段。...相反,对于普通的非静态字段和方法,我们必须要先创建一个对象并使用该对象来访问字段或方法,因为非静态字段和方法必须与特定对象关联。...我们可以在类的字段或方法前添加 static 关键字来表示这是一个静态字段或静态方法。...使用类名直接引用静态变量是首选方法,因为它强调了变量的静态属性。 类似的逻辑也适用于静态方法。...代码示例: Incrementable.increment(); 相比非静态的对象,static 属性改变了数据创建的方式。
item = list[0] // 推断为平台类型(普通 Java 对象) 当调用平台类型变量的方法时,Kotlin不会在编译时报告可空性错误,但是在运行时调用可能会失败,因为空指针异常。...=item//允许,没有问题 Val notNull:String=item//允许,运行时可能失败 如果选择非空类型,编译器会在赋值时触发一个断言,这样可以防止Kotlin的非空变量保存空值。...静态字段 在命名对象或伴生对象时,声明的 Kotlin 属性会在该命名对象或包含伴生对象的类中包含静态幕后字段。通常这些字段是私有的,但可以通过以下方式之一暴露出来。...相同可见性的静态幕后字段。...如果使用该注解,那么编译器既会在相应对象的类中生成静态方法,也会在对象自身中生成实例方法。
CLR允许接口包含静态方法、静态字段、常量、以及静态构造器, 但是CLS兼容的接口类型是不允许有任何静态成员的,因为一些编程语言不能定义或者访问它们。...C#语言就是如此,C#编译器不允许接口中有任何静态成员。 约定接口名称第一个字母是大写的I;接口可以多继承,实际上实现了多个接口的类型允许我们将它的对象看作这个接口中的任意一个。...值类型也可以实现接口,当我们把一个值类型实例转为接口类型时,会被装箱,因为接口总被认为是引用类型,并且它们的方法总是虚方法。...,会按照先完全限定接口成员后非完全限定成员的顺序进行辨析】。...在一个类型中用完全限定名定义接口方法时,该方法被认为是私有的,因为类型本身无法调用它,当转型为一个接口时,这个方法将可以被调用,这时又是一个共有方法 显示接口成员实现 显示实现接口成员正是用到了上面的用完全限定名来实现接口
静态类 静态类与非静态类基本相同,但存在一个区别:静态类不能实例化。 也就是说,不能使用 new 关键字创建静态类类型的变量。 因为没有实例变量,所以要使用类名本身访问静态类的成员。...程序不能指定加载静态类的确切时间。 但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。...使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。 编译器将保证不会创建此类的实例。 静态类是密封的,因此不可被继承。 它们不能从除 Object 外的任何类中继承。...静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量(除非在方法参数中显式传递)。 更常见的做法是声明具有一些静态成员的非静态类,而不是将整个类声明为静态类。 ...静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。 静态方法可以被重载但不能被重写,因为它们属于类,不属于类的任何实例。
1/64 -Xmx:默认为物理内存的1/4或者1G, 因为存在堆空间扩容,第一次运行的时候会执行多次FULL GC,通过关闭自适应调整策略(-XX:-UseAdaptiveSizePolicy), JVM...对字段的解析需要首先对其所属的类进行解析,因为字段是属于类的,只有在正确解析得到其类的正确的直接引用才能继续对字段的解析。...,那么直接返回这个字段的直接引用,解析结束 否则,解析失败,抛出java.lang.NoSuchFieldError异常 见例子:classload.FileResolution 如果最终返回了这个字段的直接引用...这些方法称为非虚方法(还包括使用final修饰的方法,虽然final方法使用invokevirtual指令调用,因为final方法注定不会被重写,也就是无法被覆盖,也就无需对其进行多态选择)。...因为是根据两个宗量进行分派,所以java语言的静态分派属于多分派类型。
[0]//推断为平台类型(普通Java对象) 当调用平台类型变量的方法时,Kotlin不会在编译时报告可空性错误,但是在运行时调用可能会失败,因为空指针异常。...=item//允许,没有问题 Val notNull:String=item//允许,运行时可能失败 如果选择非空类型,编译器会在赋值时触发一个断言,这样可以防止Kotlin的非空变量保存空值。...当把平台值传递给期待非空值等的Kotlin函数时,也会触发一个断言。总的来说,编译器尽力阻止空值通过程序向远传播(由于泛型的原因,有时这不可能完全消除)。...属性作为字段暴露,那么就需要使用@JvmField注解对其进行标注。...如果使用该注解,那么编译器既会在相应对象的类中生成静态方法,也会在对象自身中生成实例方法。
(被final修饰,在编译器就把结果放入常量池的静态字段除外)、调用一个类的静态方法。...注:对于接口的初始化,即使接口不能使用"static{}"语句块,但编译器也可能会为其生成""类构造方法,因为接口可能存在静态变量的赋值,后文会提到。...3.4.2 字段解析 要解析一个未被解析过的字段符号引用,首先会对字段所属的类或接口的符号引用进行解析。若在解析这个类或接口符号引用的过程中出现了任何异常,都会导致字段符号引用解析的失败。...实际上虚拟机的编译器可能会更加严格,如果一个同名字段同时出现在C的接口和父类中,那么编译器可能拒绝编译。...关于方法: ()方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{})中的语句合并产生,收集的顺序由语句在源文件中出现的顺序所决定,静态语句块只能访问到定义在静态语句块之前的变量
2.将此字节流所代表的静态存储结构转化为方法区中的运行时数据结构。...在这其中StackMapTable保证不会将int值当作float来操作,不能将null引用当作对象来操作,确保局部变量一致性,对其进行类型检查。...因为这一验证阶段只有通过与不通过的差别,只要通过了验证,其后就对程序没有任何影响了。...除了动态invokedynamic指令外,其他的指令在进行符号进行解析请求时,保证如果一个符号引用已经被成功解析过来,那么后面的请求同样要成功,而如果失败了那其他解析请求同样失败。...他是javac编译器自动生成的,收集了类中所有类变量的复制动作和静态语句。JVM保证子类的执行器父类的执行完毕。
但是于此同时,静态内部类中也无法访问外部类的非静态成员,因为外部类的非静态成员是属于每一个外部类对象的,而本身静态内部类就是独立外部类对象存在的,所以静态内部类不能访问外部类的非静态成员,而外部类依然可以访问静态内部类对象的所有访问权限的成员...而对于静态内部类来说,因为其实独立于外部类对象而存在,因此编译器不会为静态内部类对象提供外部类对象的引用,因为静态内部类对象的创建根本不需要外部类对象支持。...而且因为外部类对象需要访问当前类的私有成员,编译器给这个静态内部类生成了一个名为 access$000 的静态方法,作用已不用我多说了。...我们在上面已经知道了,创建非静态内部类的对象时,新建的非静态内部类对象会持有对外部类对象的引用,这个我们在上面的源码反编译中已经介绍过了,正是因为非静态内部类对象会持有外部类对象的引用,因此如果说这个非静态内部类对象因为某些原因无法被回收...但是可能存在这种情况:非静态内部类对象在某个时刻已经不在被使用,或者说这个内部类对象可以在不影响程序正确运行的情况下被回收,而因为我们对这个内部类的使用不当而使得其无法被 JVM 回收,同时会导致其外部类对象无法被回收
但是于此同时,静态内部类中也无法访问外部类的非静态成员,因为外部类的非静态成员是属于每一个外部类对象的,而本身静态内部类就是独立外部类对象存在的,所以静态内部类不能访问外部类的非静态成员,而外部类依然可以访问静态内部类对象的所有访问权限的成员...而对于静态内部类来说,因为其实独立于外部类对象而存在,因此编译器不会为静态内部类对象提供外部类对象的引用,因为静态内部类对象的创建根本不需要外部类对象支持。...而且因为外部类对象需要访问当前类的私有成员,编译器给这个静态内部类生成了一个名为 access000 的静态方法,作用已不用我多说了。...我们在上面已经知道了,创建非静态内部类的对象时,新建的非静态内部类对象会持有对外部类对象的引用,这个我们在上面的源码反编译中已经介绍过了,正是因为非静态内部类对象会持有外部类对象的引用,因此如果说这个非静态内部类对象因为某些原因无法被回收...但是可能存在这种情况:非静态内部类对象在某个时刻已经不在被使用,或者说这个内部类对象可以在不影响程序正确运行的情况下被回收,而因为我们对这个内部类的使用不当而使得其无法被 JVM 回收,同时会导致其外部类对象无法被回收
如有雷同,不胜荣幸,若转载,请注明 静态类和非静态类的主要差别 主要差别在于静态类不能实例化,静态类编译器可以运行检查确保不是偶然的加入实例成员,C#编译器会自己主动把它标记为sealed。...静态类中不能创建非静态的方法。即静态方法中仅仅能创建静态方法。但在非静态类中可以调用静态方法 静态类的主要特性: 1:仅包括静态成员。 2:无法实例化。 3:是密封的。 4:不能包括实例构造函数。...5:非静态类能够包括静态的方法、字段、属性或事件。 6:静态方法和属性不能訪问其包括类型中的非静态字段和事件 7:静态方法仅仅能被重载,而不能被重写,由于静态方法不属于类的实例成员。...8:C# 不支持静态局部变量(在方法内部定义静态变量)。 非静态类在使用时必需要实例化。...每次使用时都要进行实例化,普通情况下使用比較频繁的类,能够使用静态类,比方LogClass,ConfigClass等等,个人总结,疏漏之处还请高手指点 发布者:全栈程序员栈长,转载请注明出处:https
非托管类型约束提案使用了unmanaged关键字,用于说明泛型类型必须是“非引用类型,并且在任意嵌套层次上都不包含引用类型字段。”...这样声明的变量其作用域是整个构造函数的函数体。 我们移除了在字段或Property初始化器中不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个初始化表达式。...这样声明的变量其作用域是整个查询子句表达式。 最初增加这些限制只是因为“没有时间”。也许,这些限制缩短了了C# 7之前版本完工所需的测试时间。...非托管类型约束提案使用了unmanaged关键字,用于说明泛型类型必须是“非引用类型,并且在任意嵌套层次上都不包含引用类型字段。”...这样声明的变量其作用域是整个查询子句表达式。 最初增加这些限制只是因为“没有时间”。也许,这些限制缩短了了C# 7之前版本完工所需的测试时间。
提示:不允许添加 abstract 修饰符,因为字段本质上是实体,不存在抽象字段。否则,Java 编译器将会生成一条类似于“此处不允许使用修饰符 abstract”的错误消息。...非静态字段(Non-Static Field):没有声明为 static 的字段。又可称为实例变量。 成员变量(Member Variable):除常量字段外的其他所有字段。...从技术上讲,对象将各自的状态存储在“实例变量(非静态字段)”中,它们的值对类的每个实例(每个对象)来说都是独有的。因此,本着封装的精神,将实例变量(非静态字段)声明为 private 是值得提倡的。...提示:不鼓励用上述方式来访问非静态字段,因为这不符合面向对象编程的基本原则,所以建议将非静态字段声明为 private。...如果可在类外更改该类中的实例变量值,那么该实例变量将会变得不确定,因为任何一段在类外的代码都有可能改变其值。
字段与属性有什么异同? 4. 静态成员和非静态成员的区别? 5. 自动属性有什么风险? 6. 特性是什么?如何使用? 7. 下面的代码输出什么结果?为什么?...后来因为一个需求变更,把其中一个字段修改了一下,需要把自动属性改为自己命名的私有字段的属性,就像下面实例这样。...静态成员和非静态成员的区别? 静态变量使用 static 修饰符进行声明,静态成员在加类的时候就被加载(上一篇中提到过,静态字段是随类型对象存放在Load Heap上的),通过类进行访问。...不带有static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问 。 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值 。...静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。 5. 自动属性有什么风险? 因为自动属性的私有字段是由编译器命名的,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.
这段代码里有两个本地方法,他们分别对实例的一个字段和方法里的一个本地变量进行了修改操作,也就是捕获并更新了本地的状态。 其运行结果是: ?...在C# 8里面,你可以使用静态本地方法来达到这个目的。 其做法很简单,就是在原来这两个本地方法前面加上static关键字即可: ?...可以看到程序报错了,这是因为静态本地方法是不可以访问和捕获实例的状态的,包括实例成员和方法本地变量。 针对第一个本地方法,我直接把更新本地变量的语句去掉: ?...而针对第二个本地方法,如果你真的想修改实例成员的状态,那么就需要把成员改为静态的: ? 其运行结果是: ?...但是这里会出现警告,因为 ToString 访问了未标记为 readonly 的 Distance 属性。也就是需要创建防御性副本时,编译器会发出警告。
于是我翻阅了官网的JVM规范,在4.7.2部分我找到了这样一句话: 书中说的很清楚: 如果field_info(字段表)表示的非静态字段包含了ConstantValue属性,那么这个ConstantValue...也就是说,对于非静态字段,就算你编译器加上了ConstantValue属性,JVM也会忽略掉,你加不加结果是一样的。...这位朋友通过实验发现用final修饰的实例变量对应的字段表有ConstantValue属性。 结合《深入理解Java虚拟机》,他认为a是通过ConstantValue属性让虚拟机知道然后为其赋值的。...因为虚拟机规范是这样规范的。对于非静态字段,ConstantValue属性是不会生效的。 至于为什么要这样设计,功力不够的我暂时无法理解设计者的想法。...JVM 规范这样写道: 说白了,编译器会收集所有静态变量的赋值动作、所有静态代码块,合并产生一个方法,即方法。 方法在上面那张类加载图中的的初始化阶段执行。
领取专属 10元无门槛券
手把手带您无忧上云