Java中静态跟非静态的区别总结
来源:互联网 发布:广发手机证券交易软件 编辑:程序博客网 时间:2024/06/11 13:18
一.静态变量跟实例变量的区别:
1.静态变量:由static修饰,在JVM中,静态变量的加载顺序在对象之前,因此静态变量不依附于对象存在,可以在不实例化类的情况下直接使用静态变量,如下代码所示。
public class StaticTest { static int a = 13; int b = 14; public static void main(String[] args) { int c = StaticTest.a; System.out.println(c); }}
静态变量属于类,不属于类中任何一个对象,因此静态变量又叫做类变量,一个类不管创建多少个对象(对象是类的一个实例),静态变量在内存中有且仅有一个。
2.实例变量:必须依附于对象存在,只有实例化类后才可以使用此类中的实例变量。
public class StaticTest { static int a = 13; int b = 14; public static void main(String[] args) { int d = new StaticTest().b; System.out.println(d); }}
二.静态方法跟实例方法的区别:
1.静态方法:方法用static关键字修饰,静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。使用时也是不需要实例化类,能够直接使用。静态方法无法被重写。
public class StaticTest { public static void MyStatic(){ System.out.println("这是StaticTest的一个静态方法"); } public static void main(String[] args) { StaticTest.MyStatic(); }}
需要注意的是:在静态方法中只能访问类中的静态成员跟静态方法,不能直接访问类中的实例变量跟实例方法,原因是静态方法在JVM中的加载顺序也在对象之前,直接使用实例变量跟实例方法的话,可能实例变量跟实例方法所依附的对象并没有被创建,会导致无法找到所使用的实例变量跟实例方法。
要想使用实例变量跟实例方法可以采用如下方法:在静态方法中创建实例变量和实例方法所在的对象,通过这个对象来使用实例变量跟实例方法。如代码所示:
public class StaticTest { int b = 14; public void MyMethod(){ System.out.println("这是StaticTest的一个实例方法"); } public static void MyStatic(){ StaticTest st = new StaticTest(); int e = st.b; st.MyMethod(); }}
2.实例化方法:属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。
public class StaticTest { public void MyMethod(){ System.out.println("这是StaticTest的一个实例方法"); } public static void main(String[] args) { new StaticTest().MyMethod(); }}
附加:
1.线程安全:静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发的问题。非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。
2.如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。
- Java中静态跟非静态的区别总结
- Java中静态方法和非静态方法的区别
- Java 中 静态方法与非静态方法的区别
- java中静态方法和非静态方法的区别
- Java中静态方法与非静态方法的区别
- Java 中 静态方法与非静态方法的区别
- Java中静态方法与非静态方法的区别
- java中静态变量和非静态变量的区别
- 总结java中静态块,静态方法,非静态方法,构造方法执行的顺序
- 浅谈Java中静态初始化块跟非初始化块
- 【转】C#中静态和非静态的区别
- .net中静态与非静态的区别
- C#中静态类与非静态类的区别
- C#中静态方法和非静态方法的区别
- synchronized 同步方法中静态与非静态的区别
- C#中静态变量与非静态变量的区别
- java中静态方法和非静态方法覆盖的区别
- java中覆盖静态方法和非静态方法的区别
- 欢迎使用CSDN-markdown编辑器
- StringUtils 中isEmpty 和 isBlank区别
- LVDS接口分类,时序,输出格式
- 数学实验
- SpringBoot入门
- Java中静态跟非静态的区别总结
- javascript正则表达式之匹配任何字符和非贪婪匹配
- MinGW与MSVC
- 浏览器启动java程序的运行时环境设置
- 通过url地址传递多个参数
- week18- NO.128. Longest Consecutive Sequence
- 图灵革命如何颠覆我们对世界的认知?
- LVDS之一_理解SerDes
- [leetcode]27.Remove Element(Java)