JAVA构造器是否为静态方法你知道吗

 更新时间:2022年02月08日 09:57:47   作者:向上攀爬的程序员  
这篇文章主要为大家详细介绍了JAVA构造器是否为静态方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

在thinking in java中,第96页提到,“即使没有显示地使用static关键字,构造器实际上也是静态方法“,对此我产生了疑惑,于是找相关资料进行确认,在一篇大神的博客中得到了答案,那就是构造器不是静态方法。

主要是以下几点原因:

Java虚拟机规范第二版中定义了四种不同的字节码指令来处理Java程序中不同种类的方法的调用:

  • invokestatic - 用于调用类(静态)方法 
  • invokespecial - 用于调用实例方法,特化于super方法调用、private方法调用与构造器调用 
  • invokevirtual - 用于调用一般实例方法(包括声明为final但不为private的实例方法) 
  • invokeinterface - 用于调用接口方法 

其中,invokestatic与invokespecial调用的目标必然是可以静态绑定的(比如不被继承),因为它们都无法参与子类型多态;invokevirtual与invokeinterface的则一般需要做运行时绑定,JVM实现可以有选择的根据final或实际运行时类层次或类型反馈等信息试图进行静态绑定。

那么Java中的实例构造器是不是“静态方法”呢?从Java语言规范中给出的“静态方法”的定义来看,答案是“否”——首先从Java语言规范对“方法”的定义来说,构造器根本不是“方法”;其次,实例构造器有一个隐式参数,“this”,在实例构造器中可以访问“this”,可以通过“this”访问到正在初始化的对象实例的所有实例成员。 

实例构造器无法被隐藏或覆写,不参与多态,因而可以做静态绑定。从这个意义上可以认为实例构造器是“静态”的,但这种用法与Java语言定义的“静态方法”是两码事。 

另外需要注意的是,Java语言中,实例构造器只能在new表达式(或别的构造器)中被调用,不能通过方法调用表达式来调用。new表达式作为一个整体保证了对象的创建与初始化是打包在一起进行的,不能分开进行;但实例构造器只负责对象初始化的部分,“创建对象”的部分是由new表达式本身保证的。 

这个例子的注意点在于: 

1、Java的实例构造器只负责初始化,不负责创建对象;Java虚拟机的字节码指令的设计也反映了这一点,有一个new指令专门用于创建对象实例,而调用实例构造器则使用invokespecial指令。 

2、“this”是作为实例构造器的第一个实际参数传入的。 

静态方法中不能使用this,而构造器中可以使用this关键字。this是指调用当前方法的对象,而静态方法不属于任何对象。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!     

相关文章

  • springMVC获取请求参数的几种方式汇总

    springMVC获取请求参数的几种方式汇总

    在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结,下面这篇文章主要给大家介绍了关于springMVC获取请求参数的几种方式,需要的朋友可以参考下
    2022-04-04
  • Java中Set与List的关系与区别介绍

    Java中Set与List的关系与区别介绍

    这篇文章主要介绍了Java中Set与List的关系与区别介绍,本文总结它们两个接口都是继承自Collection、它们之间的存储方式不一样,需要的朋友可以参考下
    2015-03-03
  • 详解Java如何实现FP-Growth算法

    详解Java如何实现FP-Growth算法

    学校里的实验,要求实现FP-Growth算法.FP-Growth算法比Apriori算法快很多(但是却比不上时间)在网上搜索后发现Java实现的FP-Growth算法很少,且大多数不太能理解):太菜.所以就自己实现了一下.这篇文章重点介绍一下我的Java实现 ,需要的朋友可以参考下
    2021-06-06
  • java 发送http和https请求的实例

    java 发送http和https请求的实例

    下面小编就为大家分享一篇java 发送http和https请求的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Springboot实现自定义错误页面的方法(错误处理机制)

    Springboot实现自定义错误页面的方法(错误处理机制)

    这篇文章主要介绍了Springboot实现自定义错误页面的方法(错误处理机制),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java判断ip是否为IPV4或IPV6地址的多种方式

    Java判断ip是否为IPV4或IPV6地址的多种方式

    本文主要介绍了Java判断ip是否为IPV4或IPV6地址的多种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • spring boot实现图片上传和下载功能

    spring boot实现图片上传和下载功能

    这篇文章主要为大家详细介绍了spring boot实现图片上传和下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • MyBatis sql中test如何判断Boolean

    MyBatis sql中test如何判断Boolean

    这篇文章主要介绍了MyBatis sql中test如何判断Boolean,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java线程的start方法回调run方法的操作技巧

    Java线程的start方法回调run方法的操作技巧

    面试过程中经常会被面试官问到为什么我们调用start()方法时会执行run()方法,为什么不能直接调用run()方法,问的一头雾水,今天小编给大家介绍下Java线程的start方法回调run方法的操作技巧,需要的朋友参考下吧
    2017-11-11
  • mybatis-plus配置日志两种实现方式

    mybatis-plus配置日志两种实现方式

    这篇文章主要给大家介绍了关于mybatis-plus配置日志两种实现方式的相关资料,Mybatis-plus集成了日志框架,可以将程序运行时产生的日志进行记录,方便开发人员进行问题排查,需要的朋友可以参考下
    2023-09-09

最新评论