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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 dongyangzhang 于 2013-4-16 23:02 编辑

静态和非静态方法的区别是什么呢?静态方法和非静态方法在内存的堆栈中是怎么存储的呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 U芽Lady 于 2013-4-16 21:08 编辑

静态方法可以直接用类名点出来方法,而普通方法需要创建类的对象后才能调用!
静态的方法和变量会调用时在内存生成一个唯一的标示,你可以理解成在物理内存中给静态一个位子,这样的话在调用的时候可以直接找到,而且会节省内存,但是如果你声明的静态过多的话那么每一个都会在内存有一个位子,那么你就没有资源运行别的,会报内存溢出!
普通方法是由java的gc机制(垃圾回收机制)来控制,可能同一个对象或变量在使用的过程中,这个时间的在内存占了一个位子,而上个时间的还没有从内存中删除,这样的话就可能有2个一样的在内存中,这个2个一样东西只是内容值一样,但是内存值不一样,你可以用"=="和"equals"来查看(这个只适用对象和String类型).java的gc机制会根据运行时的内存状态来自动清除一些用不到变量或对象,就算你手动调用gc也是一样的!
静态方法是在没有涉及类的特有属性的时候就可以定义为静态
静态方法在运行的时候存在方法区,静态的存在于静态方法区,调用的时候会进栈,运行完了弹栈

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼主一问我也感到模糊了,平时用静态方法主要是自己懒得创建对象,直接用类名方便一点。反正自己的程序小,也不考虑安全性,类加载就可以用。关注此贴,瞧瞧他人是怎么回答的。
回复 使用道具 举报
使用静态变量又有什么好处呢?
比如说一段程序Person类,有共同的属性 country = “中国”,在main函数里new了两次Person,如图:

我们可以想一想,假设程序产生了50个对象,如果想修改所有人的country属性,是不是就要调用50遍country属性重新修改,这样太麻烦了。所以Java就提供了static这样的关键字,用它来修饰类的属性后,次属性就是公共属性了
  1. class Person{
  2. String name;
  3. static String country = "中国";//此处用static修饰成静态属性,共有的

  4. public Person(String name){
  5. this.name = name;
  6. }

  7. public String talk(){
  8. return "我是: " + name + ", 来自: " + country;
  9. }
  10. }

  11. public class TestPerson{
  12. public static void main(String[] args){
  13. Person p = new Person("张三");
  14. Person p1 = new Person("李四");
  15. System.out.println(p.talk());
  16. System.out.println(p1.talk());
  17. p.country = "美国";
  18. System.out.println(p.talk());
  19. System.out.println(p1.talk());
  20. }
  21. }
  22. 运行结果:我是: 张三, 来自: 中国
  23. 我是: 李四, 来自: 中国
  24. 我是: 张三, 来自: 美国
  25. 我是: 李四, 来自: 美国
复制代码
从程序可以看到,修改了country属性后,而且只修改了p对象的country属性,但再次输出时,可以看到p1对象的country随之改变,这说明用static声明的属性是所有对象共享的。如图:

从图中可以看到,所有的对象都指向同一个country属性,只要当中有一个对象修改了country属性的内容,那么其他所有对象也回同时被修改。
静态使用注意事项:
1.       静态方法只能访问静态成员。非静态方法既可以访问静态也可以访问非静态。
2.       静态方法中不可以定义this,super关键字。因为静态优先于对象存在,所以静态方法中不可以出现this
3.       主函数是静态的。
静态有利有弊:
利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象都存一份。可以直接被类名调用。
弊端:声明周期过长。访问出现局限性。(静态虽好,只能访问静态)



评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

回复 使用道具 举报
都是大神啊。。  回复都几个页面了。。 路过````
回复 使用道具 举报
本帖最后由 偏執旳、靑春 于 2013-4-16 21:32 编辑

1.
静态的方法就是不需要将类实例化就可以直接使用类名调用到方法或者属性。
而非静态的就需要将此类实例化之后才能够调用到方法或者属性。
举个例子 人有手有脚 静态方法 与生俱来
但是不同的人有不同的名字,这个就要用非静态方法定义了


2.

内存里面有个方法区 知道不?
静态和非静态的方法都放在里面
静态方法和非静态方法在内存的堆栈,静态的一直都在,
非静态的需要的时候就调用进来,用完就释放,
都存储在方法区里面

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
二楼有文字,四楼有例子。沾楼主的光,我也受教了。
回复 使用道具 举报
楼主应该是初学者,其实静态方法按照我的理解就是为了专门处理或者执行某一项功能的方法,比如说Math类中的求最大值绝对值的方法就是静态的,这样你就直接可以通过类名来调用它们,而不用生成类的实例,你也不用改变它们,只要往里面添加变量。
另外注意静态方法里不能有this关键字哦。
希望对你有帮助,

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马