回 帖 发 新 帖 刷新版面

主题:[讨论]关于(静态/实例)成员和方法的问题[求助]

(静态/实例)成员的区别,(静态/实例)方法的区别,书上说的一大堆,但我感觉都是格式上的区别,并没有从运用的理论上去阐述之间的区别。

我所想知道的是:
什么样的成员要被定义成静态成员,什么样的成员要被定义成实例成员,
什么样的方法要被定义成静态方法,什么样的方法要被定义成实例方法。

代码:

using System;
using System.Collections.Generic;
using System.Text;

/*该示例读取新雇员的姓名和id,逐个增加雇员,计数器计数并显示新雇员的
 * 有关信息以及新的雇员数。(该程序从键盘读取当前雇员数)*/
namespace guyong
{
   public class Employee
    {
       public string id;
       public string name;/*为什么id和name就定义成实例成员*/
       public Employee()
       { }
       public Employee(string name, string id)
       {
           this.name = name;/*右边的name代表什么?它赋值给左边的this.name又代表什么?*/
           this.id = id;
       }
       public static int employeeCounter;/*employeeCounter变量存储雇员数,为什么就把它定义成静态成员?*/
       public static int AddEmployee() /*该方法为什么就被定义成静态方法?*/
       {
           return ++employeeCounter;
       }

}
    class MainClass:Employee
{
       public static void Main(string[] args)/*这里 Main()方法的修饰符public用与不用有区别吗?*/
        {
            Console.Write("输入雇员姓名:");
            string name = Console.ReadLine();
            Console.Write("输入雇员姓名id:");
            string id = Console.ReadLine();
            Employee e = new Employee(name, id);
            Console.Write("输入雇员数:");
            string n = Console.ReadLine();
            Employee.employeeCounter = Int32.Parse(n);
            Employee.AddEmployee();
            Console.WriteLine("Name:{0}",e.name);
            Console.WriteLine("ID:{0}",e.id);
            Console.WriteLine("新的雇员数为:{0}",Employee.employeeCounter);
        }
    }
}

-------------------------------
希望大大们能指点我代码中的困惑,我想从根本上去理解静态与实例的区别,而不是书上那种:有static的就是静态的。(妈妈的,我都想骂,我定义的时候怎么知道要不要加static啊。)

希望大大们能给我讲讲,再帮我看看代码中的疑问...

谢谢了....

回复列表 (共4个回复)

沙发

和实例具体相关的用实例成员
和整体相关的用静态

当然,某些情况下可以考虑静态方法等提高效率(不违背前两个原则)

这些可以作为参考

板凳

那么也就是说:定义时相对于个体对象的成员用实例,相对于整体对象的成员用静态,方法则与成员类似....(恩,要是这样的话确实很好理解。)

大大:那么那个关于this的问题呢?

this的用途:限定被相似的名称隐含的成员。  
例如: 
public employee(string name,string alias)
{
    this.name=name;
    this.alias=alias;
}

限定被相似的名称隐含的成员。 这句话怎么理解啊?

我的感觉就是:建立一个对象时,把构造函数里的实参值传递到上面的形参中,并赋值给左边。

但这种赋值又有什么意义呢?左边的this代表着当前对象,this.成员=某个值 ,这是为别的方法在做准备吗?

3 楼

class employee{
    private string name, alias;    // [0]
    public employee(string name,string alias)    // [1]
    {
        this.name=name;
        this.alias=alias;
    }
}

this.name/this.alias代表当前实例的字段name/alias也就是[0]处的字段
如果不用“this.”就代表employee构造函数中的参数name, alias([1]处)

这在由于方法内部局部变量重名而覆盖外部变量时可以使用

4 楼

恩....明白了....

也就是说如果这样改下:

class employee{
    private string name1, alias1;    
    public employee(string name,string alias)    
    {
        name1=name;                //就不用this.了。
        alias1=alias;
    }
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册