黑马程序员技术交流社区
标题:
构造方法问题
[打印本页]
作者:
て淡莣了陌生
时间:
2013-4-26 08:13
标题:
构造方法问题
本帖最后由 て淡莣了陌生 于 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中不是会有默认的无参构造吗,为什么编译这段代码的时候会报错呢???
作者:
李德全
时间:
2013-4-26 08:22
有了Teacher(String n){ name=n;},就不会有无参的构造了。你去看毕老师的视频第5天,08,构造函数6分30秒处
作者:
李德全
时间:
2013-4-26 08:24
李德全 发表于 2013-4-26 08:22
有了Teacher(String n){ name=n;},就不会有无参的构造了。你去看毕老师的视频第5天,08,构造函数6分30秒 ...
你要用 Teacher t=new Teacher();
就得定义一个无参的
作者:
郭登旭
时间:
2013-4-26 08:26
如果自定义了带参数的构造方法,那么java就不会提供默认的构造方法了,所以这时调用无参的构造方法就会报错,找不到这个构造方法。
作者:
harborbest
时间:
2013-4-26 08:33
构造函数的基本功能就是用来创建对象的,当你的自定义类里边没有构造函数的时候,jvm会默认的为你分配一个参数为空构造函数,当你自定义一个构造函数的时候,系统就不会再为你提供默认构造函数了。所以你这段代码要想创建无参对象,必须自己定义一个无参构造函数!
作者:
尹丽峰
时间:
2013-4-26 08:42
自定义构造函数后,在调用时候必须和你定义的一样,要么已重载形式出现也行。你可以在写一句 Teacher t=new Teacher(); 这个无参的 才可以
作者:
袁梦希
时间:
2013-4-26 09:00
当你定义了有参的构造函数,如果你想初始化无参的构造函数,就必须在该类中定义无参的构造方法。
发现子类构造函数运行时,先运行了父类的构造函数。为什么呢?
原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super();
super(): 表示父类的构造函数,并会调用于参数相对应的父类中的构造函数。而super():是在调用父类中空参数的构造函数。
为什么子类对象初始化时,都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个super()?)
因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。
作者:
董波
时间:
2013-4-26 11:49
创建一个类时,如果没有定义任何构造方法,jvm就会默认为你创建一个无参数的构造方法(这个无参数构造方法在代码中是看不到的)。
但是如果你在创建的类中定义了构造方法,不管你定义的构造方法是不是无参数的,jvm都不会再为你创建默认的无参数构造方法。
所以,因为在你的代码中创建了Teacher(String n)构造方法,jvm是不会再为你创建默认的无参构造方法的。这时,Teacher t=new Teacher()这行代码实际上是调用了一个不存在的方法,导致报错。
作者:
蔚蓝小嗨
时间:
2013-4-26 13:17
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数,当在类中自定义了构造函数后,默认的构造函数就没有了
作者:
白飞金
时间:
2013-4-26 19:45
对象一建立就会调用与之对应的构造函数。构造函数的作用:可以用于给对象进行初始化。
构造函数的小细节:
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。一个对象建立,构造函数只运行一次。
什么时候定义构造函数呢?当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
作者:
袁梦希
时间:
2013-4-26 20:06
楼主你好 如果构造方法的问题解决了 请把帖子的类型改为“已解决”{:soso_e181:}
作者:
花伟昌
时间:
2013-4-26 20:15
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中再创建一个无参数的构造函数。如上
作者:
黄玉昆
时间:
2013-4-26 23:25
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者:
崔龙飞
时间:
2013-4-27 00:33
---------- 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
没写任何构造方法时是有默认的方法,但写了哪怕是形参不一样,就没有默认的构造了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2