静态变量

java中类的加载面试

浪子不回头ぞ 提交于 2020-01-17 21:43:51
什么是类的加载? JVM把通过类名获得类的二进制流之后,把类放入方法区,并创建入口对象的过程被称为类的加载。经过加载,类就被放到内存里了。 哪些情况会触发类的初始化? 类在5种情况下会被初始化: 第一,假如这个类是入口类,他会被初始化。 第二,使用new创建对象,或者调用类的静态变量,类会被初始化。不过静态常量不算。 第三,通过反射获取类,类会被初始化 第四,如果子类被初始化,他的父类也会被初始化。 第五,使用jdk1.7的动态语言支持时,调用到静态句柄,也会被初始化。 讲一下JVM加载一个类的过程 同问题1。不过这里也可以问下面试官是不是想问类的生命周期。如果是问类的生命周期,可以回答有"加载、连接、初始化、使用、卸载"五个阶段,连接又可以分为"校验、准备、解析"三个阶段。 什么时候会为变量分配内存? 在准备阶段为静态变量分配内存。 JVM的类加载机制是什么? 双亲委派机制,类加载器会先让自己的父类来加载,父类无法加载的话,才会自己来加载。 双亲委派机制可以打破吗?为什么 可以打破,比如JDBC使用线程上下文加载器打破了双亲委派机制。原因是JDBC只提供了接口,并没有提供实现。 深入原理 类的生命周期 类的生命周期相信大家已经耳熟能详,就像下面这样: 加载 加载主要做三件事: 找到类文件(通过类的全限定名来获取定义此类的二进制字节流) 放入方法区

springboot 静态变量,静态方法等从配置读取的方法和思路

