黑马程序员技术交流社区

标题: 关于无参构造的问题 [打印本页]

作者: 宋旭东    时间: 2013-7-4 17:05
标题: 关于无参构造的问题

关于这段代码Demo1中创建了Human对象,在没有提供构造函数的情况下、虚拟机会自动添加无参构造函数,但下面自己写了构造函数,这里的构造函数是有参构造,编译会报错
我的疑问是编译时下面没有无参构造、虚拟机为什么不自动添加无参构造而报错了,希望详细解释下,谢谢

作者: oxf974025918    时间: 2013-7-4 18:19
在没有构造函数的情况下jvm会自动带有默认隐藏的无参构造函数,但是你这里有了带参构造函数,所以那个无参构造函数要自己写为显示无参构造函数。具体是为什么的话不要纠结那么多,这就是语法,记住要这样就行了。如有高手解释,我愿洗耳恭听。
作者: 木偶_freedom    时间: 2013-7-4 18:47
在程序本身没有写构造函数的情况下,生成实例时 系统会默认调用一个 无参的构造函数。 如果你重载构造方法 那么系统就不提供那一个默认的构造方法了。建议楼主看一下 毕老师 的 单例设计模式 的视频(day06)。  思考下 毕老师为什么把  构造函数 private 就会明白了。
作者: 杨翔    时间: 2013-7-4 20:09
额,这样理解吧,你自己不写构造函数,虚拟机好心好意帮你提供无参构造函数,但是现在你不鸟虚拟机,非得自己写构造函数,等你new对象了,还想厚着脸皮去问虚拟机要一个无参数的构造函数,人家当然不乐意啦,报你错呗。。。。{:soso_e113:}哈哈,开个玩笑
作者: 王洪波    时间: 2013-7-4 20:47
定义了有参构造方法后,编译器便不会再自动添加加默认的无参构造方法.
此时要想使用无参构造方法,只有显示声明出
作者: mo﹎雲℡    时间: 2013-7-4 21:04
你的疑问是编译时下面没有无参构造、虚拟机为什么不自动添加无参构造而报错了。
因为:1,每个类中都有一个默认的无参构造器。这个无参构造器是隐藏的。
      2,你自己手动创建了一个构造器,在主方法main中创建对象的时候,系统就会自动查找有没有构造器,如果有他就直接调用。如果没有他才自动添加默认隐藏构造器。
      3,Human h = new Human(); 此时创建的是一个无参的对象,但是你的类中没有无参构造器,所以系统报错。
作者: chslzj    时间: 2013-7-5 12:48
当你写了一个构造函数的时候,编译器就默认你是自己写的构造函数,不需要编译器提供构造函数,然后你还没有写不带参数的构造函数。。。
作者: 一木榜公    时间: 2013-7-5 13:01
我的理解:这个问题其实就是,用你的构造函数,还是用虚拟机的构造函数? 只能二选一。

你建立了构造函数虚拟机就用你的,他不会再给你提供默认的构造函数。

你没有建立构造函数,虚拟机认为你要用他建立的默认构造函数。
作者: 李海鹏    时间: 2013-7-5 13:49
Human h = new Human(); 此时创建的是一个无参的对象,但是你的类中没有无参构造器,所以系统报错。
作者: 在乎..    时间: 2013-7-11 19:56
JVM会优先使用程序员定义的构造函数,如果没有定义则会调用自己的默认构造函数,你这定义了,JVA检测到要带参数的构造函数,你没有用到就报错。
作者: 徐卓    时间: 2013-7-11 20:51
你已经写了构造函数,就不能出现无带入值得构造函数,java是这样默认的,么办法
作者: 小狼    时间: 2013-7-12 16:29
也受教了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2