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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 泮和顺 中级黑马   /  2012-3-10 20:41  /  2259 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

倪鹏博 发表于 2012-3-10 20:44
默认构造函数是你没有自定义构造函数的时候才存在的!所以当你自定义了Person(String name)构造函数之后, ...

同意了,你没有构造函数的话系统才给你个无参数构造函数。。。你有了它就不给你了。。。
回复 使用道具 举报
本帖最后由 泮和顺 于 2012-3-11 08:26 编辑

public class  StudyTest
{
        public static void main(String[] args)
        {       
               
                Person p=new Person();
        }
}
class Person
{
        Person(String name)
        {
                this.name=name;

        }

         //method(){}

        private String name;
     
}//编译失败 提示错误参数不匹配 结论是至少有个构造函数,但是没有默认构造函数 这样就出错
但是所有类不是Object子类吗 不是可以继承Obect的默认构造函数吗 感觉真是特别的别扭啊

1突然想明白了 总结下,虽然所有类都是Object类的子类 但是构造函数是不能继承,因为类名字根本就不一样继承了还出错呢
2 没有默认无参构造并且其他构造函数系统会给你个(赋0,null等等),如果你自己随便写个不管带不带参数系统就不给你默认无参数

还有关于super只能放置块里面第一行。。(位于其他语句之后可能会出错)

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 倪鹏博 于 2012-3-10 20:45 编辑

默认构造函数是你没有自定义构造函数的时候才存在的——这是构造函数存在打前提条件,跟继承也是没关系的!所以当你自定义了Person(String name)构造函数之后,类中就没有默认构造函数了!而你new Person(),当然提示找不到构造函数啦!

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
其实JAVA在这里还是可以改进的,比如编译时期判断到底有没有空参构造函数,没有的话,不管程序员故意的还是无意的,一律自动补齐,这样程序员操心的事就更少了。
当然现在的情况是只要你定义了任意一个构造函数,就不会再替你定义这个空参构造函数了。
楼主还有一点认识是不对的,你想想如果构造函数能继承,那么继承的函数叫什么名字呢?叫Object()?
你不要忘记了构造函数是生成一个类的依据,你构造函数的名字和类的名字怎能不一致?
另外提醒,子类构造函数中默认自动添加的都是super()空参,你希望添加含参的自己动手。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
许圣建 发表于 2012-3-10 21:17
其实JAVA在这里还是可以改进的,比如编译时期判断到底有没有空参构造函数,没有的话,不管程序员故意的还是 ...

我说的Object是所有类的父类,
回复 使用道具 举报
子类的构造函数可以通过super关键字显式调用父类中的构造函数。如果子类中的构造函数没有显式调用父类中的构造函数,编译器就会自动在子类的构造函数中调用父类中参数为空的构造函数。于是,当父类中没有参数为空的构造函数,而子类中又没有显示调用父类的其他构造函数,编译时就会报错。这一点需要特别注意。默认构造函数是无参的,而你的代码中
        Person(String name)
        {
                this.name=name;
        }
相当于是对Person()进行了重载,Person()并不一样,所以编译时会出错
回复 使用道具 举报
不懂。还要学习!
回复 使用道具 举报
秦超 中级黑马 2012-3-11 16:55:22
8#
当你没有说些构造函数的时候,系统默认给你添加一个无参的构造函数,当你自定义构造函数的时候,系统就不再给你添加了.
你自定义的构造函数是有参数的,但是创建对象的时候是无参数的,所以提示找不到构造函数.
回复 使用道具 举报
你已经定义了一个带参数的构造方法,编译器就不会为你自动建立那个不带参数的默认构造方法了。
自己再写一个不带参数的构造方法吧。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马