A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java冬冬 高级黑马   /  2013-5-13 16:51  /  2899 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 java冬冬 于 2013-5-15 13:01 编辑

用new关键字创建对象时,有时会提示找不到无参的构造方法,这是哪里出了问题呢?{:soso_e132:}

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

11 个回复

倒序浏览
很明显是你的类中创建了构造方法,但是你创建的构造方法都是有参数的,所以JVM就不会再给你创建默认的构造器了。而你new对象的时候,new的又是一个无参对象,可是类中没有这么个无参的构造器,所以会报错咯。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
沙发正解
回复 使用道具 举报
如果你重新写了一个构造函数,默认无参数的构造函数就不存在了
这样就要自己手写一个
否则在new对象时,就无法找到无参数的构造函数了。
回复 使用道具 举报
本帖最后由 long 于 2013-5-13 17:12 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
这个问题很好。看了大家的回答我感觉理解的更清晰了。
回复 使用道具 举报
受教了....
回复 使用道具 举报
rosv 中级黑马 2013-5-13 20:31:08
9#
默认情况下会有一个无参数构造器,当你定义一个有参数的构造器时,默认的就没有了,你需要手动加上。。
回复 使用道具 举报
可能是创建对象的时候用的有参构造,你用有参构造方法创建对象了jvm就不在给你添加无参构造方法了
建议你手动加上无参构造 ,要不你就在new对象的时候写上参数

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
你创造了有参数的构造方法,编译器默认添加public 类名{}  形式的隐性构造方法,所以提示找不到无参的构造方法。而当你new对象时,new的又是一个无参对象,可是类中没有这个无参的构造器,所以才会会报错。
回复 使用道具 举报
你创建对象的类中的构造方法是不是你自定义的,如果你自定义了一个有参构造方法,那么类中原来默认的无参的构造方法就没有了,就不能new无参的了,new一个有参的应该就ok了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马