刚入行吧。多花点时间考虑这些问题应该会有提升。
上面有一楼已经回答得不错了。
计算机牛逼的地方就是 存储代码,执行代码。方法就是代码。开多个线程调一个类里的方法,这里方法代码就一份,所以才会出现后面的临界资原问题。方法就一串静态的代码放那里,只有一份。第二个问题,如果你是计算机专业的不应该这样问,书上明确说明静态属性,字段属于类的,所以也不是第一次实例化时创建,而且是属于类的,也就是类创建的时候就创建了,什么时候?加载dll到内存,用类的Type创建类的结构时就有了。而你再用这个类的结构去创建instance,这个时候就是对象的数据了。第三个问题,不急,时间长点,你想的问题多了就会慢慢积累就多了。自学还是有些局限性,当然知识你都可以拿得到的,只要你原意。
这些基础知识都是在哪些书上看到的,能推荐基本讲解基础的书么
@百鸟朝凤: 计算机基础课程,组成原理,程序计设,比如静态字段那个,一般的程序设计书都会讲到。第一个问题理解就要多个地方综合起来了看了。比如学习组成原理说到内存有几个区,有代码区,有数据区等等,那么我们类的方法,那就是在代码区里面,平时数据,参数应该是在数据区,而且函数调用里面堆栈的结构,这个栈结构那数据结构里面又讲到了,后进先出,结合函数调用你就清楚整个运行,再深入还会想到cpu里面寄存器,运算器,代码执行是在运算器里面,cpu运算,寄存器放指令,一条一条执行等等,相关的知识很多,不一定要全部清楚,但是同我们使用到相关的,可以尽量弄清楚。不同职业可能清楚的地方不一样,比哪网络,硬件,软件可能不同职了解不同,不要求样样精通,你写代码,那么相关的你这几个问题应该要了解清楚。
@gw2010: thank you
你看看《CLR var C#》这本书就明白了。我虽然也看过此书,但是我已经忘了。
我的理解是:
1)静态方法只有一份,但静态方法内声明的变量,在每个线程调用时,都会新创建一份。
2)静态成员也只有一份,只在第一次访问静态成员时创建,或第一次类实例化的时候创建。
1.方法没有副本的说法.所有的方法都是静态.
2.不是在第一次实例化时被创建.是在这个类的静态成员第一次被调用时触发静态构造函数.初始化静态字段.
3.找个重点大学的软件专业.看看他们专业有哪几门课.把教科书都买.跟着他们的教学计划慢慢学.
那多线程同时调用同一个方法,方法里面的变量,是存储到每个线程自己单独的内存区域中,只不过是大家都按照方法这个逻辑顺序执行对吧?
你的第一个问题,感觉是把类和对象搞混了
额。。。可能是我描述不太清楚。 我的意思是 多线程调用同一个方法的时候,多个线程同时调用,方法内部的变量不会造成混乱么。例如,第一个线程刚把一个变量赋值为5,第二个线程又进这个方法,把变量赋值成了3
@百鸟朝凤: 类和对象是两码事。类存在哪里,就是抽象的定义,我们把类实例化出来,就是要操作的对象。每次实例化,都是在原有的类的基础上得到的,之间并没有实际的联系,只能说可以都有相同的成员。做个很简单的例子就明白了。写个泛型,吧数据源往泛型里面塞要写个循环,你循环每次都使用同一个对象接受并且添加到泛型里面,和循环里面实例化类往泛型里面添加的区别。就这样。
至于更深的对象的值放在堆上面,对象的地址放在栈上面,我自己也是一知半解,就不误导人了
我是菜鸟,我觉得静态成员和常量一起理解比较好,感觉就像引用类型在内存中存储方式一样,是key指向value,key有多个,但是value只有一个。。。。。不知道我说的意思楼主有没有听懂