黑马程序员技术交流社区
标题: 关于构造函数的问题 [打印本页]
作者: 创造命运 时间: 2014-4-16 21:01
标题: 关于构造函数的问题
本帖最后由 创造命运 于 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类里有带参数的构造方法啊!
作者: 雨落千木的时节 时间: 2014-4-16 21:14
如果在类里面自己定义了构造方法,原来默认的构造函数就没有了,这里我们需要些默认构造方法,你没写啊
这是面向对象部分讲的,您在回头好好看看。
你把Tset构造方法删除了,就缺少了带参数的构造方法,所以报错
作者: 程序爱好者 时间: 2014-4-16 21:21
兄弟, 你是不是弄错了 我复制你代码到我开发软件上都可以正常运行
作者: 悠然丶 时间: 2014-4-16 21:35
代码有错误是绝对的,你的Test()类只有一个有参的构造函数. 你在主函数创建无参的构造函数肯定是错误的.
你可以在Test类中构造一个空参的构造函数来解决问题!
第二个问题,
你把有参的构造函数删除了,就不能创建有参的对象了,你可以new Test();就没有问题了!
作者: ithmC4 时间: 2014-4-16 21:43
有关类的构造函数:
1.如果一个类你不写构造函数,那么会隐式帮你加个空参数的构造函数;如果你显示写了构造函数,那么这个类的构造函数就是你写的那个或那些,即使这些构造函数中没有空参数构造函数也不会再帮你隐式加了。
2.子类的构造函数第一行会隐式加个super()调用父类的空参数构造函数;如果父类没有空参数的构造函数,子类的构造函数第一行要显示的使用 super(参数)来指定调用父类哪个构造函数,不然会编译报错。
作者: ╰青青子佩ˊゝ 时间: 2014-4-16 21:51
太粗心了你,就一个地方改一下就行了。看代码
- public class ThreadTest03
- {
- public static voidmain(String[] args)
- {
- //1.newTest没有分开写,应该改成new Test
- Test t1 = newTest("One---");
- Test t2 = newTest("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);
- }
- }
- }
复制代码
作者: 天山 时间: 2014-4-16 22:06
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();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |