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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 253663946 中级黑马   /  2016-4-9 22:35  /  6995 人查看  /  28 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
在本类自己定义了一个有参数构造函数,为什么还要定义一个空参数的构造函数呢?空参数的构造函数基本用不到,为什么还要多此一举啊?求大哥大家们解答,谢谢了哈!

最佳答案

查看完整内容

在学习阶段,一些练习的例子如果直接调用有参,的确是用不到空参的.但是,我们现在的学习是要为将来的开发打好基础.当你就业以后,真正接触到软件开发时,往往一个项目并不是你自己一个人在编写,当几个人一同编写同一项目时,你所写的代码是要为其他程序员负责的. 以你说的空参无用的问题为例,如果你感觉你写的构造函数中用不到空参,于是就把它省略掉,当其他程序员接过你写的代码部分时,他们是不知道这里没有设置空参的.如果接下来他们调 ...

28 个回复

倒序浏览
本帖最后由 1165046886 于 2016-4-9 23:32 编辑

在学习阶段,一些练习的例子如果直接调用有参,的确是用不到空参的.但是,我们现在的学习是要为将来的开发打好基础.当你就业以后,真正接触到软件开发时,往往一个项目并不是你自己一个人在编写,当几个人一同编写同一项目时,你所写的代码是要为其他程序员负责的.
以你说的空参无用的问题为例,如果你感觉你写的构造函数中用不到空参,于是就把它省略掉,当其他程序员接过你写的代码部分时,他们是不知道这里没有设置空参的.如果接下来他们调用了空参,就会造成BUG,有时候会很难发现.

所以,从现在开始,遵守编程规则,为未来的开发工作打好良好的基础,这是我们应该去努力做到的.

不知道能不能帮到你,这是宇波老师在课上讲到的.
回复 使用道具 举报
拿学生类举个例子,属性有name和age.
  1. Student s1 = new Student("小明",23);
复制代码

这是调用的有参构造,
但是人们有的习惯于先创建,在赋值
  1. Student s2 = new Student();//这句代码就是调用空参构造
  2. s2.name = "小红";
  3. s2.age = 24;
复制代码
回复 使用道具 举报
兄弟,明白了吗?
回复 使用道具 举报
构造函数主要用于为对象分配空间,进行初始化。构造函数除了具有一般成员函数的特征外,还具有一些特殊的性质:
(1)构造函数的名字必须与类名相同
(2)构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值由系统内部使用。
(3)构造函数是特殊的成员函数,函数体可写在类体内,也可写在类体外。
(4)构造函数可以重载,即一个类中可以定义多个参数个数或参数类型不同的构造函数。
(5)构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地调用,它是在定义对象的同时被调用的。
析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。析构函数有以下一些特点:
(1)析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);
(2)析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数;
(3)当撤消对象时,编译系统会自动地调用析构函数。

点评

好详细  发表于 2016-4-11 16:11
回复 使用道具 举报
有参数的可以给类里面的对象进行初始化。当你只是想用类的对象,而不需要对里面的数据进行初始话的时候就需要创建一个无参的构造函数。其实就是用来创建对象的。
回复 使用道具 举报
当你创建了一个有参的构造函数后,系统不再默认提供空参构造函数,因此当你用空参构造函数创建对象时就会报错了.(很多时候我们并不想要立即给成员变量初始化)
回复 使用道具 举报
首先,构造函数是为了个对象初始化的,有些你new对象的时候就给赋值了,有的你是先new出对象(没有进行赋值),之后通过setXX()方法为对象赋值的,这时候就需要通过空参进行创建对象了,这两个是不一样的.
希望你能理解
回复 使用道具 举报
AAAheilong 来自手机 中级黑马 2016-4-10 08:25:38
9#
253663946 发表于 2016-4-9 22:35
在本类自己定义了一个有参数构造函数,为什么还要定义一个空参数的构造函数呢?空参数的构造函数基本用不到, ...

简单的理解:1程序员间的规定,可能有人会用到无参构造2给对象进行初始化,开辟内存空间
回复 使用道具 举报
这个老师讲课的时候说好像是以后写代码的时候要是不写空参数的构造函数好像得报错!
回复 使用道具 举报
子类构造方法默认访问父类空仓构造的,冯大神建议永远自己给出空参构造
回复 使用道具 举报
可以不定义空参的 不定义就不能使用空参
回复 使用道具 举报
当你创建对象时,new 对象();括号里可以写参数,也可以不写,如果有参数,那么他会调用子类的有参构造方法,即把参数传递给子类有参构造,而系统默认的是当你想给子类初始化数据的时候,必须先给父类初始化数据,所以子类会调用父类的构造函数。    当你对象()里无参数,这时调用的是无参构造,子类父类有没有无参构造一样,即使你不写,系统会默认添加一个无参构造(super());当你对象()有参数时,传递给子类要看你super() 的形式了,可以super(参数)或者super();this.变量 = 变量,如果是super(参数),子类就会调用父类的有参构造,这时你父类没有无参构造也无影响,如果是第二种形式,那么他调用的会是父类的无参构造,父类就必须有无参构造,这时有参构造有没有无影响(当你定义了构造方法时,系统就不会再提供默认的无参构造),构造方法说白了,调用就是对应的,传递参数就调用子类有参构造,子类的super()形式决定你调用父类无参还是有参,也是对应的
回复 使用道具 举报
我们打代码规定就是子父类都定义有参和无参构造,这样调用不会出错,无论你怎么传递参数都可以
回复 使用道具 举报
a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
也就是有时候自己开始不知道要不要用空参构造,但是如果要用到的时候没有给空参构造就会报错
回复 使用道具 举报
如果我们没有给出构造方法,系统将自动提供一个空参构造方法。
如果我们给出了构造方法,系统将不再提供默认的空参构造方法。
注意:这个时候,如果我们还想使用空参构造方法,就必须自己给出。建议永远自己给出无参构造方法
也就是有时候自己开始不知道要不要用空参构造,但是如果要用到的时候没有给空参构造就会报错
回复 使用道具 举报
一般没有参构造是默认有空参构造的,有了有参构造之后会自动取消掉空参构造,但如果这时候要使用空参构造就很尴尬了,忘记了就会报错,所以一般都会自己加上一个空参构造
回复 使用道具 举报
一般没有参构造是默认有空参构造的,有了有参构造之后会自动取消掉空参构造,但如果这时候要使用空参构造就很尴尬了,忘记了就会报错,所以一般都会自己加上一个空参构造
回复 使用道具 举报
251855915 发表于 2016-4-9 22:52
拿学生类举个例子,属性有name和age.

这是调用的有参构造,

构造函数就是为了给对象初始化的啊,简化代码,既然有了有参数的,自己NEW对象的时候自然不会NEW空参的吧!
回复 使用道具 举报
worley 发表于 2016-4-9 23:01
构造函数主要用于为对象分配空间,进行初始化。构造函数除了具有一般成员函数的特征外,还具有一些特殊的性 ...

好复杂啊,我得好好理一理
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马