程序员过关斩将--来自于静态方法和实例方法的联想翩翩


这两周没有妹子来找我问问题,有点小伤感,所以耽误更新了。哈哈,别当真,因为菜菜这两周周末都有事(你可以认为去公司加班了),实在是没有精力,忘各位见谅!!


以下为菜菜自己观点,不代表任何妹子的观点,请轻喷

◆◆
面向对象
◆◆

作为一个久经考验并得到业界肯定的编程思想莫过于面向对象编程思想了。

面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

谈到面向对象思想,首先你得有一个对象才可以。所以计算机天才在语言角度发挥抽象能力,在编程中把对象抽象创建了出来,典型的代表作就是java/c# 中的类(class)。把每一个class的类型看做现实世界中的一类对象,然后根据class 可以创建出来多个class的实例,把这些实例看做是面向的具体对象。

为了完美的支持面向对象,大多数语言都支持了特性:封装,继承,多态。这也是诸多蛋疼的面试题中的常见题型。
◆◆
应用场景
◆◆

引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。

说的白话一点,到底是使用实例方法还是静态方法取决于业务的场景,当你的业务中每个对象都有自己的状态,或者行为,这些状态和行为是只属于当前对象的,那你的行为可以设计成实例方法。

举一个很简单的例子:一个游戏的项目中,每个玩家(player)都有自己的状态,比如玩家有一个行为:跳跃,不同的玩家跳的距离可能不同,所以这个跳跃的行为体现到代码上就是一个player类型实例的方法。

至于静态方法,一般的定义成类型的行为和状态。因为类型是所有实例共享的,所以通常用作全局共享用途。实际项目中会发现有很多的helper类里边都是静态方法,因为这些方法和具体对象,和具体对象的行为状态没有任何关系。因为和具体实例没有连接,所以这类型的静态方法几乎都是线程安全的。

举个很简单的例子:项目中有很多加密的方法,这些方法的作用就是给一个参数,返回一个结果,没有任何自己的状态,所以这些方法被设计成静态方法。

在多数项目中,实例方法的使用量要大于静态方法,为什么呢?因为在多数系统中充斥着各种对象的设计,各种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;        }    }

至于实例方法的线程安全问题,原理类似。有没有线程安全问题取决于状态有没有被多个线程并发修改,有没有资源竞争,和是否静态完全没关系。

THE END
程序员修神之路--问世间异步为何物?
程序员修神之路--提高网站的吞吐量??
程序员修神之路--??分布式高并发下Actor模型如此优秀??
程序员过关斩将--论商品促销代码的优雅性
程序员过关斩将--请不要随便修改基类
程序员过关斩将--你的面向接口编程一定对吗?
程序员修神之路--高并发下为什么更喜欢进程内缓存
程序员修神之路--高并发优雅的做限流

原文地址:https://www.cnblogs.com/zhanlang/p/10957462.html

时间: 2024-11-02 05:01:55

程序员过关斩将--来自于静态方法和实例方法的联想翩翩的相关文章

程序员过关斩将--自定义线程池来实现文档转码

背景 我司在很久之前,一位很久之前的同事写过一个文档转图片的服务,具体业务如下: 用户在客户端上传文档,可以是ppt,word,pdf 等格式,用户上传完成可以在客户端预览上传的文档,预览的时候采用的是图片形式(不要和我说用别的方式预览,现在已经来不及了) 当用户把文档上传到云端之后(阿里云),把文档相关的信息记录在数据库,然后等待转码完成 服务器有一个转码服务(其实就是一个windows service)不停的在轮训待转码的数据,如果有待转码的数据,则从数据库取出来,然后根据文档的网络地址下载

怎样为程序员做职业规划

真正的智慧是拥有对人心的判断力.记得<论语>中也讲过:真正的智慧就是知人,用正直的力量影响周围,影响社会.这种智慧会使我们能够深深地沉静下来,面对每一位程序员以及其背后经历过的历史,能够顺着他心灵上每一条纹路,走进他深处.隐秘.那些欢喜忧伤,那些心灵的愿望,那些对美好生活的设计之路. 经过半年时间的锻炼,大熊和小蔡彼此在技术与素养能力上都提高很快.老板又委任大熊新的重任,承担一个规模更大的项目.由于公司整体管理混乱,其他几个项目组中的程序员辞职现象时有发生,公司整体项目风险加大,经常是拆东墙补

程序员修神之路--做好分库分表其实很难之一(继续送书)

