静态变量

java new一个对象的流程

旧时模样 提交于 2019-12-10 00:39:57
转自:https://www.cnblogs.com/JackPn/p/9386182.html java在new一个对象的时候 ,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。 我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程: 加载并初始化类和创建对象 。 一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类的加载的,所以在描述类加载过程前,我们先看一下它的工作过程: 双亲委托模型的工作过程是:如果一个类加载器(ClassLoader)收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需要加载的类)时,子加载器才会尝试自己去加载。 使用双亲委托机制的好处是:能够有效确保一个类的全局唯一性,当程序中出现多个限定名相同的类时,类加载器在执行加载时,始终只会加载其中的某一个类。 1、加载 由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例 2、验证

PHP中this,self,parent的区别

让人想犯罪 __ 提交于 2019-12-09 10:02:07
{一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的。 PHP5经过重写后,对OOP的支持额有了很大的飞跃,成为了具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性。这里我主要谈的是 this,self,parent 三个关键字之间的区别。从字面上来理解,分别是指 这、自己、父亲 。先初步解释一下, this是指向当前对象的指针 (可以看成C里面的指针), self是指向当前类的指针 , parent是指向父类的指针 。我们这里频繁使用 指针 来描述,是因为没有更好的语言来表达。关于指针的概念,大家可以去参考百科。 下面我们就根据实际的例子结合来讲讲。 <?php classname //建立了一个名为name的类 { private$name; //定义属性,私有 //定义构造函数,用于初始化赋值 function __construct( $name ) { $this->name =$name; //这里已经使用了this指针语句① } //析构函数 function __destruct(){} //打印用户名成员函数 function

PHP中this,self,parent的区别

北慕城南 提交于 2019-12-09 10:01:53
{一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的。 PHP5经过重写后,对OOP的支持额有了很大的飞跃,成为了具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性。这里我主要谈的是 this,self,parent 三个关键字之间的区别。从字面上来理解,分别是指 这、自己、父亲 。先初步解释一下, this是指向当前对象的指针 (可以看成C里面的指针), self是指向当前类的指针 , parent是指向父类的指针 。我们这里频繁使用 指针 来描述,是因为没有更好的语言来表达。关于指针的概念,大家可以去参考百科。 下面我们就根据实际的例子结合来讲讲。 <?php classname //建立了一个名为name的类 { private$name; //定义属性,私有 //定义构造函数,用于初始化赋值 function __construct( $name ) { $this->name =$name; // 这里已经使用了this指针语句① } //析构函数 function __destruct(){} //打印用户名成员函数

普通内部类和静态内部类总结

百般思念 提交于 2019-12-09 05:57:28
普通内部类可以访问其外部类的各种类型成员,但是静态内部类只能访问静态成员 普通内部类里面不能定义各种静态的成员(包括静态变量、静态方法、静态代码块和静态内部类),而静态内部类中则可以; 静态变量和静态方法会出现这个语法错误(static methods can only be declared in a static or top level type)意思就是static方法只能在静态或者顶级类型(顶级类型应该就是外部类中)中声明,当然static变量和static内部类也是一样的道理。 原因在静态变量和静态方法都只需要通过类名就能访问,不必通过任何实例化对象;而普通内部类的初始化要利用外部类的实例化对象,这明显违背了static的设计初衷。 静态代码块会出现这个语法错误(Cannot define static initializer in inner type Outer.Inner)意思是不能在内部类中定义静态的初始化程序。 原因跟以上的差不多,static声明的成员只能为类所共有,而不能仅属于一个实例化对象,通俗点来说就是不管有多少层的引用,都只能是类来引用而不能是对象。 import java.util.Date; import java.util.StringTokenizer; import test.Outer.Inner1; abstract class

servlet不是线程安全的

半世苍凉 提交于 2019-12-08 09:46:30
在tomcat容器中,servlet默认是单例模式;如果实现ISingleThreadModule标记接口 则针对多个请求创建多个实例(最多20个),为了实现线程安全,可以: 1.使用局部变量 而不是实例变量 2.使用synchronized关键字 综上说明静态变量、实例变量、局部变量,三者使用范围或者说生命周期越大 则越不线程安全 来源: https://www.cnblogs.com/hzq3554055/p/12004630.html

static函数与普通函数

五迷三道 提交于 2019-12-07 19:26:37
static全局变量与普通的全局变量: static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量: static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数: static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。 1、 全局静态变量 在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。 1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在) 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。 定义全局静态变量的好处: 1) 不会被其他文件所访问,修改 2) 其他文件中可以使用相同名字的变量,不会发生冲突。 2、 局部静态变量 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。 1)内存中的位置:静态存储区 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置

关于static 关键字的总结

