类方法、静态方法 类方法 类方法是以类对象作为第一个参数的方法。需要使用装饰器@classmethod来标识其为类方法。对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。...__type 使用场景: 当方法中需要使用类对象(如访问私有类属性等)时,定义类方法。 类方法一般和类属性配合使用。...静态方法 静态方法通过装饰器@staticmethod来修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)。静态方法也可以通过实例对象和类对象去访问。...注意点: 当类中定义了同名的方法时,调用方法会执行最后定义的方法。...Dog.demo_method() # 结果:静态方法 dog1.demo_method() # 结果:静态方法
对象,作为方法区这个类的访问入口 获取二进制流 这条规则虚拟机规范中并没有指明说从哪里获取,如何获取,只是说通过全限定名获取二进制字节流就行。...因此我们可以从压缩包(JAR),网络(Web Applet),加密文件(加载时动态解密),运行时生成(动态代理)…这些路径中通过类的全限定名去获取二进制字节流进行加载。...图示: 静态变量本身是应该存放在方法区中的,在JDK7以前是用的永久代实现的方法区;但是在JDK7以后,方法区是在直接内存上的,而静态变量则会随着Class对象在堆内存中进行分配。...所以叫做动态链接运行时才可以确定。 从编译器的角度来讲: 首先变量必须都得有个类型(静态类型)用于之后的字段表中存储代表这是什么类型的变量。...那么从字段表中获取到的类型就是静态类型,这个是在编译的时候生成的属性表示可以确定的,但是静态类型是可以进行变化的,比如类型强转就是改变的静态类型,但是强转后的类型编译期也可以确定(有对应的强转字节码指令
缺点 漏斗图在实际分析中并不常见,但在PPT中用作信息描述却明显优于干巴巴的数字 1. 追踪流程较困难,而企业是结果导向的,我们更在意整个流程的转化率,有时不会深究细节; 2....应用场景 雷达图主要用于静态的多维对比,它直观地呈现几个观察对象在多个指标上对比情况。 缺点 能表达的静态数据信息有限,线条不宜超过5条,指标不宜超过8个。...数据源-第一个指标要重复一列,作为环形的起点和终点; 在Tableau中要进行透视表操作; 生成路径: CASE [数据透视表字段名称] WHEN '认证两分钟回复率' then 1 WHEN '认证数...箱线图可初步判断数据批中的偏态和尾重; 异常值出现于一侧的概率越大,中位数也越偏离上下四分位数的中心位置; 异常值集中在较小值一侧,则分布呈现左偏态;异常值集中在较大值一侧,则分布呈现右偏态。...矩盒两端的位置分别对应数据的Q1、Q3分位数,矩形盒内部绘制一中位数线 内限=Q1-1.5*IQR、=Q3+1.5*IQR IQR(四分位矩)=Q3-Q1,它反映了中间50%数据的离散程度(数值越小,中间
另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。 4、导入和完全限定名称 <?...因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,例如: 1、在命名空间中访问全局类 <?...// 如果未发现,则尝试自动装载类 "F" // 调用另一个命名空间中的静态方法或命名空间函数 B\foo(); // 调用命名空间 "A\B" 中函数 "foo" B::foo(); /...在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。...在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。
覆盖不能改变方法的静态与非静态属性。子类中不能将父类非静态方法定义为静态方法,反之也一样。 final 方法不能被覆盖。 不允许子类方法的访问修饰符比父类有更多的限制。...静态方法 用 static 修饰的方法称为静态方法,也叫类方法. 在 static 方法中只能处理类变量,也可访问其它 static 方法,但不能访问任何归属对象空间的变量或方法....this this(参数),用来调用同类其他构造方法.注意 this 语句只能定义在构造函数的第一行,因为初始化要先执行. super关键字则和 this 差不多,都是一个引用指向自身和上一级父类罢了...私有级别的关键字是 private,私有级别的成员变量和方法只能在其所在类的内部自由使用,在其他的类中则不允许直接访问。...总结来说,import 是编译时概念,用于确定完全限定名,在运行时,只根据完全限定名寻找并加载类,编译和运行时都依赖类路径,类路径中的 jar 文件会被解压缩用于寻找和加载类。
,所以无需对象,全都是静态方法 VaueOf系列都有对应的缓存区, 缓存区范围内对象为同一个 缓冲区为静态内部类中的数组 缓冲范围为 -128~127 static Integer valueOf...在第二个参数指定的基数中,返回第一个参数的字符串表示的无符号整数值 如果基数不在Character.MIN_RADIX 和 Character.MAX_RADIX的范围内,...Integer重写了equals方法比较的是两个Integer对象中内部的 int value值 hashCode static int hashCode(int value) 静态方法返回某个int...getXXX系列 获取系统属性的数值 static Integer getInteger(String nm, Integer val) 确定具有指定名称的系统属性的整数值第一个参数被视为系统属性的名称通过...,在开篇中已经描述 Long也有提供 语义一致 static int signum(int i) 静态方法返回指定 int 值的符号函数(如果指定值为负,则返回 -1;如果指定值为零,则返回
执行引擎用于执行指令,不同的java虚拟机内部实现中,执行引擎在执行Java代码的时候可能有解释执行(解释器执行)和编译执行(通过即时编译器产生本地代码执行,例如BEA JRockit),也有可能两者兼备...(在编译的时候,就已经将方法的局部变量、操作数栈大小等确定并存放在字节码中,在装载的时候,随着类一起装入方法区。)...4.静态变量:就是类变量,类的所有实例都共享,我们只需知道,在方法区有个静态区,静态区专门存放静态变量和静态块。 5.到类classloader的引用:到该类的类装载器的引用。...而jvm必须以某种方式把Class的这个实例和存储在方法区中的类型数据联系起来。...四 jvm和jmm之间的关系 jmm中的主内存、工作内存与jvm中的Java堆、栈、方法区等并不是同一个层次的内存划分,这两者基本上是没有关系的,如果两者一定要勉强对应起来,那从变量、主内存、工作内存的定义来看
; 类中的字段、方法的覆盖,重载矛盾; 字节码验证:通过语义流及控制流分析确定程序予以的合法性,正确性,方法体分析验证。...符号引用验证:虚拟机将符号引用转化为直接引用时候,解析阶段,对类自身以外信息进行匹配性验证 符号引用中通过字符描述的全限定名是否能找到对应的类; 指定类中是否存在符合方法字段的描述符,及简单名称所描述的方法和字段...准备:在方法区中为类变量分配内存及设置类变量初始值。 初始值通常为数据类型的零值,final修饰的值直接初始化为相应值。 类变量为static修饰的变量,区分于实例变量。...执行类构造器()方法,如下: 编译器根据类文件中定义顺序自动收集类中的类变量的赋值动作和静态语句块儿的语句合并产生,静态语句块儿只能访问到其前定义的变量。...区别于类的构造方法,不需要显示的调用父类构造器,虚拟机保证子类的()执行之前父类的()已经执行完成。 父类中的静态语句块儿执行于前。
类加载过程 2.1 加载 加载阶段,JVM做三件事: 通过一个类的全限定名来获取此类的二进制字节流 将这个字节流代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的java.lang.Clas...类中的字段,方法是否和父类产生矛盾(覆盖父类final字段,不合规范的重载) 字节码验证:通过数据流和控制流分析,确定程序语义是合法的,符合逻辑的,对类的方法器进行校验分析,保证被校验的类的方法在运行时不会做出危害虚拟机安全的事件...对类自身以外(常量池中的各种符号引用)的信息进行匹配校验,包括: 符号引用中通过字符串描述的全限定名能否找到对应的类 在指定类中是否存在符合方法的字段描述符和简单名称所描述的方法和字段 符号引用中的类,...Java方法执行,putstatic指令是在程序编译时,存放在类构造器()方法中。...,收集顺序是由语句在源文件中出现的顺序决定的,静态语句块只能访问定义在静态语句块之前的变量,定义在之后的变量,静态语句块可以赋值,但不能访问 ()方法和类的构造函数不同,它不需要显式调用父类构造器
VaueOf系列都有对应的缓存区, 缓存区范围内对象为同一个 缓冲区为静态内部类中的数组 ?...'\u0030' 到 '\u0039' 和从 '\u0061' 到 '\u007A' 如果 radix 为 N, 则按照所示顺序,使用这些字符中的前 N 个作为其数字...radix) 静态方法 在第二个参数指定的基数中,返回第一个参数的字符串表示的无符号整数值 如果基数不在Character.MIN_RADIX 和 Character.MAX_RADIX...Long对象中内部的 long value值 hashCode static int hashCode(long value) 静态方法返回某个long 数值的hashcode int hashCode...Long getLong(String nm, Long val) 确定具有指定名称的系统属性的整数值 第一个参数被视为系统属性的名称 通过 System.getProperty
1)所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。...2)而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。...类索引用来确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名,接口索引集合用来描述这个类实现了哪些接口,这些被实现的接口将按实现或继承的顺序从左到右的顺序排列在接口的索引集合中。...类索引、父类索引和接口索引都按顺序排列在访问标志之后。 接下来就是@字段表@了,此处字段表存的就是前文说的类成员变量或实例成员变量,但不包括方法内部声明的变量。...如果类存在父类,则除非子类覆盖了父类的字段定义,否则在子类中不会列出从超类或父接口中继承而来的字段,但有可能列出原来java代码中不存在的字段,譬如在内部类为了保持对外部类的访问性,会自动添加指向外部类实例的字段
本节就来讨论Java中的解决机制,具体包括包、jar包、程序的编译与连接,从包开始。...,Java中解决这个问题的方法就是包。...在一个类内,对其他类的引用必须是唯一确定的,不能有重名的类,如果有,则通过import只能引入其中的一个类,其他同名的类则必须要使用完全限定名。...在Java源代码编译时,Java编译器会确定引用的每个类的完全限定名,确定的方式是根据import语句和classpath。如果import的是完全限定类名,则可以直接比较并确定。...总结来说,import是编译时概念,用于确定完全限定名,在运行时,只根据完全限定名寻找并加载类,编译和运行时都依赖类路径,类路径中的jar文件会被解压缩用于寻找和加载类。
这里解释一下动态绑定和静态绑定: 静态绑定: 在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序实现。...作为方法区这个类的各种数据的访问入口 值得一提的是,二进制流可以从zip包中获取,这也是JAR或者WAR包格式也能部署项目基础。...:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的; 符号引用验证:对类自身以外的信息进行匹配性校验, 比如符号引用中通过字符串描述的全限定名是否能找到对应的类等等。...()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的。也就是说,如果一个类没有静态成员变量和静态块,是可以不执行类构造方法的。...2.类构造器中的赋值操作 对于静态块中的赋值操作,我们需要注意:静态语句块只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问。
那么在 Spring 内部又是如何存储这些信息的呢?...可通过如下方式使用Class属性来实例化 bean: 3.1 构造器 在容器自身通过反射调用其构造器直接创建bean时,指定要构造的bean类,类似new运算符。...看个例子,如下BeanDefinition指定将通过调用工厂方法来创建bean。该定义不指定返回对象的类型,而仅指定包含工厂方法的类。该示例中的initInstance()方法须是静态方法。...使用该方式实例化会从容器中调用现有bean的非静态方法来创建新bean。...BeanFactory.getType 推荐调用 BeanFactory.getType确定bean的运行时类型。 ? 该方法可确定给定名称bean的类型。
局部变量表所需的内存空间在编译器间完成分配,当进入一个方法是,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。...2、在类加载检查通过后,接下来虚拟机将新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划出来。 ...① 通过一个类的全限定名来获取定义此类的二进制字节流(通过类加载实现); ② 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构; ③ 在内存中生成一个代表这个类的java.lang.Class...在()方法中,静态语句块中只能访问到定义在静态语句块之前的变量,定义在他之后的变量,在前面的静态语句块可以赋值,但不能访问。...六、类加载器 类加载器是类加载过程中加载阶段中“通过一个类的全限定名来获取描述此类的二加载字节流”的加载动作。
二、类加载器: 生命周期的第一阶段,即加载阶段需要由类加载器来完成的,类加载器根据一个类的全限定名读取类的二进制字节流到JVM中,然后生成对应的java.lang.Class对象实例, 在虚拟机默认提供了...任意一个类在JVM中的唯一性,是由加载它的类加载器和类的全限定名一共同确定的。...四、类加载生命周期: 1、加载阶段: 这阶段的虚拟机需要完成三件事情: (1)通过一个类的全限定名来获取定义此类的二进制字节流。 (2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。...: (1)()方法是有编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的,收集的顺序是由语句在源文件中出现的顺序决定的。...静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块中可以赋值,但是不可以访问。
Java语言运行时绑定的特性 ---- 加载 在加载阶段主要做三件事情: 通过一个类的全限定名或获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个代表这个类的...Class对象,作为方法区这个类的各种数据的访问入口 通过一个类的全限定名或获取定义此类的二进制字节流,并没有指明二进制字节流必须得从某个Class文件中获取,因此就这一点,就可以玩出花来,例如: 动态计算生成...----》动态代理技术 将类的字节码载入方法区中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有: _java_mirror 即 java 的类镜像,例如对...clinit方法的过程,该方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并而成的 初始化即调用 ()V ,虚拟机会保证这个类的『构造方法』的线程安全 发生的时机...clinit方法,其他线程都需要阻塞等待,直到活动线程执行完毕clinit方法 ---- 类加载器 Java虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述类的二进制字节流",这个动作放到
利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。 解释四: 如果你是方法,快递员是虚拟机。快递员通过地址查地图找你的叫反射调用。...反射就是一种机制,可以让你仅知道类的名字的情况下,可以了解整个类的内部的结构,并且访问内部的成员和方法等。...在大家每一个编写的类实例中,都会定义这个类的包名,类名,访问域,特征符,构造器,字段,函数,父类,接口等等内容。这些内容在我们的 Class 类中都提供了对应的获取方法进行获取。...();//获取类中定义的方法 Method talkMethod = clazz.getMethod("talk", String.class);//获取类中指定名称和参数的公有方法 Method pugMethod...= clazz.getDeclaredMethod("pickUpGirls") //获取类中定义指定名称和参数的方法 int modifers = pugMethod .getModifiers()
主要做三件事 通过一个类的全限定名获取定义此类的二进制字节流 将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口...,一般来说,Java应用的类都是由它来完成加载 连接 至此为止,我们的 Test.class 就加载到了 JVM 中,而 JVM 呢为了自身的安全会进行一系列的校验。...校验的过程叫做 验证 验证 目的在于确保 Class 文件的字节流中包含信息符合当前虚拟机的要求,保证被加载类的正确性,不危害虚拟机自身的安全。...而在 JDK8 以后,类变量会被分配在 Java 堆中 解析 准备阶段完成了,但我们的 Test 类要想被执行还差最重要的一步:解析 将常量池中符号引用转换为直接引用. ( 有了直接引用,那引用的目标必定已经在虚拟机的内存中存在了...初始化 在连接阶段完成之后,就开始正式执行 main 方法了,由于 main 方法是 public static 的,所以 JVM 会判断 Test 类是否已经初始化了,如果没有则对其进行初始化 一般在下面这
该阶段会验证如下内容: 符号引用中通过字符串描述的全限定名是否能找到对应的类 在指定类中是否存在符合方法的字段描述符及简单名称所描述的字段和方法 符号引用中的类、字段、方法的可访问属性(private、...从概念上说所使用的内存都应当在方法区中进行分配,但必须到方法区本身是一个逻辑上的区域,在 JDK 1.7 及之前,HotSpot 使用永久代来实现方法区时,实现是完全符合这种逻辑的。...()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量...,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问 ()方法与类的构造函数(即在虚拟机视角中的实例构造器()方法)不同,它不需要显式地调用父类构造器,Java虚拟机会保证在子类的()方法执行前...如果在一个类的 ()方法中有耗时很长的操作,那就可能造成多个进程阻塞[2],在实际应用中这种阻塞往往是很隐蔽的。 类加载器 类加载器能够通过一个类的全限定名来获取该类的二进制字节流。
领取专属 10元无门槛券
手把手带您无忧上云