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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© て淡莣了陌生 中级黑马   /  2013-4-26 08:13  /  2011 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 て淡莣了陌生 于 2013-4-27 06:46 编辑

class Demo3
{
public static void main(String[] args)
{
  Teacher t=new Teacher();
  
  Teacher tt=new Teacher("tom");
  System.out.println(tt.name);

}
}

class Teacher
{
String name;
  
Teacher(String n){
  name=n;
}
}

这段代码在Teacher中不是会有默认的无参构造吗,为什么编译这段代码的时候会报错呢???

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

14 个回复

倒序浏览
有了Teacher(String n){ name=n;},就不会有无参的构造了。你去看毕老师的视频第5天,08,构造函数6分30秒处
回复 使用道具 举报
李德全 发表于 2013-4-26 08:22
有了Teacher(String n){ name=n;},就不会有无参的构造了。你去看毕老师的视频第5天,08,构造函数6分30秒 ...

你要用  Teacher t=new Teacher();
就得定义一个无参的
回复 使用道具 举报
如果自定义了带参数的构造方法,那么java就不会提供默认的构造方法了,所以这时调用无参的构造方法就会报错,找不到这个构造方法。
回复 使用道具 举报
构造函数的基本功能就是用来创建对象的,当你的自定义类里边没有构造函数的时候,jvm会默认的为你分配一个参数为空构造函数,当你自定义一个构造函数的时候,系统就不会再为你提供默认构造函数了。所以你这段代码要想创建无参对象,必须自己定义一个无参构造函数!
回复 使用道具 举报
自定义构造函数后,在调用时候必须和你定义的一样,要么已重载形式出现也行。你可以在写一句 Teacher t=new Teacher(); 这个无参的 才可以
回复 使用道具 举报
当你定义了有参的构造函数,如果你想初始化无参的构造函数,就必须在该类中定义无参的构造方法。
      发现子类构造函数运行时,先运行了父类的构造函数。为什么呢?
  原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super();
  super(): 表示父类的构造函数,并会调用于参数相对应的父类中的构造函数。而super():是在调用父类中空参数的构造函数。
  为什么子类对象初始化时,都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个super()?)
  因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
董波 中级黑马 2013-4-26 11:49:36
8#
创建一个类时,如果没有定义任何构造方法,jvm就会默认为你创建一个无参数的构造方法(这个无参数构造方法在代码中是看不到的)。
但是如果你在创建的类中定义了构造方法,不管你定义的构造方法是不是无参数的,jvm都不会再为你创建默认的无参数构造方法。
所以,因为在你的代码中创建了Teacher(String n)构造方法,jvm是不会再为你创建默认的无参构造方法的。这时,Teacher t=new Teacher()这行代码实际上是调用了一个不存在的方法,导致报错。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数,当在类中自定义了构造函数后,默认的构造函数就没有了
回复 使用道具 举报
对象一建立就会调用与之对应的构造函数。构造函数的作用:可以用于给对象进行初始化。
构造函数的小细节:
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。一个对象建立,构造函数只运行一次。
什么时候定义构造函数呢?当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
楼主你好   如果构造方法的问题解决了  请把帖子的类型改为“已解决”{:soso_e181:}
回复 使用道具 举报
class Demo3
{
       public static void main(String[] args)
       {
                Teacher t=new Teacher(); //这句代码出错!因为没有空参的构造函数,无法创建对象
  
                Teacher tt=new Teacher("tom");
                 System.out.println(tt.name);

        }
}

class Teacher
{
            String name;
           Teacher()
            {  ----------------->加入无参数的构造函数

            }
  
           Teacher(String n)
          {
             this.name=n;
           }
}
在Teacher类中,你已经创建了带有String类型参数的构造函数,所以,默认无参数的构造函数就不存在了。
解决方法:在Teacher中再创建一个无参数的构造函数。如上

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
---------- javac ----------
Demo3.java:6: 错误: 无法将类 Teacher中的构造器 Teacher应用到给定类型;
  Teacher t=new Teacher();
            ^
  需要: String
  找到: 没有参数
  原因: 实际参数列表和形式参数列表长度不同
实际参数列表就是你定义的Teacher()实体中的()
形式参数列表就是构造函数中的(String n)
Teacher(String n){
  name=n;
}
因为你创建 Teacher t=new Teacher(); 时,jvm虚拟机会去自动寻找jvm类中无参的构造函数,但是因为你应景在Teacher类中定义了Teacher(String n)这个构造函数
所以默认的无参构造函数就不会再被创建。这时候你再调用无参的构造函数就会出现上述错误。
回复 使用道具 举报
hmr8 中级黑马 2013-4-27 01:56:47
15#
没写任何构造方法时是有默认的方法,但写了哪怕是形参不一样,就没有默认的构造了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马