当类的字节码被加载到内存时,实例方法不会被分配入口地址,只有该类创建对象时,类中的实例方法才分配入口地址,所以实例方法只能通过对象调用。 而类方法是当类加载到内存中,就分配了相应的内存地址,所以类方法不仅可以通过对象调用,也可以用类名调用。 静态方法(Static Method)和非静态方法(Non-Static Method)的区别总结如下: 静态方法在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭。 非静态方法在实例化后才会分配内存,当实例对象被JVM 回收之后,也跟着消失,不会常驻内存。 6、静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
上面这个类中的getType方法,在没有new对象前这就可以这样用: 转自 https://zhidao.baidu.com/question/1433773942389340379.html 静态方法何时使用
这些各种说法,基本上都是正确的。 欢迎关注公众号"Devin说",会不定期更新技术知识。 转自 https://www.cnblogs.com/devinzhang/archive/2012/04/27/2473570.html 静态代码块静态代码块指 Java 类中的 static{...} 代码块,主要用于初始化类,为类的静态变量赋初始值。
注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1、(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2、非静态变量,new出来的对象存放在堆内存,所有局部变量和引用地址存放在栈内存 3、方法(包括静态方法)存放在code segment(方法块),存放代码片段,且只存放一次 ![]()
![]() 静态方法和实例方法区别及使用场景从实际项目开发说起,这里有开发项目的三种方式: 开发项目中把BLL和DAL分开,在BLL调用DAL的代码。 一、在DAL中使用静态方法,不创建实例直接调用(大概有很多人都使用这种方式开发 ) class DAL { public static string GetUserName(…); } 在BLL中调用: DAL.GetUserName(); 二、在DAL中使用实例方法,采用静态成员模式(或Singleton)通过实例来调用: class DAL { public static readonly DAL dal = new DAL(); public string GetUserName(…); } 在BLL中调用: DAL.dal.GetUserName(); 三、在DAL中使用实例方法,每次调用之前先创建DAL对象的实例: class DAL { public string GetUserName(…); } 在BLL中调用: DAL dal = new DAL(); dal.GetUserName(); 开发方式一:我以为在一些情况下(比如 调用多个数据库、GetUserName(…)内部处理操作部分)会出现线程安全的嫌疑。这种开发方式不用New出对象,所以很普遍。 开发方式二:应该多是应用在cs模式下,DAL在整个项目只会有一个对象存在,如果出现在B/S 我想不能兼容多种问题情况。而且也有线程安全的问题。 开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。 特别说明一下:在MS的pet3.0以前的版本 都采用了方式二,而到pet3.0和以后的版本 都采用了方式三,而且特别在开发说明文档中明确的解释了一下。我想应该是从兼容性上考虑的,从性能上方式二并不比方式三真正的高多少。 我特意以“你怎么理解并使用静态方法和实例化方法的?”这样的问题询问了多位程序员,他们开发的语言也不尽相同(c 、c++、java、c#) 以下是他们的回答:
有时候我们对静态方法和实例化方法会有一些误解。 1、大家都以为“ 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。” 事实上,他们都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。 2、大家都以为“ 静态方法在堆上分配内存,实例方法在堆栈上” 事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。 方法占不占用更多内存,和它是不是static没什么关系。 因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所有字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。 但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是static还是non-static的方法,都只存在一份代码,也就是只占用一份内存空间。 同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class的成员变量的值…… 3、大家都以为“实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单” 事实上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。 当然你完全可以把所有的实例方法都写成静态的,将实例作为参数传入即可,一般情况下可能不会出什么问题。 从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。 如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。 我们为什么要把方法区分为:静态方法和实例化方法 ? 如果我们继续深入研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。 拿别人一个例子说事: 比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。 |
|