黑马程序员技术交流社区
标题: 关于static关键字 [打印本页]
作者: 黄捷 时间: 2012-5-31 13:26
标题: 关于static关键字
今天看了老毕的视频,但是还是有点没搞明白?请大家不吝赐教啊。什么时候适合用静态方法呢?静态方法和其他普通函数有什么却别?对于不需要共享的成员变量,对于成员函数和成员变量设置为static有什么影响么?好在哪不好在哪啊?
作者: 古银平 时间: 2012-5-31 13:30
静态:static 静态的成员变量,类变量。
用法:是一个修饰符,用于绣时成员(成员变量,成员方法)。静态修饰内容被对象所共享。当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用,格式:类名.静态成员。特有内容随对象存储。static在方法区(共享区,数据区)存储。
static的特点:1.随着类的加载而加载(随着类的消失而消失)说明他的生命周期最长;2.优先于对象存在;3.被所有对象所共享;4.可以直接被类名所调用。
每个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用。经方法都静态后,可以方便使用,但是该类还是可以被其他程序建立对象的,为了更为严谨,强制让该类不能建立对象。可以通过将构造函数私有化完成.
作者: 龚正军 时间: 2012-5-31 13:43
Static静态化!
最大好处在于:可以用类名直接调用(应为他所有信息是在方法区跟随类加载而加载)-----------别小看这好处,你要明白这好处带来了什么!---------他带来的是无需构造对象,而共有化所有这类型对象的共有方法!
最大坏处在于:因为他是跟随类加载的,所以他不能直接访问对象建立后才有的所有信息,也就是毕老师说的静态函数只能静态函数而不能访问非静态函数(非静态函数意思就是只有在对象建立才存在的函数)!
---------------------------------你先能体会和深刻理解以上2点最为重要的才能为扩展STATIC用法打好基础,别去看长篇大论!
作者: 王章亚 时间: 2012-5-31 14:07
static (静态方法块)
首先你要明白静态和非静态的区别根本在哪里,脑海中要有老师画的图。
1.static可以修饰成员变量和成员函数,当成员被静态修饰以后,就多了一个调用方式就是类名调用。
2.static随着类的加载而加载,所以它修饰的成员的生命周期会很长,直到类销毁才会被回收。
static使用注意事项
静态方法只能访问静态成员。非静态方法可以访问静态方法,和非静态方法。
什么时候定义静态变量?
从两方面考虑
1.当对象中出现共享数据时候,该数据被静态所修饰。
2.对象中的特有数据不能定义成静态,因为静态时存储在方法区(共享区)而不是存储在堆内存里的。
什么时候定义静态函数?
当功能内部没有访问到非静态数据时候就可以定义成静态函数。
视屏再多看两遍,就好了!加油
作者: 田建 时间: 2012-5-31 15:52
首先static用于修饰成员(成员变量和成员函数)
被修饰的成员:随着类的加载而加载,优先于对象存在,被所有对象所共享,可以直接被类名调用。调用方式:类名.静态成员
存放于【方法区】----存放类中的方法和共享数据。
什么时候定义静态函数:当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的,用类名直接调用。
给你举个例子吧Eg:获取数组的最大值
class ArrayTool
{
public static void main(String[] args)
{
int[] arr={5,8,4,1,3,5,8,77,55,99};
int max=GetMax.getMax(arr);
System.out.println("max="+max);
}
}
class GetMax
{
public static int getMax(int[] arr)
{
int max=0;
for(int x=0;x<arr.length;x++)
{
if(arr[x]>arr[max])
max=x;
}
return arr[max];
}
}
这个程序里把getMax()方法定义成静态的,在调用的时候就不需要new对象,用类名GetMax.直接调用即可!
作者: 郑文博 时间: 2012-5-31 16:11
哈哈 我昨天也刚刚学到这。
我个人理解用static情况:
1.需要一个数据对象为整个类而不是某个对象服务。
2.力求不破坏类的封装性。
3.要求此成员隐藏在类的内部,对外不可见。
静态封装就是为了提高它的复用性,有的时候必须要不吝惜静态所占用的那些内存。因为它给你提供了常用工具,为你以后编程省去了许多许多时间精力的。我正我学到这是有种如获至宝的感觉,之前还发愁那些工具方法函数类每次都要重写一次是很浩大的无用功,对于静态方法我以后肯定会能用则用的。
作者: 凡延海 时间: 2012-5-31 16:32
你这个问题还真有些多,static修饰的变量、方法与非静态变量、方法其区别可以根据类在内存中空间的分配来知道。通过静态变量与方法是在类没有被实例化时候就已经在内存中分配空间了,而非静态变量与方法呢则只有实例化类以后才会给其分配空间,这就有了认识:
第一:静态变量方法是不受实例干扰独立存在的,就是多个实例共享静态方法与变量。
第二:调用静态方法和变量可以通过类名.方法名/变量名 来调用,而非静态方法变量则必须实例化以后通过引用对象调用才行。
下面通过一个简单的例子来说明两者的区别:- class TestStatic
- { public static String data="我是静态变量";
- public String str="我是普通变量";
- public static void main(String args[])
- {
- System.out.println(TestStatic.data);
- System.out.println(new TestStatic().str);
-
- }
- }
复制代码 通过对静态变量data和非静态变量str的调用充分说明了二者的不同,再则这里用到了main方法,main方法也是由static来修饰的我们对main的使用也没有创建实例而是直接就用,更能体现二者的区别来。
根据静态方法内存中分配空间的特点不难知道什么时候用静态的变量方法:就是当需要与多个实例共享变量方法的时候,或者是需要在实例化之前处理变量的情况。
作者: 张亮 时间: 2012-5-31 20:56
什么时候使用?
1.为了共享数据,节约空间。2.为了方便访问。
静态方法和一般的成员方法相比,不同的地方有两个:
一是调用起来比较方便,二是静态方法内部只能使用静态的成员变量。
作者: whocases 时间: 2012-5-31 21:11
Java类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量
作者: 王月 时间: 2012-5-31 22:01
1,在感官方面,可以提高代码的阅读性和复用。因为static修饰的成员变量或者方法,是被所有的对象共享的,所以你不必为每个对象定义这些属性或行为的方法。
所以当你要创建的对象很多而且有共性的属性或行为,用静态会更好一点。
2,最大的好处在于可以直接被类名调用。
不好的地方:它是随着类的加载而加载的,所以不能直接调用非静态方法(因为这些方法是在对象创建后才出现的)。还有一点就是静态修饰的成员在内存中存在时间最长,不过这一点可以忽略不计。
作者: 朝哥 时间: 2012-5-31 23:56
(1)static修饰成员方法最大的好处在于可以用该成员方法的类名直接调用而不需要创建对象。而普通方法的调用需要创建对象,一般都是多余的。
(2)当然使用的时候注意:成员方法没有访问外面的非静态成员变量,当然可以返回静态的成员变量。
(3)我举个例子吧,你可以测试一下,把country=“中国”设置静态的,然后再主函数中创建一个对象并改变country=“美国”,你会发现,改变后的country不能再共享了,因为如果我在创建一个对象,直接通过类名调用country时,我的country是“美国”,而不是中国。一句话,静态变量有一个对象改变的话,下面的对象会用到改变后的值,除非此静态变量再次被改变。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |