引言 一直疑惑静态类、静态方法、静态变量的内存驻用情况。今天就写了个Demo来深入八一八他们的区别和注意点。...为了演示方便,方法名和变量名采取中文命名 先上结论 静态变量 只在类初始化时加载一次 静态方法和静态方法语法糖 实时加载里面的内容 只读属性 实时加载里面的内容 附有初始值的属性语法糖 只在类初始化时加载一次...(应该是set里面处理的,而不是get里面处理的) 静态有参方法 实时加载里面的内容 无图我还说什么?...请看代码 代码 先看测试Demo 1.非静态类 中静态方法 /// /// 非静态类 /// public class TestCommonService...{ /// /// 静态变量 /// public static string 静态变量
类的静态成员要在类内声明,类外定义。这样做的原因参照 here类外定义时又要注意哪些内容呢?不在头文件中定义静态成员变量这是“尽量不在头文件中定义变量”(参考)的延伸。...错误的代码示例class.h#ifndef __CLASS_H#define __CLASS_Hclass A{ static int var;};int A::var = 1;#endifmain.cppint
堆:存放对象实例和数组 方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码和编译加载的数据等。运行时常量池是方法区的一部分,用于存放编译器生成的各种字面量和符号引用。...局部变量和成员变量的区别 ①声明的位置 局部变量:方法体们中,形参,代码块们中 成员变量:类中方法外 - 类变量:有static修饰 - 实例变量:没有static修饰 ②可用的修饰符 局部变量...④作用域 局部变量:从声明处开始,到所属的]结束口实例变量:在当前类中“this.”(有时this.可以缺省),在其他类中“对象名.”访问 类变量:在当前类中“类名.”...或“对象名.”访问 ⑤生命周期 局部变量:每一个线程,每一次调用执行都是新的生命周期口 实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例变量是独立的 类变量:随着类的初始化而初始化...,随着类的卸载而消亡,该类的所有对象的类变量是共享的
在php中,访问类的方法/变量有两种方法: 1. 创建对象object = new Class(),然后使用”->”调用: 2....直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以。但是有前提条件: A. 如果是变量,需要该变量可访问。 B....如果是方法,除了该方法可访问外,还需要满足: b1) 如果是静态方法,没有特殊条件; b2) 如果是非静态方法,需要该方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题...然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢? 差异还是显然存在的,如下: 1....静态方法 静态方法可以直接使用class::… 来调用,而非静态方法需要满足一定限制条件才能使用class::.. 的方法调用,如之前所述
学习Java的过程中,一开始很容易被这些各种变量绕晕,这篇博客主要介绍了这几种变量之间的关系和区别。...//成员变量、静态变量(类变量) public static String level = "SSS"; //成员变量、静态变量(类变量) public int getAge...成员变量:作用范围是整个类,相当于C中的全局变量,定义在方法体和语句块之外,一般定义在类的声明之下;成员变量包括实例变量和静态变量(类变量); 实例变量:独立于与方法之外的变量,无static修饰,...声明在一个类中,但在方法、构造方法和语句块之外,数值型变量默认值为0,布尔型默认值为false,引用类型默认值为null; 静态变量(类变量):独立于方法之外的变量,用static修饰,默认值与实例变量相似...,一个类中只有一份,属于对象共有,存储在静态存储区,经常被声明为常量,调用一般是类名.静态变量名,也可以用对象名.静态变量名调用; 局部变量:类的方法中的变量,访问修饰符不能用于局部变量,声明在方法、构造方法或语句块中
大家在用spring读取配置文件中的数据的时候,一定用过@Value这个注解。但有时候如果我们想要给静态变量赋值发现就不管用了,给静态变量赋值,要把@Value注解放到静态变量的set方法上。...最近的项目有这样一个需求,就是类中有几个静态变量,初始化的时候,他们的值需要读取一个配置文件,获取一个code,然后用这个code拼接而成。...这个code不是静态的变量,怎么实现的呢,代码如下: @Value("${projectCode}") private String projectCode; public static...,这几个静态变量就有有值了。...一定要注意这个类要被spring管理,也就是要用@Controller,@Service,@Component等注解注释。
a.bStart=false; sleep(3); return 0; } 再看输出: 1 1 1 1 1 1 1 1 1 1 over 这个例子说明: (1)线程传参如果是这个类对象...,则为引用传递,你在外部其他地方修改类的成员变量会影响到类静态函数中传递这个类对象,比如这个例子中bStart变量 (2)线程创建需要的函数是静态函数或者全局函数,如果您使用类的成员函数放到pthread_create...中则会报错 (3)注意线程中传递参数时候传递参数的类型要对应。
一、静态成员变量概念 1、静态成员变量引入 在 C++ 类中 , 静态成员变量 又称为 静态属性 ; 静态成员归属 : 静态成员变量 是特殊的成员变量 , 是 类所有的 成员 , 而不是对象所有的成员...; 静态成员变量 提供了 同类对象的共享机制 : 同一个类的 所有实例对象 , 都可以共享访问 想通的 静态成员变量实例 ; 2、静态成员变量声明 静态成员变量 声明 方式 : 使用 static 关键字...// 身高 // 在类内部定义静态成员 static int number; }; 3、静态成员变量初始化 静态成员变量 初始化 : 静态成员变量 是在 类使用时 , 在类的外部 进行 初始化 ;...Student 类的 静态成员 成员变量 初始化有两种方式 : 声明 并 进行初始化 : 声明类内部已经定义的 静态成员变量 , 然后进行初始化 ; // 在类外部初始化静态成员变量 int Student...::number = 1; 只进行初始化 : 只对 类内部已定义的 静态成员变量 进行单纯的赋值 ; // 在函数中为 类 静态成员变量 赋值 Student::number = 2; 4、静态成员变量访问
System. out.println(a); } public static void modify(int a) { a++; } (a) 0 (b) 1 (0) 2 (d) 3 考点: 考察求职者对于类的静态变量的理解...出现频率: ★★★★ 【面试题解析】类的静态变量a在modify()方法中并没有被改变,而是改变了modify() 方法的参数。...args) { modify(a) System. out.println(a); } public static void modify(int b) { a++; } 那么输出结果为1,但是面试题中静态变量...a的值并没有改变,所以应该输出为0。
二、转换的本质 派生类可以转换为基类的本质是: ①为什么派生类可以转换为基类:派生类从基类而来,因此派生类中包含了基类的方法和成员。...将子类对象赋值给父类对象,相当于将子类中的父类成员变量赋值给父类 ?...//假设B公有继承于A A *a; B b; a = &b; //将派生类转换为基类,正确 B *p = a; //将基类再转换为派生类,错误 五、类静态类型/类动态类型 在上面我们介绍过,基类的指针或引用可以指向于基类对象也可以指向于派生类对象...,因此一个类可以分为是动态类型的还是静态类型的: 静态类型的类变量:在编译时就已经知道是什么类型的了 动态类型的类变量:自己所指的类型不明确,直到运行时才知道 如果表达式既不是引用也不是指针,那么其就没有静态类型和动态类型的概念...只有在程序运行的时候我们才知道所绑定的对象的真实类型 class A {}; class B:public A{}; int main() { A a; //静态类型 B b; //静态类型 A
普通全局变量: 静态局部变量: #define _CRT_SECURE_NO_WARNINGS #include void func() { static int b =...10; b++; printf("b=%d\n", b); } void test() { static int a = 10; printf("a=%d\n", a); //静态局部变量b...只会默认初始化一次 //多次调用func函数时,会跳过b的初始化代码,执行下一行++操作 func(); func(); func(); static int c; printf("c=%d...\n", c); } int main() { test(); return 0; } 静态全局变量:
分两个部分进行记录 目录 静态(static) 修饰类/方法/变量 静态(static) 修饰类 静态(static) 修饰方法/变量 常量(final) 修饰类/方法/变量 常量(final) 修饰类...常量(final) 修饰方法/变量 静态(static) 修饰类/方法/变量 静态(static) 修饰类 Java里面static一般用来修饰成员变量或函数。...但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。...静态(static) 修饰方法/变量 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写{这里之所以不能被重写,是因为重写的目的在与多态的使用,因为是静态的方法,无法实现多态,所以就算重写也是无用的...常量(final) 修饰类/方法/变量 常量(final) 修饰类 final 修饰的类不能被继承。 常量(final) 修饰方法/变量 1.final修饰的成员和成员变量,可以被继承。
静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它...静态变量可以实现让多个对象共享内存。
父类和子类的变量是同时存在的,即使是同名。子类中看到的是子类的变量,父类中看到的是父类中的变量,它们互相隐藏,而同名的方法则是实实在在的覆盖(重写),属性不存在重写哟。...如果超类没有不带参数的构造器,并且在子类的构造器又没有显式地调用超类的其他构造器,则 java 编译器将报告错误 情况四:子类和父类有同名同类型的静态常量的时候 public class Main...我觉得脑子里应该浮现出一个这样的知识点: Java中赋值顺序: 1、父类的静态变量赋值 2、自身的静态变量赋值 3、父类成员变量赋值和父类块赋值 4、父类构造函数赋值 5、自身成员变量赋值和自身块赋值...只有在准备阶段和初始化阶段才会涉及类变量的初始化和赋值,因此只针对这两个阶段进行分析; 类的准备阶段:需要做是为类变量(static变量)分配内存并设置默认值(注意此处都是先给默认值),因此类变量st...类构造器:编译器收集所有静态语句块和类变量的赋值语句,按语句在源码中的顺序合并生成类构造器 因此现在执行:st = new StaticTest().此时我们发现,就会进行对象的初始化了(看到没,这个时候
Java核心逻辑static、final修饰符 **静态变量、静态方法** - 关键字“static”:静态的 - static可以修饰类中的属性和方法 - 被static修饰的属性称之为类变量...(静态变量) - 被static修饰的方法称之为类方法(静态方法) - 二者都可以直接通过类名来访问。...,类属性又称为静态变量,被static修饰的 方法我们称为类方法,又称为静态方法,静态方法和静态变量都可以直接通过类名来访问,所以说,可以 称它为类变量或类方法。...静态变量和实例变量两者的区别 - 静态变量在内存中只有一个内存空间,在加载类的过程中完成静态变量的内存分配,可以直接通过类名来访问。...- 无论创建了一个类的多少个对象,静态变量只初始化一次,所有的实例都可以访问此静态变量,而且可以通过类名直接访问 - 实例变量是每创建一个新的实例对象,就会为它分配不同的内存,各个对象访问自己的实例变量
初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 3.其次,...初始化父类的普通成员变量和代码块,在执行父类的构造方法; 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法; 类的加载顺序: 父类静态成员变量、静态块>子类静态成员变量、 静态块>...父类普通成员变量、非静态块>父类构造函数>子类 普通成员变量、非静态块>子类构造函数 静态代码块:随着类的加载而执行,而且只执行一次 非静态代码块:每创建一个对象,就执行一次非静态代码块 关于各个成员简介
存储期,也分下面几种: 静态存储期,程序执行期间一直都在,文件作用域的变量具有静态存储期 自动存储期,它(变长数组除外)从块开始,到块末尾,因此,块作用域的变量具有自动存储期,它在栈中存储,需要显式初始化...,局部变量,静态局部变量,静态全局变量 到这里,我们就可以很容易区分上面的变量类型了。...实际上这里只是换了一种说法: 全局:具有文件作用域的变量 静态:具有静态存储期或内部链接属性 局部:具有函数或块作用域的变量 因而结合起来,也就很好理解了。...局部变量:函数或块作用域的变量 静态局部变量:函数或块作用域,静态存储期 全局变量:具有文件作用域的变量 静态全局变量:内部链接属性的,具有文件作用域的变量 当然,这仅仅是为了区分它们,这并不是它们的严格定义...更好的方法,是通过代码来理解: #include int num1 = 222; //全局变量 static int num2 = 111; //静态全局变量 int
1.静态成员函数和静态成员变量的引入 (1)我们通过以下面的这个例子逐步引出静态的成员变量和成员函数: 我们自己定义一个类,使用这个类创建对象,我们应该如何判断在这个程序执行的过程中,创建了多少个对象,...因为我们在这个地方给的缺省值是传递给了初始化列表的,初始化列表是对对象进行初始化的,但是我们这里的静态成员变量是属于这个类的,不会走初始化列表的,所以就不应该给缺省值; (3) 我们在类里面声明静态的成员变量...,我们还是要进行定义的,我们可以在外面定义进行初始化的操作;因为这个时候静态的成员变量属于整个类域,所以我们在类外面定义的时候加上访问操作符; (4)声明和定义完成之后,我们就可以进行打印输出成员变量的值...的,如果他们是private的,就都会报错,我们要想访问private这个里面的静态的成员变量,就需要使用和静态的成员变量相互对应的静态的成员函数; (7)在private情况下面,我们可以在类里面定义...因为我们知道静态的成员变量是在类里面的,属于类域,但是非静态的就是属于某个对象的,我们要想使用这个非静态的变量,我们就要适用对象进行使用,但是有对象就有this指针 ,相当于我们的非静态的变量需要this
什么是静态类 所谓静态类指的是无需实例化成对象,直接通过静态方式调用的类。代码如下: 静态类的问题 本质上讲,静态类是面向过程的,因为通常它只是机械的把原本面向过程的代码集合到一起,虽然结果是以类的方式存在,但此时的类更像是一件皇帝的新衣,所以可以说静态类实际上是披着面向对象的皮儿,干着面向过程的事儿...> 有了变量的介入,可以在运行时设定具体使用哪个静态类: <?php Article::setDao('MockArticleDAO'); Article::save(); ?...> 虽然这样的实现方式看似解决了Mock的问题,但是首先它修改的原有的代码,违反了开闭原则,其次它引入了静态变量,而静态变量是共享的状态,有可能会干扰其它代码的执行,所以并不是一个完美的解决方案。...… 当然,静态类有好的一面,比如说很适合实现一些无状态的工具类,但多数时候,我的主观倾向很明确,多用对象,少用静态类,避免系统过早的固化。顺便说一句,希望别有人告诉我静态类比对象快之类的说教,谢谢。
Java学习笔记之静态方法,非静态方法,静态变量,非静态变量四者之间的关系 首先明白这几个名词的意思: 静态方法:即类方法,在类之中,以static关键字申明的方法。...静态变量:即类变量,在类之中,方法之外,以static关键字申明的变量,它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。 使用方法:直接使用类名.类变量名来进行访问。...非静态变量:即成员变量,在类之中,方法之外,没有static关键字申明。 使用方法:需要先创建类对象,使用类对象名.成员变量名来进行调用。...这四者之间的关系 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。...静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量 静态方法中可以通过类名.静态方法名来调用,但不能直接调用非静态方法,需要通过对象来访问非静态方法 非静态方法中可以通过类名.