A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 天ya~_琼楼 中级黑马   /  2013-11-13 15:22  /  1758 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一直分不清,所要定义的变量或方法是实例的还是静态的,所以每次写代码脑子就混乱,不知该如何让开始。
请教各位大神,如何判断一个变量或方法应该是实例的还是静态的?

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
To + 1 + 2 赞一个!

查看全部评分

9 个回复

倒序浏览
首先我们要搞清楚静态的和实例的本质区别。在类中,定义一个静态的变量,意味着在内存方法区中定义了这个变量,只要是这个类的所有实例就都会来方法区来共享这个变量,如果一个实例修改了这个变量,其他所有的实例再来访问这个变量的时候,读取的值都是这个修改后的值,这是static、变量用法上和实例变量最区别的地方。至于静态的方法,本质上和静态变量也差不多,属于对象以外的东西。用法上我们用的最多的就是调用静态方法时候直接用 类名.方法名() 就可以调用这个方法,而不必要这个类的对象调用。在一些工具类里面,我们没必要把工具类都实例化,直接调用它的方法就行,这时候,可以把工具类的方法写成静态的,方便调用还省内存~~

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
To + 1 + 2 赞一个!

查看全部评分

回复 使用道具 举报
最简单的表现就是静态变量前面加了static,静态变量是属于类的,又叫类变量,类加载完成后,就可以直接用类名调用。而实例变量是需要创建了对象之后用对象调用的。
回复 使用道具 举报
FFF 金牌黑马 2013-11-13 15:57:09
板凳
  1. import java.math.BigDecimal;

  2. class Temp11_07 {
  3.         static int b = 1;// 静态变量--在全局都要用到的共享的其他也要访问的就声明为静态变量
  4.         private int a = 1; // 实例变量--只有Temp里访问的,只有这个本类里共享的。就声明为实例变量

  5.         public static void main(String[] args) {

  6.         }

  7.         void b() {
  8.                 int a = 2; // 局部变量---用完就丢掉的,只在这个方法里用的。只用一次的。就声明为局部
  9.                 System.out.println("局部变量:a=" + a);
  10.                 System.out.println("实例变量:a=" + this.a);// 局部变量的作用域内引用实例变量:this.变量名
  11.         }
  12. }
复制代码
实例变量:定义在类中但在任何方法之外。本类中有效。
静态变量:在实例变量前加上static修饰的变量。全部有效,与程序等寿命。
个人理解,不足之处,多多指教!

评分

参与人数 1黑马币 +9 收起 理由
狼王 + 9 你的技术分太多了

查看全部评分

回复 使用道具 举报
LZ的问题应该表达了这个意思:
写代码的时候,定义方法、变量,是静态的好,还是实例的好?

回答:
1:常用、反复使用、次数频繁的方法、变量,适合定义为静态;
2:常量,只能被定义为静态;
3:占用内存较大,但是不得不加载的方法变量适合用静态。

除此以外,都是实例化。

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
To + 1 + 2 很给力!

查看全部评分

回复 使用道具 举报
∏艾力克斯※ 发表于 2013-11-13 15:59
LZ的问题应该表达了这个意思:
写代码的时候,定义方法、变量,是静态的好,还是实例的好?

对,是这个意思,对于第三点我不太明白,为什么占用内存大,适合用静态呢?
回复 使用道具 举报
FFF 发表于 2013-11-13 15:57
实例变量:定义在类中但在任何方法之外。本类中有效。
静态变量:在实例变量前加上static修饰的变量。全部 ...

明白,你的意思是,可根据使用范围来确定
回复 使用道具 举报
天ya~_琼楼 发表于 2013-11-13 16:55
对,是这个意思,对于第三点我不太明白,为什么占用内存大,适合用静态呢? ...

完整的表达是:占用内存大,但是又不得不用的方法变量适合静态化。

如果不静态化,那么每次使用这个方法变量的时候,花大力气去加载,好的,我们用完了,不用了。
间隔一定时间后,java虚拟机会自动将其回收,释放内存;如果我们又要使用了呢?又要花大力气去加载。
这意味着,如果不将其静态化,那么在这个方法变量加载到内存,和内存释放的这个过程,要反复执行多次,占用虚拟机大量资源,并且虚拟机反应迟缓并可能假死

我们可以勉强容忍一个软件启动慢一点卡一点,但是我们能容忍一个软件反应速度慢、卡吗?
回复 使用道具 举报
从JDBC的优化编程中我们可以知道
  1. static{
  2. ......   
  3. Class.forName(DRIVER);
  4.    .....
  5. }
复制代码
类似的操作,为什么呢? 就是因为这个过程需要消耗大量的内存资源。将它静态化,那么它的就成了类级别的。不需要实例化,也能使用。

JVM只为静态变量分配一次内存,而实例变量每创建一个就分配一次。
所以从这个机制上看,定义静态的方法或属性应该有几点
1.不常用,但又非用不可的。
2.只想用一个个存储区域保存一个特定数据----无论是否有创建
回复 使用道具 举报
狼王 高级黑马 2013-11-14 07:43:39
10#
为了黑马,为了美好的未来,加油哈,兄弟
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马