在语法定义上的区别:静态变量前要加static关键字,而实例变量(下面的变量包括一切静态【变量,方法,静态内部类】)前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
上面这些事官方翻译过来的解释,很多人进入了一个误区,那就是静态方法和变量越多,程序运行占用的内存越大,程序效率越低,但实际上却不是这样
静态变量上面还有一个东西,叫做类,不知道大家有没有试过静态类
从上面可以看出,静态对类的修饰是非法的
,除非是内部类,内部类其实也可以看做是顶级类的一个变量
我们可以看出,静态的东西其实都是依附于普通类而存在的,系统为静态变量分配内存之前必须先为类分配一个内存
有些人都认为java会在一开始就为所有的类分配一个内存,但其实并不是这样
大家想想,我们做一个项目,第三方的jar包有多少,如果真的一开始就为所有的类分配一个内存的话那还得了?
那么何时为内分配内存呢?
在编程语言之中(汇编除外)都有引用这么一个概念,只有当我们引用这个类的时候jvm才会为该类分配内存,如import关键字,还有我们用类名.方法名(变量名)的时候
静态和非静态最大的区别其实还是在于内存分配上,静态变量从引用的时候开始分配内存,jvm至始至终都只会为静态成员分配一个内存空间,而一般成员则是在类加载的时候加载内存,因此并不是静态成员越多程序越垃圾。
在java之中的单例模式就是采用静态实例化的方式。
当然,也并非静态成员越多越好,因为静态成员的生命周期是从加载开始,当整个程序,所有的地方都没有引用他们的指针时才会被jvm回收,而非静态成员则有自己固定的生命周期,能够及时释放内存
一些不常用的东西,我们没有必要让他一直占着内存,但偏偏object之中finalize
方法并不能被我们手动调用释放内存,
这个方法其实只是告诉我们有这么一个东西,并不能被我们所掌控
因此在java之中,我们应该看情况使用静态还是非静态,合理利用内存,
相关推荐
实例方法则属于对象,必须通过对象实例来调用,它们可以访问类的静态和非静态成员,因为它们与对象的状态相关。 最后,静态字段和非静态字段是类中存储数据的两种方式。静态字段是类级别的,所有类的实例共享同一个...
在给定的"C#源代码-静态和非静态.zip"压缩包中,可能包含了各种示例,演示了如何在实际项目中使用静态和非静态成员。这些源代码可以帮助开发者更好地理解这两种成员在内存管理、多线程环境下的行为差异,以及何时...
在`JNITEST`和`JNI`这两个文件夹中,可能包含了示例代码和编译后的库文件,这些文件可以用于进一步了解和实践JNI的静态和非静态头文件的使用。通过查看和运行这些示例,你可以更深入地理解两种方式的差异以及它们在...
在PHP编程语言中,`static`关键字用于定义类的静态属性和方法,它们与类的实例(对象)无关,而是直接关联到类本身。理解静态方法和非静态...在实际开发中,合理使用静态和非静态方法可以帮助提高代码的可读性和效率。
在C#中,静态和非静态的特征对于我们来说是再熟悉不过了,但是很少看到有一篇文章去好好地总结静态和非静态它们之间的不同,为了帮助大家更好地去理解静态和非静态特征, 所以将在这篇文章中帮大家全面总结下它们...
基于synchronized修饰静态和非静态方法 synchronized关键字是Java语言中的一种同步机制,用于解决多线程并发问题。在Java中,synchronized可以修饰静态方法和非静态方法,两者的锁机制不同。 非静态方法 ...
Java静态和非静态成员变量初始化过程解析 Java静态和非静态成员变量初始化过程解析是Java语言中一个非常重要的概念。了解Java静态和非静态成员变量的初始化过程对大家的学习或者工作具有一定的参考学习价值。 首先...
态变量是类中的一种特殊变量,他在运行是可以说是从属于类,也就是说由该类定义生成的所有对象共用同一个静态变量,内存中只有一个版本。这对于要求在程序运行过程中,只有一个对象副本存于内存非常重要,如在实现...
- 非静态内部类可以访问外部类的所有成员,包括静态和非静态的,因为它就像是外部类的一个成员,拥有其全部的访问权限。 3. **实例化**: - 创建静态内部类的实例,可以直接通过外部类的类名进行,如`OuterClass....
实例方法可以访问所有成员(静态和实例)。 #### 三、代码示例与实践 **1. 获取当前方法所在的类名** 在C#中,我们可以利用反射机制获取当前方法所在的类名。对于静态方法和实例方法,获取方式有所不同: - **...
静态变量和非静态变量的区别
在JavaScript中,静态方法与非静态方法是面向对象编程中的两个基本概念,它们在类的定义和实例化过程中扮演着重要角色。理解这两者之间的区别对于编写高效、可维护的代码至关重要。 ### 静态方法 #### 定义 静态...
由于 `t2` 和 `c1` 是静态变量,我们可以直接通过它们调用非静态方法 `f2()` 和 `f3()`,无需创建 `Table` 或 `Cupboard` 的实例。这展示了如何在没有对象的情况下使用静态变量调用非静态方法,尽管这通常不是最佳...
在Linux环境中,C语言可以通过Java Native Interface (JNI) 来调用Java的静态和非静态方法,实现两者之间的交互。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互,使得C/C++程序员可以编写...
为了避免这些问题,最佳实践是始终明确区分静态和非静态方法的使用,并遵循面向对象的编程原则,如封装和继承。在编写代码时,尽量避免静态调用非静态方法,除非在了解其潜在影响和历史背景的情况下。同时,确保对...
静态成员函数和非静态成员函数的根本区别在于非静态函数由对象名.或者对象指针->调用,调用时编译器会向函数传递this指针;静态成员函数则有类名::或者对象名.调用,编译器不向函数传递this指针,不识别对象个体,...
非静态方法是与对象相关的,只能通过对象实例调用,可以访问静态和非静态成员。`EX3_1`中的`nonStaticPrintA()`是非静态方法,它可以访问`a`和`sa`。 实例程序`EX3_1`和`ClassB`展示了这些概念的实际应用。当`Class...
在Java编程语言中,同步...开发者应根据具体需求权衡性能和数据安全性,合理选择静态或非静态同步。在实际开发中,还可以探索其他并发工具,如`ReentrantLock`、`Semaphore`等,它们提供了更精细的控制和更高的灵活性。
- 普通方法可以在内部直接访问类的静态和非静态成员,不受限制。 2. **静态初始化块**: - 静态初始化块是在类加载时执行的,且只执行一次,主要用于初始化类的静态变量。 - 静态初始化块不能用来初始化非静态...
那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,static就行,我就不行,歧视我???本例就是自己的研究成果,使用非静态的成员函数作为线程函数,还能修改类的非静态的...