静态和非静态方法

   

                       静态和非静态方法

   静态方法和非静态方法设计之初的目的就是前者是针对类,也就是某一种对象集体所拥有的,而非静态方法是针对某一个对象的。

 

       静态方法和非静态方法的比较如下

静态和非静态方法_第1张图片

 

  

下边一C#为例来具体的比较一下

C#静态成员:

①静态成员属于类所有,非静态成员属于类的实例所有。

②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;

静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。

 

C#静态方法

1C#静态方法属于类所有,类实例化前即可使用。

2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。 因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存, 这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。

 

C#静态方法与非静态方法比较

C#静态方法是一种特殊的成员方法 它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式

1.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!

static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!

2.静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

3.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.

4.C#中的方法有两种:实例方法,静态方法.

      

     以下注意的几点说明,人们总是以为“ 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。”事实上,他们都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度 基本上没有差别

      其次就是方法占不占用更多内存,和它是不是static没什么关系。   因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所 字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是否是static修饰的方法,都 只存在一份代码,也就是只占用一份内存空间。那既然如此同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class 成员变量的值。这就导致了运行的表现不太一样了。

      大家都以为“实例方法需要先创建实例 才可以调用,比较麻烦,静态方法不用,比较简单”事实上如果一个方法与 他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步 骤,没有麻烦简单一说。

        当然你完全可以把所有的实例方法都写成静态的,将实例作为 参数传入即可,一般情况下可能不会出什么问题。我们为什么要把方法区分为:静态方法和实 例化方法 其实早期的 结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创 c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的 话,静态方法和实例化方式的区分是为了解决模式的问题。

       从面向对象的角度上来说,在抉择使用实 例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象  反之使用静态方法。这只是从面向对象角度上来说的。

   希望对大家理解静态和非静态的方法有帮助

你可能感兴趣的:(软考)