在语法定义上的区别:静态变量前要加static关键字,而实例变量(下面的变量包括一切静态【变量,方法,静态内部类】)前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
上面这些事官方翻译过来的解释,很多人进入了一个误区,那就是静态方法和变量越多,程序运行占用的内存越大,程序效率越低,但实际上却不是这样
静态变量上面还有一个东西,叫做类,不知道大家有没有试过静态类
从上面可以看出,静态对类的修饰是非法的
,除非是内部类,内部类其实也可以看做是顶级类的一个变量
我们可以看出,静态的东西其实都是依附于普通类而存在的,系统为静态变量分配内存之前必须先为类分配一个内存
有些人都认为java会在一开始就为所有的类分配一个内存,但其实并不是这样
大家想想,我们做一个项目,第三方的jar包有多少,如果真的一开始就为所有的类分配一个内存的话那还得了?
那么何时为内分配内存呢?
在编程语言之中(汇编除外)都有引用这么一个概念,只有当我们引用这个类的时候jvm才会为该类分配内存,如import关键字,还有我们用类名.方法名(变量名)的时候
静态和非静态最大的区别其实还是在于内存分配上,静态变量从引用的时候开始分配内存,jvm至始至终都只会为静态成员分配一个内存空间,而一般成员则是在类加载的时候加载内存,因此并不是静态成员越多程序越垃圾。
在java之中的单例模式就是采用静态实例化的方式。
当然,也并非静态成员越多越好,因为静态成员的生命周期是从加载开始,当整个程序,所有的地方都没有引用他们的指针时才会被jvm回收,而非静态成员则有自己固定的生命周期,能够及时释放内存
一些不常用的东西,我们没有必要让他一直占着内存,但偏偏object之中finalize
方法并不能被我们手动调用释放内存,
这个方法其实只是告诉我们有这么一个东西,并不能被我们所掌控
因此在java之中,我们应该看情况使用静态还是非静态,合理利用内存,
相关推荐
JNI开发之javah生成静态和非静态的两个头文件区别
在C#中,静态和非静态的特征对于我们来说是再熟悉不过了,但是很少看到有一篇文章去好好地总结静态和非静态它们之间的不同,为了帮助大家更好地去理解静态和非静态特征, 所以将在这篇文章中帮大家全面总结下它们...
静态成员属于类本身,而非静态成员我们称之为实例成员,属于类的实例,下面欧#柏#泰#克就.NET的静态与非静态的区别分析进行下学习吧:
态变量是类中的一种特殊变量,他在运行是可以说是从属于类,也就是说由该类定义生成的所有对象共用同一个静态变量,内存中只有一个版本。这对于要求在程序运行过程中,只有一个对象副本存于内存非常重要,如在实现...
主要介绍了基于synchronized修饰静态和非静态方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
C#源代码
(js)静态与非静态方法,(js)静态与非静态方法
C#静态方法与非静态方法的比较
静态变量和非静态变量的区别
主要介绍了Java静态和非静态成员变量初始化过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
静态成员函数和非静态成员函数的根本区别在于非静态函数由对象名.或者对象指针->调用,调用时编译器会向函数传递this指针;静态成员函数则有类名::或者对象名.调用,编译器不向函数传递this指针,不识别对象个体,...
在Java中定义变量时需要慎重考虑是静态还是非静态,因为静态拥有绝对优先权!
那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,static就行,我就不行,歧视我???本例就是自己的研究成果,使用非静态的成员函数作为线程函数,还能修改类的非静态的...
PHP中静态方法(static)与非静态方法的使用及区别.docxPHP中静态方法(static)与非静态方法的使用及区别.docxPHP中静态方法(static)与非静态方法的使用及区别.docxPHP中静态方法(static)与非静态方法的使用及区别.docx
java初学者在编写类,在调用方法,在静态方法与动态方法使用会出现的一些错误。 学习后 能初步了解自己的错误的原因 以及遇到这种错误的改正方法 避免下次踩坑
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
JAVA静态方法和非静态方法的区别和实例 静态方法和非静态方法是 Java 编程语言中两个基本概念,它们在编程实践中扮演着重要角色。了解它们的区别和使用场景对于编写高效、可维护的代码至关重要。 什么是静态方法?...
普通类可以包含静态和非静态成员; 5)静态类不能作为字段,方法参数和局部变量使用;普通类可以; 静态类的意义: 可以用静态类封装一组不与任何对象相关联的方法,如Math类,Console类。 静态构造函数 vs 实例...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) ...
静态与非静态.cs