黑马程序员技术交流社区

标题: 请教一个关于静态方法的问题 [打印本页]

作者: 李永涛    时间: 2012-12-10 23:01
标题: 请教一个关于静态方法的问题
本帖最后由 李永涛 于 2012-12-13 17:00 编辑

在声明一个类或者方法时,加静态static和不加有什么区别呢?一般在什么情况下使用静态呢?
作者: 汪磊    时间: 2012-12-10 23:21
加上他就不用在调用的时候new了啊,  不加的 话每次用之前都要  类名 xx=new 类名()
作者: 黑马黄涛    时间: 2012-12-10 23:28
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,不可以修饰类...
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问...

究其根结是在内存存放的地域不同:
声明一个局部变量的时候,此变量就存放在了当中;
当new 一个对象的时候,此对象放在了heap segment当中;
而static 的变量或者字符串常量 则存在在 数据区中;
那么类中方法的话,是存在在 code segment
作者: 王彦伟    时间: 2012-12-11 09:52
使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。
静态分配的,有两种情况:
1. 用在类里的属性、方法前面,这样的静态属性与方法不需要创建实例就能访问,
  通过类名或对象名都能访问它,静态属性、方法只有“一份”:即如果一个类新建有N个
  对象,这N 个对象只有同一个静态属性与方法;
2.  方法内部的静态变量:
   方法内部的静态变量,执行完静态变量值不消失,再次执行此对象的方法时,值仍存在,
   它不是在栈中分配的,是在静态区分析的, 这是与局部变量最大的区别;
作者: 黑马丁巍    时间: 2012-12-11 16:27
1.在声明的时候,加static的为静态方法,静态方法只能访问静态字段(同理,含有static的字段),而非静态方法既可以 访问静态字段又可以访问非静态字段,并且对于静态方法,我们在调用的时候更加简洁,如果在同一个类中,我们直接写名字调用即可,一般的调用方法是类名.方法名()
2.静态方法不需要new就可以使用 实例化方法需要new了以后才可以使用
作者: 快乐之恋    时间: 2012-12-11 17:30
实例方法比静态方法多传递一个隐含的指针参数,该指针指向该方法所从属的已被实例化的对象。这一区别的外在表现为实例方法内可使用this关键字代表所从属的实例对象,而静态方法不可使用this因为静态方法不针对任何实例对象。实例对象调用静态方法会因参数中多出一个指向自己的指针(this)而发生错误。 定义静态方法只需加注static关键字即可。静态方法独立于对象实例之外,与对象是否已被实例化无关,调用静态方法要用类定义的名称而不能用实例名称如: class a { ... public static void b(){}//静态方法 public void d(){}//实例方法 } a c = new a(); a.b();//正确的调用方式,与对象实例无关。 a.d();//错误的调用方式。 c.b();//错误的调用方式。 c.d();//正确的调用方式,隐含this指针,不需要也不允许显式传入对象指针。
作者: 李永涛    时间: 2012-12-12 10:30
黑马黄涛 发表于 2012-12-10 23:28
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,不可以修饰类...
被static修饰的成员 ...

谢谢咯···受教不少
作者: rla540    时间: 2012-12-12 14:59
1 关于this :在C#中非static方法,都会有一个隐含的参数----也就是this,this存放于寄存器ecx中,所以不能对this进行取地址操作,因为他根本就不在内存当中。这个this中存放的就是在堆空间分配的对象的首字节的地址。所以对象调用一个非static方法时,这个方法很“清楚”是“谁”调用了我。
2 static方法可以直接调用static成员:当程序还没有进入到main时static成员就已经在内存中分配好了空间,所以可以被static方法直接调用也可以被其它非static方法调用。static成员是所有对象共享的。
3 static方法不能调用非static成员:因为static方法是没有this这个隐含参数的,所以static方法不能调用非static成员,也就是说他根本不知道非static成员在哪里
4 static方法不用new就可以直接被调用: static方法是在静态存储区分配的,也是在对象产生这前就已经分配好空间了。所以不用new就可以直接调用。和普通函数的唯一区别就是必须用一个类名来引用它。使得这个方法有了作用域的概念。

作者: rla540    时间: 2012-12-12 15:03
什么时候使用静态方法合适:当不需要生成一个对象而想直接使用的方法:我们从一开始学C#就一直在用静态方法
Console.WriteLine();使用这个方法在屏幕显示一句话,你想需要生成一个对象么?生成对象不是很浪费内存空间么!
还有一些常用的数学函数 如 Math.Pow(); Math.Sin(); Math.Cos(); 等
作者: 崔晓聪    时间: 2012-12-12 15:33
当你要用到jquery ajax传值的时候才更加清楚知道静态方法的神秘的地方,你用void 方法不用 static 根本传不进去后台,而你用static传的话,又有根本不适合你整体参数设置,这时候你就矛盾了...学海无涯!~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2