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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王光保 黑马帝   /  2011-7-17 18:47  /  2229 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家都知道static关键字的使用,比如用static关键字声明的变量是静态变量存储在堆内存中,而被static关键字声明的方法是静态方法可以使用类名.方法来调用,为什么把方法定义成static类型的就可以想常量一样直接就可以这样调用?原理是什么?

6 个回复

倒序浏览
黑马网友  发表于 2011-7-17 18:53:43
沙发
这个问题,我以前也问过我的同学:
他给我的解释是: 用static 创建的变量放在 一个堆里面!  在程序运行的过程之中,不会受干扰,不会轻易改变!  

我想呀,这个静态方法也差不多如此,  只不过在你调用方法的时候,你取到的数据直接取的是一个引用, 也就是一个地址! 所以这个方法也可以向常量一样调用,都是使用的一个引用,在运行到方法的时候, 处理器就直接运行静态方法中的代码,运行完后,回到以前的地方,继续其他代码!
回复 使用道具 举报
黑马网友  发表于 2011-7-17 23:33:35
藤椅
楼上两位理解有误阿。
静态修饰的数据是对象共享的数据,存放在方法区的静态区中。
非静态的数据,是每一个对象特有数据。存放在对象的所属的堆内存中。
为什么可以用类名.方法来调用?因为他们根本不需要使用对象来调用,静态成员都是随着类的加载而加载的,他们先于对象存在。

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 楼上两位应该谢谢你

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-17 23:53:26
板凳
楼上正解,与我理解的相同。用关键字static修饰一个方法,那么这个方法随着类的加载它也会被加载了。还没等这个类创建对象,他就老早存在了,是存在于方法区中,与堆栈无关,随时可以被调用,他会随着类的消失而消失。
回复 使用道具 举报
黑马网友  发表于 2011-7-18 07:54:58
报纸
[code]public class StaticTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
                Person1.t = 100;
               
               
                System.out.println("Person1.t="+Person1.t);
                System.out.println("Person1.getTotalPerson()="+Person1.getTotalPerson());
                Person1 c1 = new Person1();
                Person1 c2 = new Person1();
                System.out.println("c1.t="+c1.t);
                System.out.println("c2.getTotalPerson()="+c2.getTotalPerson());
               

        }

}

class Person1
{
       
        public static int t=0;//设置了一个static静态成员t,初始化为0
        public Person1()
        {
                t++;
               
        }
        public static int getTotalPerson()//定义了一个Static方法.
        {
                return t;
        }

}[/code]关键字static作为修饰符标记变量或方法由整个类共享,若访问控制权限允许,可以不必创建类对象,直接用类名加“.”调用。

一旦类被使用到,首先加载的是它的静态变量,然后是静态初始化块,静态方法。
当此类要被构造一个对象的时候,或者用反射生成其对象的时候,加载其成员部分。依次为成员变量、非静态初始化块、非静态方法、最后才是构造器。
静态部分一旦被加载,就不会被销毁,直到程序结束,关闭虚拟机。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 提到了静态代码块,不错

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-18 09:11:55
地板
就像图纸(类)和汽车(实例对象)一样,图纸封装了汽车的发动的方法,但是图纸却无法调用这个发动方法(除非用了static修饰)。原因很简单,就是在汽车(实例对象)没有NEW出来之前,这些方法根本不存在(实质是在内存没有加载这些方法)。但是用了static修饰后,这些方法就会随着类的加载而被加载,这样的方法和成员变量不属于具体的实例对象而是属于这个类所用(当然实例对象肯定可以调用这些方法或成员变量),既然类拥有方法所有权,那么就可以用这个类直接调用方法。
回复 使用道具 举报
黑马网友  发表于 2011-7-18 10:40:36
7#
static 定义的一些数据放在了栈里,一般放的是一些常量或者对象的引用。我认为类名.方法只是像指针一样的东西,表明这个方法的位置。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马