黑马程序员技术交流社区
标题: 面向对象中,静态方法和非静态方法 [打印本页]
作者: xt654005440 时间: 2013-7-28 08:40
标题: 面向对象中,静态方法和非静态方法
本帖最后由 xt654005440 于 2013-8-1 23:30 编辑
RT:面向对象中,静态方法和非静态方法声明有什么不同,为什么要分静态方法和非静态方法,他们在使用上有什么局限或者不同的地方?请教教我。
作者: 马晓凤 时间: 2013-7-28 09:06
定义的时候的区别
1静态方法定义时需要加关键static,不加就是实例方法
用的时候的区别
1.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!也就是 类名.静态方法名 就可以直接用
2实例方法,必须 new出类的实例,通过 实例名.方法名 才能使用
至于为什么要有静态成员??个人理解就是节约内存,可以重用了
解释:
静态方法在内存中有一块单独的存储区,等整个应用程序结束时才被释放
C#静态成员:
①静态成员属于类所有,非静态成员属于类的实例所有。
②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
作者: sxdxgzr@126.com 时间: 2013-7-28 09:50
1静态方法与非静态方法异同点:
a静态方法和实例方法都在JIT加载类时分配内存,所有对象共享实例方法。
b静态方法只能由类访问,执行非虚调度;实例方法只能由对象访问,虚方法执行虚调度。未实例化对象便可使用
c静态方法 不能标记为virtual,abstract,override,静态方法可以被派生类访问,但是不能被派生类覆写。
d静态方法中不能访问非静态的内容(逻辑上类型对象所有,实例不存在时就可以使用,自然不能访问非静态内容),如静态方法中不能使用this关键字。实例方法却可以访问静态成员(原因静态成员全局共享 先于实例存在,实例自然可以访问)
2为什么要分静态方法和非静态方法?
从面向角度而言,静态方法适合实现系统总边缘性的非业务需求,如通用工具类实现,仅仅是提供功能,不需要改变实例的状态,当然静态方法若会改变静态字段 那执行静态方法还需考虑线程安全问题。个人理解为 为类型提供通用的功能,这种
功能并不需要通过对象来完成,减少new对象造成的开销,从这个角度而言 性能应该更高些。(其实不管静态方法或非静态方法
内存上只存在一份,方法执行角度而言性能差别不大),至于区分, 应该从OO角度而言来说吧,比如说为什么要有静态类。
作者: 聂广强 时间: 2013-7-28 10:36
C#中的方法有两种:实例方法(通过实例化关键字new才是调用),静态方法(可以直接在程序中.出来).
1静态成员属于类所有,非静态成员属于类的实例所有。
2每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。
3、C#静态方法属于类所有,类实例化前即可使用。
4、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。
5、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,
这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。
C#静态方法是一种特殊的成员方法 它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。
6.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!
static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!
7.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
8.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.
作者: 高文咪 时间: 2013-7-28 12:00
简单的说,静态方法在程序中你可以直接去调用,不需要new个实例;
作者: brucel50 时间: 2013-7-28 15:24
静态方法和非静态方法
静态方法不用实例化即可通过类名.方法名()来调用
非静态方法要通过实例化一个该类的对象,通过对象.方法名()来调用
比如下面两个类
class C1
{
public static void M1(){}
}
class C2
{
public void M1(){}
}
class Program
{
static void Main(string[] agrs)
{
//当想调用C1中的M1时
C1.M1();
//当想调用C2中的M1时
C2 c = new C2();
c.M1();
}
}
作者: lvjayj 时间: 2013-8-1 22:24
非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。
作者: 彭家贰小姐 时间: 2013-8-1 22:44
- 静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问;
- 不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问;
- 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值;
- 静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等.
示例:- private class Person
- {
- /// <summary>
- /// 静态方法
- /// </summary>
- public const String Name = "小李";
- /// <summary>
- /// 非静态方法
- /// </summary>
- public String Gender = "男";
- }
- private static void Main(string[] args)
- {
- //静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值
- Console.WriteLine("Person的静态变量: {0}", Person.Name);
- var tmpObj1 = new Person { Gender = "女" };
- var tmpObj2 = new Person { Gender = "其他" };
- //非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值
- Console.WriteLine("Person实体1的非静态变量: {0}", tmpObj1.Gender);
- Console.WriteLine("Person实体2的非静态变量: {0}", tmpObj2.Gender);
- Console.ReadLine();
- }
复制代码 结果:
Person的静态变量: 小李
Person实体1的非静态变量: 女
Person实体2的非静态变量: 其他
作者: 独世 时间: 2013-8-1 22:47
静态方法与非静态方法的区别:
静态方法可以调用静态方法和非静态方法。
非静态方法只能调用非静态方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |