博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态与非静态
阅读量:4692 次
发布时间:2019-06-09

本文共 995 字,大约阅读时间需要 3 分钟。

一、静态变量和实例变量的区别

1、静态变量

  由static修饰,在jvm中,静态变量加载顺序在对象之前,所以静态变量不依赖对象的存在,可以不实例化对象的情况下使用类的静态变量。

 

通过上面的代码可以看出,静态变量可以在未实例化对象的时候使用,但是非静态变量只能在实例化对象时候才能使用。

 

 

 

 

运行结果为:

30

李四
40
李四

 

把User中的name改为非静态变量后

运行结果为:

30

李四
40
张三

 

根据上面两次运行结果可以看出,静态变量属于类,不属于类中任何一个对象,因此静态变量又叫做类变量,一个类不管创建多少个对象(对象是类的一个实例),静态变量在内存中有且仅有一个,所以name为静态变量时,即使是实例化对象,获得的name值是在内存中的,实例化对象并不会初始化该对象静态变量的值。

 

2、实例变量

  必须依附于对象存在,只有实例化类后才可以使用此类中的实例变量,实例变量即非静态变量。

上面例子User中的age即是实例变量。

 

二、静态方法与实例方法的区别

1、静态方法

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

  

 

通过上面的代码可以看出,在静态方法中只能访问类中的静态成员跟静态方法,不能直接访问类中的实例变量跟实例方法。

 因为静态方法和静态变量一样,在jvm中,加载顺序在对象之前,可能在调用非静态方法或非静态变量时,被调用的非景田方法或非静态变量还未被实例化,所以在静态方法中要使用非静态变量或方法,只能通过实例化对象来调用。

 

2、实例化方法

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

上面例子User中showAge就是实例化方法,实例化方法即非静态方法。

 

注:

1.线程安全:静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发的问题。非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。 

2.如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。

 

转载于:https://www.cnblogs.com/guochang/p/9555848.html

你可能感兴趣的文章
农银电商项目学习笔记(一)
查看>>
MockObject
查看>>
Chukwa
查看>>
(转)Maven仓库——私服介绍
查看>>
设计模式之工厂模式
查看>>
仿复制粘贴功能,长按弹出tips的实现
查看>>
Kubernetes-Host网络模式应用
查看>>
第三次作业
查看>>
使用HTML5构建iOS原生APP(2)
查看>>
sqlplus terminators - Semicolumn (;), slash (/) and a blank line
查看>>
省选知识清单/计划列表(咕?)
查看>>
远程桌面(3389)复制(拖动)文件
查看>>
转 lucene3搜索引擎,索引建立搜索排序分页高亮显示, IKAnalyzer分词
查看>>
bootstrap datetimepicker 位置错误
查看>>
9结构型模式之代理模式
查看>>
第二节 整型数据
查看>>
Python 序列
查看>>
Liferay的架构:缓存(第一部分)
查看>>
初识B/S结构编程技术
查看>>
方法、hadoop源码之JobQueueTaskScheduler-by小雨
查看>>