当前位置: 首页 > news >正文

Java中静态跟非静态的区别总结

一.静态变量跟实例变量的区别: 
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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

静态变量属于类,不属于类中任何一个对象,因此静态变量又叫做类变量,一个类不管创建多少个对象(对象是类的一个实例),静态变量在内存中有且仅有一个。


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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二.静态方法跟实例方法的区别: 
1.静态方法:方法用static关键字修饰,静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。使用时也是不需要实例化类,能够直接使用。静态方法无法被重写。

public class StaticTest {
    public static void MyStatic(){
        System.out.println("这是StaticTest的一个静态方法");
    }

    public static void main(String[] args) {
        StaticTest.MyStatic();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

需要注意的是:在静态方法中只能访问类中的静态成员跟静态方法,不能直接访问类中的实例变量跟实例方法,原因是静态方法在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();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.实例化方法:属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。

public class StaticTest {

    public void MyMethod(){
        System.out.println("这是StaticTest的一个实例方法");
    }

    public static void main(String[] args) {
        new StaticTest().MyMethod();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

附加: 
1.线程安全:静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发的问题。非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。 
2.如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。

相关文章:

  • Spring IOC原理解读 面试必读
  • spring ioc原理(看完后大家可以自己写一个spring)
  • 非可抢占式和抢占式进程调度的区别是什么?
  • 【数据结构】ArrayList原理及实现学习总结
  • Java集合:HashMap源码剖析
  • 从原则、方案、策略及难点阐述分库分表
  • IDEA,WebStorm ,pyCharms 2018注册码 (2018jetbrain所有产品都可以)
  • css如何让div显示在最上层
  • XMind制作思维导图——添加子标题
  • JAVA中的Random()函数,获取随机数
  • FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
  • linux wget安装以及使用
  • Servlet中response、request乱码问题解决
  • IntelliJ IDEA设置类代码模板自定义(注释)
  • JAVA数组Java StringBuffer 和 StringBuilder 类
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [Vue CLI 3] 配置解析之 css.extract
  • jdbc就是这么简单
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Promise面试题2实现异步串行执行
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Xmanager 远程桌面 CentOS 7
  • 程序员该如何有效的找工作?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 数组大概知多少
  • 通过几道题目学习二叉搜索树
  • 学习使用ExpressJS 4.0中的新Router
  • 怎样选择前端框架
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Spring第一个helloWorld
  • 带你开发类似Pokemon Go的AR游戏
  • 进程与线程(三)——进程/线程间通信
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (3)nginx 配置(nginx.conf)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (9)STL算法之逆转旋转
  • (a /b)*c的值
  • (bean配置类的注解开发)学习Spring的第十三天
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (五)Python 垃圾回收机制
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)socket Aio demo
  • (转)德国人的记事本
  • (转)关于多人操作数据的处理策略
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net Redis的秒杀Dome和异步执行
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET框架设计—常被忽视的C#设计技巧
  • ?php echo ?,?php echo Hello world!;?
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)