黑马程序员技术交流社区

标题: 关于无参构造方法?? [打印本页]

作者: java冬冬    时间: 2013-5-13 16:51
标题: 关于无参构造方法??
本帖最后由 java冬冬 于 2013-5-15 13:01 编辑

用new关键字创建对象时,有时会提示找不到无参的构造方法,这是哪里出了问题呢?{:soso_e132:}
作者: 陈雪琪    时间: 2013-5-13 16:56
很明显是你的类中创建了构造方法,但是你创建的构造方法都是有参数的,所以JVM就不会再给你创建默认的构造器了。而你new对象的时候,new的又是一个无参对象,可是类中没有这么个无参的构造器,所以会报错咯。
作者: 潘贵    时间: 2013-5-13 16:58
沙发正解
作者: 小陈期待逆袭    时间: 2013-5-13 17:01
如果你重新写了一个构造函数,默认无参数的构造函数就不存在了
这样就要自己手写一个
否则在new对象时,就无法找到无参数的构造函数了。
作者: long    时间: 2013-5-13 17:09
本帖最后由 long 于 2013-5-13 17:12 编辑

因为楼主的程序没有无参的构造方法,编译器当然不可能找到。当类没有显式的构造方法时,编译器会偷偷给类加入一个无参数的构造方法,称为合成的构造器(也有人叫无参构造器或默认构造器),以减轻我们编写类的负担。该构造方法的访问权限与类一致,方法体为空(当然若该类有父类的话还会在方法体的第一行加上父类的构造方法super())。当类有显式的构造方法时,编译器就不会给类加入一个无参数的构造方法,以免画蛇添足。
作者: 杨兴庭    时间: 2013-5-13 17:50
在面对对象编程中,我们会封装对象的属性和方法,通常我们将封装内容设为私有(private),那么在其他类中怎么给对象实例化,初始化具体属性呢,构造方法帮我们解决了这个问题,构造方法其他类提供了访问本类中的私有属性和方法的渠道。通过方法的重载我们可以初始化相同类下(具有一些相同属性和行为)的多个对象。
构造方法分无参构造方法和有参构造方法。
当类中没有创建构造方法时,编译器默认添加public 类名{}  形式的隐性构造方法,我们是看不见得,当在实例化对象new时,就能够调用类中属性。

当类中创建了有参构造方法时,默认的隐性构造方法将会失效,当实例化对象时调用的方法只会有有残构造方法,这时就像楼主所说的在new关键字创建对象时,就会找不到无参的构造方法了

作者: 王靖远    时间: 2013-5-13 20:16
这个问题很好。看了大家的回答我感觉理解的更清晰了。
作者: 孤独的鸟人    时间: 2013-5-13 20:18
受教了....
作者: rosv    时间: 2013-5-13 20:31
默认情况下会有一个无参数构造器,当你定义一个有参数的构造器时,默认的就没有了,你需要手动加上。。
作者: HM刘志朋    时间: 2013-5-14 23:08
可能是创建对象的时候用的有参构造,你用有参构造方法创建对象了jvm就不在给你添加无参构造方法了
建议你手动加上无参构造 ,要不你就在new对象的时候写上参数
作者: 王林涛    时间: 2013-5-14 23:26
你创造了有参数的构造方法,编译器默认添加public 类名{}  形式的隐性构造方法,所以提示找不到无参的构造方法。而当你new对象时,new的又是一个无参对象,可是类中没有这个无参的构造器,所以才会会报错。
作者: 蔚蓝小嗨    时间: 2013-5-14 23:29
你创建对象的类中的构造方法是不是你自定义的,如果你自定义了一个有参构造方法,那么类中原来默认的无参的构造方法就没有了,就不能new无参的了,new一个有参的应该就ok了




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