装修公司网站源码,做网站实训报告,包装盒网站模板下载,wordpress 完整主题下载地址我们已经知道类体中的方法分为实例方法和类方法两种#xff0c;用static修饰的是类方法。二者有什么区别呢#xff1f;当一个类创建了一个对象后#xff0c;这个对象就可以调用该类的方法。 当类的字节码文件被加载到内存时#xff0c;类的实例方法不会被分配入口地址… 我们已经知道类体中的方法分为实例方法和类方法两种用static修饰的是类方法。二者有什么区别呢当一个类创建了一个对象后这个对象就可以调用该类的方法。 当类的字节码文件被加载到内存时类的实例方法不会被分配入口地址当该类创建对象后类中的实例方法才分配入口地址从而实例方法可以被类创建的任何对象调用执行。需要注意的是当我们创建第一个对象时类中的实例方法就分配了入口地址当再创建对象时不再分配入口地址也就是说方法的入口地址被所有的对象共享当所有的对象都不存在时方法的入口地址才被取消。 对于类中的类方法在该类被加载到内存时就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。类方法在类的字节码加载到内存时就分配了入口地址因此Java语言允许通过类名直接调用类方法而实例方法不能通过类名调用。在讲述类的时候我们强调过在Java语言中类中的类方法不可以操作实例变量也不可以调用实例方法这是因为在类创建对象之前实例成员变量还没有分配内存而且实例方法也没有入口地址。有时候我们对静态方法和实例化方法会有一些
误解1、大家都以为
“ 静态方法常驻内存实例方法不是所以静态方法效率高但占内存。”事实上他们都是一样的在加载时机和占用内存上静态方法和实例方法是一样的在类型第一次被使用时加载。调用的速度基本上没有差别。2、大家都以为“ 静态方法在堆上分配内存实例方法在堆栈上” 事实上所有的方法都不可能在堆或者堆栈上分配内存方法作为代码是被加载到特殊的代码内存区域这个内存区域是不可写的。
方法占不占用更多内存和它是不是static没什么关系。 因为字段是用来存储每个实例对象的信息的所以字段会占有内存并且因为每个实例对象的状态都不一致至少不能认为它们是一致的所以每个实例对象的所以字段都会在内存中有一分拷贝也因为这样你才能用它们来区分你现在操作的是哪个对象。
但方法不一样不论有多少个实例对象它的方法的代码都是一样的所以只要有一份代码就够了。因此无论是static还是non-static的方法都只存在一份代码也就是只占用一份内存空间。 同样的代码为什么运行起来表现却不一样这就依赖于方法所用的数据了。主要有两种数据来源一种就是通过方法的参数传进来另一种就是使用class的成员变量的值……
3、大家都以为
“实例方法需要先创建实例才可以调用比较麻烦静态方法不用比较简单”事实上如果一个方法与他所在类的实例对象无关那么它就应该是静态的而不应该把它写成实例方法。所以所有的实例方法都与实例有关既然与实例有关那么创建实例就是必然的步骤没有麻烦简单一说。当然你完全可以把所有的实例方法都写成静态的将实例作为参数传入即可一般情况下可能不会出什么问题。从面向对象的角度上来说在抉择使用实例化方法或静态方法时应该根据是否该方法和实例化对象具有逻辑上的相关性如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。我们为什么要把方法区分为静态方法和实例化方法 如果我们继续深入研究的话就要脱离技术谈理论了。早期的结构化编程几乎所有的方法都是“静态方法”引入实例化方法概念是面向对象概念出现以后的事情了区分静态方法和实例化方法不能单单从性能上去理解创建c,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题而是为了让开发更加模式化、面向对象化。这样说的话静态方法和实例化方式的区分是为了解决模式的问题。拿别人一个例子说事比如说“人”这个类每个人都有姓名、年龄、性别、身高等这些属性就应该是非静态的因为每个人都的这些属性都不相同但人在生物学上属于哪个门哪个纲哪个目等这个属性是属于整个人类所以就应该是静态的——它不依赖与某个特定的人不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。