黑马程序员技术交流社区

标题: 关于构造函数的那些事! [打印本页]

作者: 253663946    时间: 2016-4-9 22:35
标题: 关于构造函数的那些事!
在本类自己定义了一个有参数构造函数,为什么还要定义一个空参数的构造函数呢?空参数的构造函数基本用不到,为什么还要多此一举啊?求大哥大家们解答,谢谢了哈!
作者: 1165046886    时间: 2016-4-9 22:35
本帖最后由 1165046886 于 2016-4-9 23:32 编辑

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

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

不知道能不能帮到你,这是宇波老师在课上讲到的.

作者: 251855915    时间: 2016-4-9 22:52
拿学生类举个例子,属性有name和age.
  1. Student s1 = new Student("小明",23);
复制代码

这是调用的有参构造,
但是人们有的习惯于先创建,在赋值
  1. Student s2 = new Student();//这句代码就是调用空参构造
  2. s2.name = "小红";
  3. s2.age = 24;
复制代码

作者: 251855915    时间: 2016-4-9 22:54
兄弟,明白了吗?
作者: worley    时间: 2016-4-9 23:01
构造函数主要用于为对象分配空间,进行初始化。构造函数除了具有一般成员函数的特征外,还具有一些特殊的性质:
(1)构造函数的名字必须与类名相同
(2)构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值由系统内部使用。
(3)构造函数是特殊的成员函数,函数体可写在类体内,也可写在类体外。
(4)构造函数可以重载,即一个类中可以定义多个参数个数或参数类型不同的构造函数。
(5)构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地调用,它是在定义对象的同时被调用的。
析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。析构函数有以下一些特点:
(1)析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);
(2)析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数;
(3)当撤消对象时,编译系统会自动地调用析构函数。
作者: yangxiong    时间: 2016-4-9 23:10
有参数的可以给类里面的对象进行初始化。当你只是想用类的对象,而不需要对里面的数据进行初始话的时候就需要创建一个无参的构造函数。其实就是用来创建对象的。
作者: lqqwqq    时间: 2016-4-9 23:34
当你创建了一个有参的构造函数后,系统不再默认提供空参构造函数,因此当你用空参构造函数创建对象时就会报错了.(很多时候我们并不想要立即给成员变量初始化)
作者: 改变自己、    时间: 2016-4-9 23:48
首先,构造函数是为了个对象初始化的,有些你new对象的时候就给赋值了,有的你是先new出对象(没有进行赋值),之后通过setXX()方法为对象赋值的,这时候就需要通过空参进行创建对象了,这两个是不一样的.
希望你能理解
作者: AAAheilong    时间: 2016-4-10 08:25
253663946 发表于 2016-4-9 22:35
在本类自己定义了一个有参数构造函数,为什么还要定义一个空参数的构造函数呢?空参数的构造函数基本用不到, ...

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

这是调用的有参构造,

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

好复杂啊,我得好好理一理
作者: 253663946    时间: 2016-4-11 10:04
yangxiong 发表于 2016-4-9 23:10
有参数的可以给类里面的对象进行初始化。当你只是想用类的对象,而不需要对里面的数据进行初始话的时候就需 ...

有了有参数的构造函数创建对象的时候肯定使用有参数的构造函数了,设置有参数的构造函数就是为了方便对象初始化,简化书写的嘞
作者: 253663946    时间: 2016-4-11 10:06
1165046886 发表于 2016-4-9 23:26
在学习阶段,一些练习的例子如果直接调用有参,的确是用不到空参的.但是,我们现在的学习是要为将来的开发打好 ...

哥们说的好,工作的时候写的代码不单单是自己的,而是整个团队的,有些功能确实要顾及到大家.哈哈.谢谢了
作者: 253663946    时间: 2016-4-11 10:08
lqqwqq 发表于 2016-4-9 23:34
当你创建了一个有参的构造函数后,系统不再默认提供空参构造函数,因此当你用空参构造函数创建对象时就会报错 ...

嗯呢,明白了
作者: 253663946    时间: 2016-4-11 10:10
丶半度微凉 发表于 2016-4-10 22:49
我们打代码规定就是子父类都定义有参和无参构造,这样调用不会出错,无论你怎么传递参数都可以 ...

这是一个好习惯
作者: 253663946    时间: 2016-4-11 10:11
丶半度微凉 发表于 2016-4-10 22:46
当你创建对象时,new 对象();括号里可以写参数,也可以不写,如果有参数,那么他会调用子类的有参构造方 ...

恩恩.谢谢啦
作者: 啊海    时间: 2016-4-11 13:41
简单理解就是空参是用来初始化的,而有参构造是用来传参的
作者: 大熊猫丶    时间: 2016-4-11 19:50
构造函数就是为了给对象初始化的啊,简化代码,既然有了有参数的,自己NEW对象的时候自然不会NEW空参的吧!
作者: fighting2016    时间: 2016-4-11 22:57
简单粗暴的说:
不用有参的时候,空参可以不写,系统默认有空参;
用有参的时候,必须自己给出空参.
这是java的语法规则,人为规定的!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2