菜哥,领导让我开发新系统了 这么说领导对你还是挺信任的呀~ 必须的,为了设计好这个新系统,数据库设计我花了好多心思呢 做一个系统我觉得不应该从数据库入手,应该从设计业务模型开始,先不说这个,说说你的数据库设计的优势 为了高性能我首先设计了分库 分表策略,为以后打下基础 那你的数据量将来会很大吗?分库分表其实涉及到很多难题,你了解过吗? 我觉得分库分表很容易呀 是吗? 是否需要分 说到数据库分库分表,不能一味的追求,我们要明白为什么要进行分库分表才是最终目的.现在网上一些人鼓吹分库分表如何应对了多

编写高质量代码改善C#程序的157个建议——建议100:静态方法和实例方法没有区别

建议100:静态方法和实例方法没有区别 静态方法在加载时机和内存使用上和实例方法完全一致.在这里,我们先引出一个概念“类型对象”.比如类型Person,我们都知道new Person() 会产生一个对象,这个对象叫做“实例对象”,它在运行时会加载到GC Heap上.而“类型对象”是指代表Person类型本身的那个对象,这个对象在第一次使用类型时被加载到Loader Heap上.类型对象包括其自身的指针.自身的同步索引快.静态字段,以及一个方法表.在这个方法表中,无论是静态方法还是实例方法都会被存

.net快速开发框架的使用感受,来自一位勤奋的程序员

你们好呀,先自我介绍一下吧,小弟是一家公司开发部.net程序员.外号人送武松,因为本人姓武名宋,所以喊着喊着就喊成了武松了.公司在上海,主要是做电子产品还有汽车配件制造这一块的.我们开发部负责的就是公司官网的维护,公司系统的维护调整,以及公司新系统以及新项目的开发了. 不知道大家有没有听说过力软敏捷开发框架这个快速开发平台,还记得我还没有来这个公司的时候就听说了这个框架供应商好像有一个叫做快速信息化的框架,那个时候也没怎么了解过.因为好多人都问我这个框架怎么样,那么我就写一篇关于我们公司使用框架

一封来自Java程序员的情书

一直以来程序员都给大家以高智商低情商,不懂得浪漫不会哄女生开心的形象.但是,我觉得程序员都是浪漫的.对于这种错误观念,只能用一首歌来表达广大程序员的心声:程序员的好,只有他身边的那个人才知道!!! 每个程序员都知道的一句话其实就是最美的情话:"Hello Word".著名作家兼程序员王小波把他翻译成:"你好哇,李银河." 当然,还有来自程序员的三行情诗: 下面,是一首出自Java程序员的情书.用我最熟悉的语言,表达我的感受,也许,这就是浪漫~ <面向对象>

来自“Java中国”优秀的程序员不会觉得累成狗是一种荣耀

分享下“https://java-china.org/topic/28“,也算是对自己的一种告诫吧. 原文:Sleep deprivation is not a badge of honor 先介绍一下作者:Ruby on Rails作者.Basecamp创始人&CTO.<重来>(rework)作者. 缺乏睡眠就像是借高利贷.确实你会多得到几个小时做你以为几个小时就能做完的工作,但是代价是什么?你迟早要把这些时间还回去,如果你不还,会破坏你的创造力,士气,待人的品行. 我们都会偶尔熬夜

程序员接私活经验总结,来自csdn论坛语录

以下为网上摘录,以做笔记: 可是到网上看看,似乎接私活也有很多不容易,技术问题本身是个因素,还有很多有技术的人接私活时被骗,或者是合作到最后以失败告终,所以想请有经验的大侠们出来指点一下,接私活是怎么接的?一般流程怎样?要注意什么?签合同的风险?等等问题,希望高手能将宝贵的经验与大家共享阿? ///////////////////////////////////// 最好是朋友或熟人推荐,这样双方都比较放心,项目也好拿一些,一般也不会欠款. 如果是陌生人就不好说了,即使签合同也没用. 还有就是接

驱动力来自哪里-献给迷茫的程序员

驱动你做一件事情的动力来源是什么?不知道大家想过这个问题没有.一般人可能会想到两种驱动力. 一种是生存本能带来的驱动力,即生物性驱动力.比如每天要吃饭.睡觉.上厕所,长大了要恋爱.结婚等.这种驱动力保证我们能够生存在这个世界上,是一种原始的驱动力. 另一种是奖励或者惩罚带来的驱动力,即外在动机.比如老板承诺工作干的好有奖金,我们就努力干活.如果上班迟到会罚款,我们会早起等.这种驱动力会改变人的行为,使其多做鼓励的事情,少做禁止的事情. 如果只依靠这两种驱动力,那么你的人生会变得精彩吗?很难.为什