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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 创造命运 中级黑马   /  2014-4-16 21:01  /  1089 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 创造命运 于 2014-4-17 12:57 编辑

下午在回顾多线程时,碰到了麻烦。
以下是毕老师的源代码:
public class ThreadTest03
{
       public static voidmain(String[] args)
       {
              Test t1 = new Test("One---");
              Test t2 = new Test("Two+++");
              t1.start();
              t2.start();
       }
}
class Test extends Thread
{
        //privateString name;
       Test(String name)
       {
               //this.name = name;
              super(name);
       }
       public void run()
       {
              for (int i = 0; i< 10; i++)
              {
                     System.out.println(Thread.currentThread().getName()+"::"+i);
              }
       }
}
问题1:我将Test t1 =new Test("One---");和Test t2 = newTest("Two+++");改成了Test t1 = new Test(); Test t2 = new Test();后编译出问题。


为什么会报:构造函数找不到符号呢?这里调用的是无参数的构造函数,但是每个类里面不是缺省了又一个无参数的构造函数吗?
然后我在Test类里加入代码:Test(){}。再编译,没错,正常运行。
是不是一个类在定义了带参数的构造方法后,如果不显示的再定义无参数的构造方法,那么该类中就不会再有无参数的构造方法呢?

问题2:我将Test类的构造方法Test(String name){super(name);}删掉后,编译出错。


还是报构造函数找不到符号,为什么?我们看到此时Test类里已经没有了带参数的构造方法,但是它不是继承了Thread类吗?Thread类里有带参数的构造方法啊!


评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
如果在类里面自己定义了构造方法,原来默认的构造函数就没有了,这里我们需要些默认构造方法,你没写啊
这是面向对象部分讲的,您在回头好好看看。

你把Tset构造方法删除了,就缺少了带参数的构造方法,所以报错
回复 使用道具 举报
兄弟,  你是不是弄错了  我复制你代码到我开发软件上都可以正常运行
回复 使用道具 举报
代码有错误是绝对的,你的Test()类只有一个有参的构造函数. 你在主函数创建无参的构造函数肯定是错误的.
你可以在Test类中构造一个空参的构造函数来解决问题!     

第二个问题,
你把有参的构造函数删除了,就不能创建有参的对象了,你可以new Test();就没有问题了!
回复 使用道具 举报
有关类的构造函数:
1.如果一个类你不写构造函数,那么会隐式帮你加个空参数的构造函数;如果你显示写了构造函数,那么这个类的构造函数就是你写的那个或那些,即使这些构造函数中没有空参数构造函数也不会再帮你隐式加了。
2.子类的构造函数第一行会隐式加个super()调用父类的空参数构造函数;如果父类没有空参数的构造函数,子类的构造函数第一行要显示的使用 super(参数)来指定调用父类哪个构造函数,不然会编译报错。
回复 使用道具 举报 1 0
太粗心了你,就一个地方改一下就行了。看代码
  1. public class ThreadTest03
  2.                 {
  3.                        public static voidmain(String[] args)
  4.                        {
  5.                              //1.newTest没有分开写,应该改成new Test
  6.                                           Test t1 = newTest("One---");
  7.                               Test t2 = newTest("Two+++");
  8.                               t1.start();
  9.                               t2.start();
  10.                        }
  11.                 }
  12.                 class Test extends Thread
  13.                 {
  14.                         //privateString name;
  15.                        Test(String name)
  16.                        {
  17.                                //this.name = name;
  18.                               super(name);
  19.                        }
  20.                        public void run()
  21.                        {
  22.                               for (int i = 0; i< 10; i++)
  23.                               {
  24.                                      System.out.println(Thread.currentThread().getName()+"::"+i);
  25.                               }
  26.                        }
  27.                 }
复制代码

回复 使用道具 举报
天山 中级黑马 2014-4-16 22:06:42
7#
package com.itheima;
//可以了,有参,无参都可以
public class de_bug_16 extends Thread{
       
        private String name;
       
        public de_bug_16()
        {}

        public de_bug_16(String name)
        {
                this.name=name;
        }

        public void run() {
                for (int i = 0; i < 10; i++) {
                        System.out.println(Thread.currentThread().getName() +this.name+ "::" + i);
                }
        }
       
               

}



package com.itheima;

public class de_bug_17 {
        public static void main(String []args)
        {
                de_bug_16 fun1=new de_bug_16("One+++");
                de_bug_16 fun2=new de_bug_16("Two--");
                //de_bug_16 fun1=new de_bug_16();
                //de_bug_16 fun2=new de_bug_16();
                fun1.start();
                fun2.start();
        }

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马