我们已经知道类体中的方法分为实例方法和类方法两种,用static修饰的是类方法。二者有什么区别呢?当一个类创建了一个对象后,这个对象就可以调用该类的方法。


       当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。


对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。

类方法在类的字节码加载到内存时就分配了入口地址,因此,Java语言允许通过类名直接调用类方法,而实例方法不能通过类名调用。在讲述类的时候我们强调过,在Java语言中,类中的类方法不可以操作实例变量,也不可以调用实例方法,这是因为在类创建对象之前,实例成员变量还没有分配内存,而且实例方法也没有入口地址。

有时候我们对静态方法和实例化方法会有一些 误解
1、大家都以为 “ 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。”
     事实上,他们都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。

2、大家都以为“ 静态方法在堆上分配内存,实例方法在堆栈上”

事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。

方法占不占用更多内存,和它是不是static没什么关系。   
       因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所以字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。 但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是static还是non-static的方法,都只存在一份代码,也就是只占用一份内存空间。

同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class的成员变量的值……

3、大家都以为 “实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单”
     事实上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。
当然你完全可以把所有的实例方法都写成静态的,将实例作为参数传入即可,一般情况下可能不会出什么问题。
从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象  反之使用静态方法。这只是从面向对象角度上来说的。
如果从线程安全、性能、兼容性上来看  也是选用实例化方法为宜。

我们为什么要把方法区分为:静态方法和实例化方法 ?
      如果我们继续深入研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。

拿别人一个例子说事:

比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。

为什么Java中类方法不能访问实例方法相关推荐

  1. python中类方法与实例方法的区别-python中类方法、类实例方法、静态方法的使用与区别...

    1.如果你需要用实例来调用你的方法,那么在定义方法的时候,一定要把第一个参数设置成为self: ?2.如果你需要使用静态方法,那么你需要在方法前面加上@staticmethod修饰符: ?3.如果要使 ...

  2. python 类方法 静态方法_python中类方法、类实例方法、静态方法的使用与区别

    注:使用的是Python2.7. 一.实例方法 实例方法就是类的实例能够使用的方法.如下: class Foo: def __init__(self, name): self.name = name ...

  3. Python中类方法、类实例方法、静态方法,私有属性和私有方法有何区别?

    类方法 是类对象的方法,在定义时需要在上方使用 @classmethod 进行装饰,形参为cls,表示类对象,类对象和实例对象都可调用. 使用格式: 对类的属性进行操作,就要用类的方法. @class ...

  4. Java中类方法的快速入门

    文章目录 类方法的定义 类方法的经典实用场景 注意事项 总结 类方法的定义 类方法也叫静态方法 形式 访问修饰符 static 数据返回类型 方法名() {} -->> !!!推荐使用这种 ...

  5. python中类方法可以访问实例属性吗_Python类方法访问属性

    Python类方法访问属性教程 Python 中的 Python实例方法访问属性详解 语法 class People: money = 10000 def __init__(self, name): ...

  6. Java中类方法可以继承吗_在Java语言中,类方法(静态方法)可以被继承,但是不能被( )。_学小易找答案...

    [单选题]- Could you tell me where the fitting room(试衣间) is? I need to________ this pair of pants. - Sur ...

  7. 大神开车的标题-python中类方法、类实例方法、静态方法的使用与区别

    https://www.cnblogs.com/wcwnina/p/8644892.html

  8. java中类的方法分为 类方法_Java中类的方法成员分为()方法和实例方法。

    Java中类的方法成员分为()方法和实例方法. 答:第一空: 类 下列各项中,不属于直接材料预算的编制基础的有( ). 答:直接人工预算 现金预算 社会主义基本制度的确立( ?). 答:是中国历史上最 ...

  9. JavaWeb那些事儿(二)--java中类、成员和方法的访问权限

    今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA ...

最新文章

  1. 谷歌发布最新看图说话模型,可实现零样本学习,多类型任务也能直接上手
  2. 宏光MINI EV收割的年轻人,又被苏宁、小米、欧拉盯上了
  3. 周志华眼中的贝叶斯方法(转)
  4. java与android https,java – Https连接Android
  5. C++::My Effective C++ (二)
  6. 大数据是如何改变零售行业的
  7. JavaScript 编码指南
  8. pycharm 修改darcual(暗黑)主题滚动条颜色
  9. 分享一个小软件fences(桌面管理软件)
  10. Github中的缩写(PR, WIP, PTAL, TBR, TL, LGTM, SGTM, AFAIK, CC)含义
  11. vnc远程控制软件安装,超实用的windows下安装vnc远程控制软件教程
  12. 基于JSP的美食论坛系统毕业设计
  13. 南京市儿童医院用医保身份(医保通道)网上预约挂号以及取号、付费看病流程
  14. 重装系统后,硬盘分区丢失的解决办法
  15. 手把手带你入门深度学习(一):保姆级Anaconda和PyTorch环境配置指南
  16. java工作流 snaker_GitHub - sneakerhead/hutool: A java tools make it easy to code
  17. 简单的python脚本-python基础练习之几个简单的游戏
  18. 得物App万米高空WiFi拦截记
  19. Ubuntu18.04 Sublime Text3
  20. Java Web学习笔记

热门文章

  1. mac cad石材填充图案_CAD电视背景墙画法步骤
  2. matlab实验符号计算答案,实验五matlab符号计算
  3. linux将txt文件复制为bak,Linux命令:cp (copy)复制文件或目录
  4. 限制input 内部字数
  5. httpHandlers和httpModules接口介绍 (5)
  6. 奇妙的 CSS shapes(CSS图形)
  7. 统计一个panel中lable的个数
  8. 代码风格之Prettier简介
  9. 微信小程序 监听位置信息
  10. 【概率DP】$P2059$ 卡牌游戏