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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋旭东 中级黑马   /  2013-7-4 17:05  /  1849 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • class Demo1
  • {
  •         public static void main(String[] args)
  •         {
  •                 Human h = new Human(); //创建一个Human类对象
  •         }
  • }
  • class Human
  • {
  •         //这是当前Human类的一个构造方法
  •         public Human(String name){
  •                 System.out.println("这是一个Human类的构造方法");
  •         }
  • }

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

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
特殊服务 + 1
张勇1993 + 2

查看全部评分

11 个回复

倒序浏览
在没有构造函数的情况下jvm会自动带有默认隐藏的无参构造函数,但是你这里有了带参构造函数,所以那个无参构造函数要自己写为显示无参构造函数。具体是为什么的话不要纠结那么多,这就是语法,记住要这样就行了。如有高手解释,我愿洗耳恭听。
回复 使用道具 举报
在程序本身没有写构造函数的情况下,生成实例时 系统会默认调用一个 无参的构造函数。 如果你重载构造方法 那么系统就不提供那一个默认的构造方法了。建议楼主看一下 毕老师 的 单例设计模式 的视频(day06)。  思考下 毕老师为什么把  构造函数 private 就会明白了。
回复 使用道具 举报
额,这样理解吧,你自己不写构造函数,虚拟机好心好意帮你提供无参构造函数,但是现在你不鸟虚拟机,非得自己写构造函数,等你new对象了,还想厚着脸皮去问虚拟机要一个无参数的构造函数,人家当然不乐意啦,报你错呗。。。。{:soso_e113:}哈哈,开个玩笑
回复 使用道具 举报
定义了有参构造方法后,编译器便不会再自动添加加默认的无参构造方法.
此时要想使用无参构造方法,只有显示声明出
回复 使用道具 举报
你的疑问是编译时下面没有无参构造、虚拟机为什么不自动添加无参构造而报错了。
因为:1,每个类中都有一个默认的无参构造器。这个无参构造器是隐藏的。
      2,你自己手动创建了一个构造器,在主方法main中创建对象的时候,系统就会自动查找有没有构造器,如果有他就直接调用。如果没有他才自动添加默认隐藏构造器。
      3,Human h = new Human(); 此时创建的是一个无参的对象,但是你的类中没有无参构造器,所以系统报错。

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1 个人感觉这个比较靠谱,需要明白楼主问的是.

查看全部评分

回复 使用道具 举报
当你写了一个构造函数的时候,编译器就默认你是自己写的构造函数,不需要编译器提供构造函数,然后你还没有写不带参数的构造函数。。。
回复 使用道具 举报
我的理解:这个问题其实就是,用你的构造函数,还是用虚拟机的构造函数? 只能二选一。

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

你没有建立构造函数,虚拟机认为你要用他建立的默认构造函数。
回复 使用道具 举报
Human h = new Human(); 此时创建的是一个无参的对象,但是你的类中没有无参构造器,所以系统报错。
回复 使用道具 举报
JVM会优先使用程序员定义的构造函数,如果没有定义则会调用自己的默认构造函数,你这定义了,JVA检测到要带参数的构造函数,你没有用到就报错。
回复 使用道具 举报
你已经写了构造函数,就不能出现无带入值得构造函数,java是这样默认的,么办法
回复 使用道具 举报
也受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马