这两周没有妹子来找我问问题,有点小伤感,因此耽误更新了。哈哈,别当真,由于菜菜这两周周末都有事(你能够认为去公司加班了),实在是没有精力,忘各位见谅!!java
如下为菜菜本身观点,不表明任何妹子的观点,请轻喷c++
做为一个久经考验并获得业界确定的编程思想莫过于面向对象编程思想了。程序员
谈到面向对象思想,首先你得有一个对象才能够。因此计算机天才在语言角度发挥抽象能力,在编程中把对象抽象建立了出来,典型的表明做就是java/c# 中的类(class)。把每个class的类型看作现实世界中的一类对象,而后根据class 能够建立出来多个class的实例,把这些实例看作是面向的具体对象。web
引入实例化方法概念是面向对象概念出现之后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,建立c++,java,c#这样面向对象语言的大师引入实例化方法必定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。面试
说的白话一点,究竟是使用实例方法仍是静态方法取决于业务的场景,当你的业务中每一个对象都有本身的状态,或者行为,这些状态和行为是只属于当前对象的,那你的行为能够设计成实例方法。数据库
举一个很简单的例子:一个游戏的项目中,每一个玩家(player)都有本身的状态,好比玩家有一个行为:跳跃,不一样的玩家跳的距离可能不一样,因此这个跳跃的行为体现到代码上就是一个player类型实例的方法。编程
至于静态方法,通常的定义成类型的行为和状态。由于类型是全部实例共享的,因此一般用做全局共享用途。实际项目中会发现有不少的helper类里边都是静态方法,由于这些方法和具体对象,和具体对象的行为状态没有任何关系。由于和具体实例没有链接,因此这类型的静态方法几乎都是线程安全的。c#
举个很简单的例子:项目中有不少加密的方法,这些方法的做用就是给一个参数,返回一个结果,没有任何本身的状态,因此这些方法被设计成静态方法。设计模式
在多数项目中,实例方法的使用量要大于静态方法,为何呢?由于在多数系统中充斥着各类对象的设计,各类XX设计模式的使用,而这些最终都使用了面向对象的思想。举一个最简单的mvc例子,不管是java中仍是c#的 mvc框架,controller中的方法都是实例方法,由于每一个http请求都有本身的状态,像header头信息,body信息等,这些状态是属于当前http请求的,因此这些controller必须是实例方法才行。缓存
几乎现代全部的流行编程语言都提供了类型实例的继承和多态,通通都是为了更好的服务面向对象这个理念。为何不提供类型的继承和多态呢?小伙伴们能够留言!
静态方法是类型的方法,实例方法是每一个实例的方法(每一个语言形式不太同样):
class Bird
{
//静态方法
static bool IsAnimal()
{
return true;
}
//实例方法
bool IsCanFly()
{
return true;
}
}
静态方法比实例方法快?
菜菜认为这是错误的。一个方法的代码被加载到内存中,而后被cpu去执行,执行的速度快慢和是否是静态方法没有任何关系。可是有一个特殊的场景,那就是GC。实例化太多对象在java/c#这类带有GC的编程语言中会引起垃圾回收操做,当垃圾回收进行的时候会挂起全部的线程,因此在这个短暂的时间里,程序会卡顿。
静态方法常驻内存?
在一个类型第一次被使用的时候,会把静态方法和静态变量载入内存,直到进程被销毁。说道常驻内存,也算是一种误解,正确的说法是只有在被使用以后才会加载进入内存。固然在一些语言中能够手动卸载当前类型。
静态方法没有线程安全问题
菜菜认为是错的。有没有线程安全问题不是是否是静态所决定的,一个类型也能够有本身的状态和行为,只不过在一个进程中只有一份而已。当一个类型中的状态被多个线程修改的时候,就会有资源竞争问题,就会有线程安全问题。当一个类型的状态只有读的状况下,能够认为读这个方法是线程安全的。 本身运行一下如下程序的结果
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 20; i++)
{
Thread t = new Thread(() => {
for (int i2 = 0; i2 < 100000; i2++)
{
Add();
}
});
t.Start();
}
//为了模拟程序一直运行
while (true)
{
Console.WriteLine($"Num的值:"+Num);
Thread.Sleep(1000);
}
Console.Read();
}
public static int Num;
public static void Add()
{
Num= Num+1;
}
}
至于实例方法的线程安全问题,原理相似。有没有线程安全问题取决于状态有没有被多个线程并发修改,有没有资源竞争,和是否静态彻底不要紧。