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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 果粒橙Cc 中级黑马   /  2014-4-11 00:30  /  1327 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

static
什么时候用?

9 个回复

倒序浏览
static修饰的成员变量和成员方法习惯上称为静态变量静态方法,可以直接通过类名来访问.
静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问.静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
好处:
          定义static方法,可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。例如:毕老师视频中的说国籍。

弊端:
           static方法修饰会随着类文件的加载而加载进来,如果每个方法都这样用的话会加重内存的负载。

                                                              //2楼你知道的太多了。
回复 使用道具 举报
我只记得毕老师说过要共享的资源一般都用static来修饰。因为在初始化过程中静态是最先初始化的,这样可以方便其他成员的调用。
回复 使用道具 举报
简单的说就是:
定义静态变量:当对象中出现共享数据时,可以节省内存空间。
定义静态函数:当功能内部没有访问到非静态数据(对象的特有数据)时。
回复 使用道具 举报
首先弄清楚静态在内存中的加载情况;它是先于类的加载而加载的,在内存中的方法区。字节类名调用。
回复 使用道具 举报
本帖最后由 491138002 于 2014-4-11 11:10 编辑

static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢?
在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制),例如:
未声明为static
class ClassA{
int b;
public void ex1(){

}
}
class ClassB{
void ex2{
int i;
ClassA a = new ClassA();
i = a.b; //这里通过对象引用访问成员变量b
a.ex1; //这里通过对象引用访问成员函数ex1
}
}

声明为static
class ClassA{
static int b;
static void ex1(){

}
}
class ClassB{
void ex2{
int i;
i = ClassA.b; //这里通过类名访问成员变量b
ClassA.ex1; //这里通过类名访问成员函数ex1
}
}
通过以上两种比较,就可以知道static用来修饰类成员的主要作用了,在java类库当中有很多类成员都声明为static,可以让用户不需要实例化对象就可以引用成员,最基本的有Integer.parseInt(),Float.parseFloat()等等用来把对象转换为所需要的基本数据类型。这样的变量和方法我们又叫做类变量和类方法。


建议多看代码例子自然就能明白了
回复 使用道具 举报
本帖最后由 zhangbingyuan 于 2014-4-11 11:28 编辑

静态成员变量          在类内成员变量的声明前加上关键字static,该数据成员就是类内的静态成员变量。静态数据成员有以下特点:
对于非静态成员变量,每个类对象都有自己的拷贝。而静态成员变量被当作是类的成员。无论这个类的对象被定义了多少个,静态成员变量在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态成员变量是该类的所有对象所共有的。对该类的多个对象来说,静态成员变量只分配一次内存,供所有对象共用。所以,静态成员变量的值对每个对象都是一样的,它的值可以更新;  
 静态成员变量存储在全局数据区。静态成员变量定义时要分配空间,所以不能在类声明中定义。在上面的代码中,语句int Myclass::Sum=0;是定义静态成员变量;   静态成员变量和普通成员变量一样遵从public,protected,private访问规则;  
 因为静态成员变量在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;   
静态成员变量初始化与一般成员变量初始化不同。静态成员变量初始化的格式为:   
<数据类型><类名>::<静态成员变量名>=<值>  
 类的静态成员变量有两种访问形式:   <类对象名>.<静态成员变量名> 或<类对象指针>-><静态成员变量名> 或 <类类型名>::<静态成员变量名>   如果静态成员变量的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态成员变量;   
静态成员变量主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态成员变量。这 有两个好处,第一,不管定义多少个存款类对象,利息成员变量都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次, 则所有存款类对象的利息全改变过来了;   
同全局变量相比,使用静态成员变量有两个优势:  
 静态成员变量没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;  
 可以实现信息隐藏。静态成员变量可以是private成员,而全局变量不能



回复 使用道具 举报
我用最简单的方式给你解释一下,
说说什么时候使用static关键字?

张三有名字,有年龄,27,李四有名字,有年龄22,说他们都有年龄和名字,那age、name能用static来修饰吗?不能。因为说有共享数据才能用,也就是说值都是一样的,那大家所有人的名字都是“张三”这叫数据都一样,这叫共享数据。所以说都有名字、年龄,这就有共享属性,每个人的名字不同,年龄也不同,这叫没有共享数据,所以这种情况不能用static。

要从两方面下手:
因为静态修饰的内容有成员变量和函数

什么时候定义静态变量(也叫类变量)呢?
当对象中出现共享数据时,改数据被静态所修饰对象中的特有数据要定义成非静态存在于对内存中

什么时候敬意静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的



类中的方法和共享数据都在方法区里面

成员变量也叫实例变量
静态的成员变量也叫类变量


静态使用注意事项:

1,静态方法只能访问静态成员。(成员包括成员变量、成员函数)
        非静态方法既可以访问静态也可以访问非静态。
2,静态方法中不可以定义this,super关键字。
        因为静态优先于对象先存在于内存中,所以静态方法中不可以出现this


静态有利有弊
利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一        份。可以直接被类名调用
弊端:生命周期过长
        访问出现局限性(静态虽好,只能访问静态)。
回复 使用道具 举报
当对象出现共享数据时,该数据被静态所修饰。         对象中的特有数据要定义成非静态存在于堆内存中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马