这两周没有妹子来找我提问,有点难过,所以延迟更新。哈哈,别当真,因为菜菜这两周周末有事(你可以认为她要在公司加班),实在没精神,还请见谅!!以下为菜菜本人观点,不代表任何妹子观点。请轻喷面向对象这种经过业界检验和认可的编程思想。没有面向对象的编程思想。面向对象(OO)是一种软件开发方法。面向对象的概念和应用已经超越了编程和软件开发,已经扩展到数据库系统、交互界面、应用程序结构、应用平台、分布式系统、网络管理结构、CAD技术和人工智能等领域。面向对象是一种理解和抽象现实世界的方法,是计算机程序设计技术发展到一定阶段的产物。说到面向对象的思想,首先要有一个对象。因此,计算机天才们从语言的角度利用抽象能力,在编程中创造抽象对象。典型代表作是java/c#中的类。把每个类的类型看成是现实世界中的一类对象,然后根据类创建类的多个实例,把这些实例看成具体的对象。为了完美支持面向对象,大多数语言都支持特性:封装、继承、多态。这也是很多痛苦面试题中的常见题型。在应用场景中引入实例化方法的概念是面向对象概念出现之后的事情。静态方法和实例化方法的区别不能仅仅从性能的角度来理解。对于c++、java、c#等面向对象语言的高手,没有必要去创建实例化方法。解决性能和内存问题,而是让开发更加模式化和面向对象。这样区分静态方法和实例化方法就是为了解决模式的问题。说白了,是用实例方法还是静态方法,要看业务场景。当你业务中的每个对象都有自己的状态或行为,而这些状态和行为只属于当前对象时,那么你的Behaviors就可以设计成实例方法。举个很简单的例子:在一个游戏项目中,每个玩家(player)都有自己的状态。比如玩家有一个行为:跳跃。不同的玩家可能跳跃的距离不同,所以这种跳跃行为体现在代码中上面是一个玩家类型实例的方法。至于静态方法,一般定义为类型的行为和状态。由于该类型由所有实例共享,因此通常用于全局共享目的。在实际项目中,你会发现很多帮助类都包含静态方法,因为这些方法与具体对象无关,与具体对象的行为状态无关。因为没有到具体实例的连接,所以这种类型的静态方法几乎总是线程安全的。举个很简单的例子:项目中有很多加密方式。这些方法的作用是给一个参数,返回一个结果,本身没有任何状态,所以这些方法都设计成静态方法。在大多数项目中,实例方法的使用多于静态方法,为什么呢?因为大部分系统都充斥着各种各样的对象设计和各种XX设计模式的使用,而这些最终还是要用到面向对象的思想。举个最简单的MVC例子,无论是Java还是C#中的MVC框架,controller中的方法都是实例方法,因为每个HTTP请求都有自己的状态,比如header信息,body信息等,这些状态就是它属于当前的http请求,所以这些控制器必须是实例方法。几乎所有现代流行的编程语言都提供了类型实例的继承和多态,都是为了更好地服务于面向对象的理念。为什么不提供类型继承和多态?朋友可以留言哦!常见问题静态方法是类型的方法,实例方法是每个实例的方法(每种语言的形式不同):classBird{//staticmethodstaticboolIsAnimal(){returntrue;}//实例方法boolIsCanFly(){returntrue;}}静态方法比实例方法快?菜菜认为这是不对的。方法的代码被加载到内存中,然后由CPU执行。执行速度的快慢与是否是静态方法无关。但是有一种特殊的场景,就是GC。实例化过多的对象会触发java/c#等带有GC的编程语言的垃圾回收操作。当进行垃圾回收时,所有的线程都会被挂起,所以在这短短的时间内,程序就会卡死。静态方法是否驻留在内存中?当一个类型第一次被使用时,静态方法和变量被加载到内存中,直到进程被销毁。说常驻内存也是一种误解。正确的说法是只有在使用后才会加载到内存中。当然在某些语言中可以手动卸载当前类型。静态方法没有线程安全问题,菜菜认为是错误的。是否存在线程安全问题,并不是由是否静态来决定的。一个类型也可以有自己的状态和行为,但在一个过程中只有一个副本。当一个类型中的状态被多个线程修改时,就会出现资源竞争问题,就会出现线程安全问题。当一个类型的状态只能读取时,可以认为read方法是线程安全的。自己运行下面程序的结果classProgram{staticvoidMain(string[]args){for(inti=0;i<20;i++){Threadt=newThread(()=>{for(inti2=0;i2<100000;i2++){添加();}});t.开始();}//模拟程序继续运行while(true){Console.WriteLine($"Numvalue:"+Num);线程.睡眠(1000);}控制台.Read();}公共静态整数;publicstaticvoidAdd(){Num=Num+1;}}至于实例方法的线程安全,原理类似。是否存在线程安全问题取决于状态是否被多个线程并发修改,是否存在资源竞争,是否静态完全无关。加关注公众号:建筑师实践之路,获取更多精彩内容
