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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© oracleserver 初级黑马   /  2012-6-25 14:43  /  2328 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我想问下,声明为static的方法除了不需要实例化就可以被调用外,这种方法是不是一直常驻内存呢?如果声明为实例方法(即去掉static),那么当这个实例消毁后,这个方法是不是也不会占用内存资源呢?
在什么情况下声明为static好些?

8 个回复

倒序浏览

static 使用非常的简单,如果要修饰一个静态块只需:staic {……..}即可(常用静态块来初始化一些变量); 静态方法就参照main()的形式:访问标 识 static returnType method(…) {};静态变量就是:static type fields;
     在使用静态的方法时,可以直接用类名来引用,不需要创建实例(当然创建实例也是可以的)
你实例或者跟不实例 都没关系吧
static 还是在那
实例消失了也一样
static 一样在那  
回复 使用道具 举报
我来回答下吧 ,首先static方法是常驻内存的,应为一旦有变量或方法有static词关键字后变量和方法将会跟实例无关,一旦载入该类就会永远在内存中,直到程序结束,使用方法是直接用类命+点+相应的方法或变量。
你的第二个问题 类的实例方法在内存中是只有一份,所以当你的实例方法销毁以后这个方法是不会在占用资源的
你的第三个问题 static在什么情况下声明好,比方说我现在有个DateDemo类里边有个getDate()方法是获取系统当前时间的,那么这个方法我要经常性的使用它,如果不加staic的话我每次使用都需要创建对象。这样严重的浪费内存资源,所以像这样一些经常使用的方法应该声明为static

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报

static方法是常驻内存,一旦有变量或方法有static词关键字后,变量和方法将会跟实例无关,一旦载入该类就会永远在内存中,直到程序结束。
你的第二个问题 类的实例方法在内存中是只有一份,所以当你的实例方法销毁以后这个方法是不会在占用资源的
你的第三个问题 static在什么情况下声明好,比方说我现在有个DateDemo类里边有个getDate()方法是获取系统当前时间的,那么这个方法我要经常性的使用它,如果不加staic的话我每次使用都需要创建对象。这样严重的浪费内存资源,所以像这样一些经常使用的方法应该声明为static

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
     有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。
     
     声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共同拥有一个static变量。声明为static的方法有以下几条限制:
  它们仅能调用其他的static 方法。
  它们只能访问static数据。
  它们不能以任何方式引用this 或super。

回复 使用道具 举报
static成员的生命周期是随着类的加载而加载,随着类的消失而消失,生命周期是最长的,非静态成员的生命周期是随着对象的建立而加载,随着对象的消失而消失。什么时候使用静态:当方法内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
回复 使用道具 举报
本帖最后由 余清兰 于 2012-6-25 17:03 编辑

static可以修饰成员变量和成员函数、当有共享数据时就用static修饰,每个对象都能直接用,因为static随着类加载后直接存在了方法区,而实例类要在每个对象中存一份,这样比较占资源,用了static修饰后,就可以节约内存资源。
被static修饰的成员特点:被修饰的成员是随着类的加载而加载,反之随着类的消失而消失,说明它的生命周期最长
优先于对象存在。被所有对象所共享,特有内容被对象存储,共性内容用static修饰,这样节约内存资源。放在了方法区或共享区或叫数据区(类中的方法和共享数据都在此区)
class Person
{
        private String name;//成员变量(实例变量)
        static private String country="cn";//静态的成员变量(类变量)
        Person(String name)
        {
               
                this.name=name;
                System.out.println(name+":"+country);        
        }
}
class PersonDemo
{
        public static void main(String[] args)
        {
        Person p = new Person("lisi");
        Person p1 = new Person("zhangsan");
        }
        
}
分析:程序运行时,加载类,类在内存中存储,同时static修饰的country已经在内存的方法区,而没有被static修饰的成员变量name此时还不在内存中,只有被对象调用后,才会存在内存中。所以静态的成员变量生命周期最长。

实例类被对象调用后,对象运行完后,随着对象的消失而消失

还有一种特殊的是静态代码块
格式:
Static
{
    静态代码块中的执行语句
}
特点:随着类的加载而执行,且只执行一次。
用于给类进行初始化的。并优先于主函数,只有用到类中的内容时,类才会被加载。

回复 使用道具 举报
孙飞 中级黑马 2012-6-25 19:56:10
8#
当成员被静态修饰后就多了一个调用方式,除了可以被对象调用外还可以直接被类名调用,它是随着类的加载而加载,自然也随类的消失而消失,所以只要类存在 就会一直存在于内存中。如果 是非静态的,当实例销毁后是不会占用内存的。当对象中出现共享数据时,该数据被静态所修饰。还有一种静态代码块,格式:
static
{
静态代码块中的执行语句;
}

静态代码块是随类的加载而执行,且只执行一次,优先于主函数
回复 使用道具 举报
静态方法是直接用类名调用方法区的方法,而一般方法其实存在于方法区的非静态区,当我们建立对象时会在栈内存开辟空间调用该方法,然后引用型变量指向该内存,等对象结束调用,栈内存里的方法会释放内存并消失。但方法区的方法是属于类的,不会消失
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马