依然范特西╮ 提交于 2019-12-07 09:51:40
转发自:https://www.cnblogs.com/xrq730/p/4820992.html 前言 之前讲到final关键字的作用是每次面试的时候我必问求职者的两个问题之一,另外一个问题就是文本会写到的static。final和static一样,都是一个小问题可以看到一个人的基础是否扎实以及平时是否有钻研精神。 静态变量和静态方法 static关键字最基本的用法是: 1、被static修饰的变量属于类变量,可以通过 类名.变量名 直接引用,而不需要new出一个类来 2、被static修饰的方法属于类方法,可以通过 类名.方法名 直接引用,而不需要new出一个类来 被static修饰的变量、被static修饰的方法统一属于类的 静态资源,是类实例之间共享的,换言之,一处变、处处变 。JDK把不同的静态资源放在了不同的类中而不把所有静态资源放在一个类里面,很多人可能想当然认为当然要这么做,但是是否想过为什么要这么做呢?个人认为主要有三个好处: 1、不同的类有自己的静态资源,这可以实现静态资源分类。比如和数学相关的静态资源放在java.lang.Math中,和日历相关的静态资源放在java.util.Calendar中,这样就很清晰了 2、避免重名。不同的类之间有重名的静态变量名、静态方法名也是很正常的,如果所有的都放在一起不可避免的一个问题就是名字重复,这时候怎么办

c/c++变量之内存空间分配

放肆的年华 提交于 2019-12-07 07:44:49
变量的内存空间主要有以下几个:堆(heap)、栈(stack)、全局静态区、文字常量区、代码区 heap:不连续的内存区域,由开发者自行进行开辟和释放。如果程序结束时没有进行释放、操作系统会对其进行管理。开发者通过new/malloc等创建存放在heap上的变量,通过delete/free对他们进行删除。 stack:和堆不同,它是连续的内存空间。由编译器进行分配和回收等管理。一般存放函数的参数、局部变量等。 全局静态区:存放全局变量和静态变量。全局变量在main方法之前声明,不显示使用static关键字。作用域是整个工程。在定义的本文件内直接使用。而其他的文件加上extern关键字声明后,也可以使用。静态变量由static关键字声明,他的作用域只在定义的文件,外部的文件不能用extern的方式进行使用。也就是说全局变量一定是静态变量,而静态变量不一定是全局的。anyway,这两个变量都存储在全局静态区。 文字常量区:存放常量,像const声明的变量、或者字符串常量就存储在这个内存空间中。 代码区:也叫代码段,存放程序的二进制代码。 系统响应: 对于堆,应知道系统有一个记录空闲内存地址的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆结点,删除空闲结点链表中的该结点,并将该结点空间分配给程序(大多数系统会在这块内存空间首地址记录本次分配的大小

深入理解static关键字

白昼怎懂夜的黑 提交于 2019-12-06 12:35:52
在开始讲static之前,我想让各位看一段有意思的代码: public class Test { static{ System.out.println("test static 1"); } static{ System.out.println("test static 2"); } public static void main(String[] args) { } } 看完程序,小白童鞋发话了:啥玩意?main方法中啥都没有,能运行啥?博主你个星星星... 运行结果: test static 1 test static 2 小白童鞋:那啥...那啥...博主我说啥了,我啥都没说... 其实,上面的代码懂的自然懂,不懂的自然就不懂了,因为上面的代码涉及到JVM的类加载了!当然不在本篇博客文章的范畴内,如果有兴趣理解上面的程序,这篇文章可能会对你有所帮助 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】 1、static存在的主要意义 static的主要意义是在于创建独立于具体对象的域变量或者方法。 以致于即使没有创建对象,也能使用属性和调用方法 ! static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能 。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候

JVM的类加载机制全面解析

大兔子大兔子 提交于 2019-12-06 11:39:53
什么是类加载机制 JVM把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制。 如果你对Class文件的结构还不熟悉,可以参考之前的文章 Class文件结构全面解析(上) 和 Class文件结构全面解析(下) 。 欢迎关注微信公众号: 万猫学社 ,每周一分享Java技术干货。 类的生命周期 类从被加载到内存中,到被卸载出内存,一共分为以下几步: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using) 卸载(Unloading) 类加载的全过程,包括其中的 加载 、 验证 、 准备 、 解析 、 初始化 几个阶段。 欢迎关注微信公众号: 万猫学社 ,每周一分享Java技术干货。 加载 加载是类加载的第一阶段,在这一步中JVM规范要求完成了以下三件事: 通过一个类的全限定名来获取定义这个类的二进制字节流。 将这个字节流多代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的java.lang.Class对象。 以上要求其实并不具体,JVM的具体实现和应用都是比较灵活的。比如:获取这个类的二进制字节流,并没有说从哪获取,怎么获取