与世无争的帅哥 提交于 2020-01-17 21:30:02
spring boot中如果需要从配置文件读取属性值,需要下面两部 首先在类上添加 @Component注解 然后在属性上加@Value("${paramValue}")。 但是,如果属性是静态的话,这总方法是行不通的,属性会是一个空值,那就需要一张变通的方法,通过set方法注入,代码如下: public static int ParamValue; @Value("${paramValue}") public void setParamValue(int value) { ParamValue = value; } 这样,就能获取到了,但是如果使用的这个类静态属性的是一个静态方法呢?有需要怎么呢。 我们都知道,静态方法的读取容器中的对象是会返回空的,除非我们通过applicationContext.getBean()来获取。通过这个思路我们可以通过下面3步来实现静态方法中读取静态属性。 1.和以前的思路一样,创建一个通过applicationContext获得对象的静态工厂方法,如下 package com.cmxf.utils; import org.springframework.context.ConfigurableApplicationContext; public class BeanUtil { //将管理上下文的applicationContext设置成静态变量

《Java技术》第二次作业

别说谁变了你拦得住时间么 提交于 2020-01-17 09:25:26
(一)学习总结 1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么? public class Test { public static void main(String args[]) { Foo obj = new Foo(); } } class Foo{ int value; public Foo(int intValue){ value = intValue; } } 构造方法是一个与类名相同且没有返回值类型的方法,对象的创建都是通过构造方法完成的,主要功能是完成对象的初始化。构造方法的重载就是方法名相同,而参数个数和类型不同,调用时,会自动相应的构造方法。不能通过编译,因为程序中是有一个参数的构造方法,主方法中调用的是无参的构造方法,所以不能实现。一个类中必定存在构造方法,如果没有明确的声明时,系统会自动生成一个无参的构造方法,如果已经明确的声明了一个构造方法,那么程序在编译时就不会再生成默认的构造方法。 2.运行下列程序,结果是什么?分析原因,应如何修改。 public class Test { public static void main(String[] args) { MyClass[] arr=new MyClass[3]; arr[1].value=100; } } class MyClass{ public int value

JVM相关相关知识点

丶灬走出姿态 提交于 2020-01-16 13:38:05
1.jvm基本结构 编译器会将我们编写的Java文件编译成 .class 文件,JVM会加载并执行 .class 文件。下面的图展示了JVM的整体架构 1,类加载子系统负责动态加载类,在运行时(而非编译时),当一个类初次被引用的时候,它将被加载、链接、初始化。 2,运行时数据区,运行时数据区可以划分为五个区域: 方法区:全局共享资源,所有的类级别的数据都会存储到这里,包括静态变量。 堆区:线程共享的资源,所有的对象和其对应的实例变量和数组都被存储在这个区域。 堆栈区:不共享资源,对于每个线程,将创建单独的运行时堆栈。对于每个方法调用,将在堆栈存储器中产生一个条目,称为堆栈帧。 PC寄存器:每个线程都有单独的PC寄存器,用于保存当前执行指令的地址。一旦执行指令,PC寄存器将被下一条指令更新 本地方法堆栈:本地方法堆栈保存本地方法信息。对于每个线程,将创建一个单独的本地方法堆栈。 3,执行引擎读取字节码并逐个执行 2.类加载 类的生命周期: 加载<将.class文件加载到内存> 连接(验证<验证字节码文件正确性> 准备<给类的静态变量分配内存并赋予默认值> 解析<类装载器装入类所引用的其他所有类> 初始化<给类的静态变量赋予正确的初始值执行静态代码块>-- 使用 卸载 类加载器的种类: 启动类加载器(bootstrap classloader):加载re目录的类 扩展类加载器

堆和栈的区别 (转贴)

梦想与她 提交于 2020-01-16 05:30:38
非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *

堆和栈的区别

旧时模样 提交于 2020-01-16 05:29:37
先简短的总结一下,这几天知识点吧 时间复杂度上:一般1e8是内部算法或结构是线性的,1e6的内部可为nlogn的算法; 空间估计:主函数内的局部变量是用栈存储的,有栈顶及栈大小的规定极易溢出。一般申请1M空间,int型数组250000左右。而全局(静态)变量存储在堆中,可以申请很大的空间。 下面是专业介绍,讲的很好啊! 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] =

Java 基础笔记 Static的使用

北城以北 提交于 2020-01-15 15:23:12
1.Static修饰成员变量 在Student类中定义了静态成员变量room,调用方式有两种: ①类名.静态变量名:Student.room ②对象名.静态变量名:Student stu = new Student(); stu.room; 2.Static修饰成员方法 在Student类中定义了静态成员方法shoutname,调用方法有两种: ①类名.静态变量名:Student.shoutname(); //推荐使用 ②对象名.静态变量名:Student stu = new Student(); stu.shoutname(); //不推荐使用 若在类当中有静态方法,则可直接 "方法名() " 调用,或类名.方法名(); 注意事项: 1.静态中不能直接访问非静态 //内存当中是先有静态,后有动态 2.静态方法中不能使用this关键字 //this代表当前对象,而静态中是直接通过类访问,所以没有对象 来源: CSDN 作者: 一名小白的进阶之路 链接: https://blog.csdn.net/qq_40275740/article/details/103986964

程序员写了一个新手都写不出的低级bug,被骂惨了。

点点圈 提交于 2020-01-15 11:49:57
本文转自: https://www.cnblogs.com/aobing/p/12189755.html 这篇文章算是读后总结,刚开始看这篇博客不理解啊,咨询了一下身边厉害的大佬。Oh Oh 原来是这样!!! 希望能给跟我一样的小白,一点点启发。 你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)。 也有好几个号主发来问候,直接实名羡慕哈哈,丙丙以后也是被微信推荐过的男人了,你们也是有牌面的读者了。 前言 你们是不是以为丙丙这么忙了,肯定不会写技术文章给你们看了? 丙丙暖男来的,不过说实话年前估计是没啥时间写技术文章了,上周末两篇你们也看到了,不是年会就是首脑峰会,实在很忙。 这周也是一样,我们年底了项目也赶,我今天一列下个Q的计划,我的个乖乖,平均三天一个需求,什么鬼啊。 而且周四又有技术部的年会,我还是视频的导演(打杂仔哈哈),肯定需要确认很多细节,到时候我应该还可以周末水一篇给你们看(剧透下那一期会有我女神入镜)。 下周周二我就坐车回家了

精讲 JVM架构体系介绍

随声附和 提交于 2020-01-15 11:39:37
每个Java开发人员都知道字节码将由JRE(Java Runtime Environment)执行。但是许多人并不知道JRE是Java虚拟机(JVM)的实现,它可以分析字节码,解释代码并执行它。作为开发人员,了解JVM的体系结构非常重要,因为它使我们能够更高效地编写代码。 通过优锐课的jvm分享,在本文中,我们将更深入地了解Java中的JVM体系结构以及JVM的不同组件。分享给大家参考学习。 什么是JVM? 虚拟机是物理机的软件实现。Java是根据WORA(可在任何地方写入一次)的概念开发的,可在VM上运行。编译器将Java文件编译为Java .class文件,然后将该.class文件输入到JVM中,JVM会加载并执行该类文件。下图是JVM的体系结构图。 JVM体系结构图 JVM如何工作? 如上面的架构图所示,JVM分为三个主要子系统: 1.类加载器子系统 2.运行时数据区 3.执行引擎 1.类加载器子系统 Java的动态类加载功能由类加载器子系统处理。它加载链接,并在运行时(而非编译时)首次引用类时初始化类文件。 1.1加载 类将由该组件加载。引导类装入器、扩展类装入器和应用程序类装入器是有助于实现它的三个类装入器。 1.引导程序类加载器–负责从引导类路径加载类,除了rt.jar此加载程序将获得最高优先级。 2.扩展类加载器–负责加载ext文件夹中的类 3.应用程序类加载器

【C语言】变量类型

让人想犯罪 __ 提交于 2020-01-15 11:16:24
转载自cnblogs.com/mjios 语言有丰富的数据类型和运算符,因此计算能力非常强大,计算过程中使用的值一般用变量来存储。变量也是有分类型的,不同类型的变量有不同的存储类型、不同的生命周期、不同的作用域,C语言也提供了一些关键字来设置变量的属性(比如设置存储类型、生命周期)。 回到顶部 一、变量的作用域 C语言根据变量 作用域 的不同,将变量分为局部变量和全局变量。 1.局部变量 1> 定义:在函数内部定义的变量,称为局部变量。 形式参数也属于局部变量 。 2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。 2.全局变量 1> 定义:在所有函数外部定义的变量,称为全局变量。 2> 作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。 1 int a; 2 3 int main () 4 { 5 int b; 6 return 0; 7 } 第1行的变量a是全局变量,第5行的变量b是局部变量。 回到顶部 二、变量的存储类型 * 变量的存储类型就是指变量存储在什么地方。有3个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。变量的存储类型决定了变量何时创建、何时销毁以及它的值能保持多久,也就是决定了变量的生命周期。 * C语言根据变量的 存储类型 的不同