黑马程序员技术交流社区

标题: 关于构造函数的一个小疑问 求解大虾们 [打印本页]

作者: 于清云    时间: 2012-4-23 21:11
标题: 关于构造函数的一个小疑问 求解大虾们
一个类中如果自定义了构造方法,那么原先的默认的构造方法是不是还存在?
作者: 王运科    时间: 2012-4-23 21:36
默认的构造方法是无参数的,但是如果你已经在类里定义了一个或多个构造方法,那么JAVA就不会提供默认的构造方法了。如果已经在类里面建立了带参数的构造方法,还用默认的构造方法去创建对象的话,那就是非法语句了。(除非你自己定义了一个不带参数的构造方法)构造方法可以重载,所以你可以有多个构造方法。而且你至少有一个构造方法(在你不定义的时候,系统默认给出的一个)
例如:public class FileDemo{
        FileDemo(int n){
                System.out.println("b"+n);
        }
}

public class Hello {
    public static void main(String[] args) throws IOException{
           FileDemo fd=new FileDemo(4);  //在这里就会报错,因为类FileDemo只有带参数的构造函数,默认的无参数构造函数已不存在。
      }
}
作者: 施俊    时间: 2012-4-23 21:41
默认构造方法无参数,如果只定义了有参数的构造函数,那么原来默认的构造函数就不再存在。另外构造函数可以重载,也就是可以定义多个构造函数,其中可以包含无参数的也可以包含有参数的,此时有参无参的构造函数都可用。
作者: 龚正军    时间: 2012-4-23 21:58
可以肯定的说:绝对不存在了。
作者: 王敏NO.09    时间: 2012-4-23 22:10
如果自定义了构造方法,java就不会再默认构造方法
构造函数:
1、与类名相同的名称
2、没有返回值;
3、不可以写return语句。构造函数无需在程序中直接调用,而是在对象产生时自动执行,利用它来对对象的数据成员做初始化的赋值

作者: suiabing    时间: 2012-4-23 22:40
不存在的,如果我们没有给这个类添加构造函数,则java会自动给添加一个无参数构造函数的,看看 java多人性化啊!但是这个构造函数的函数体为空,不做任何事情。
前几天和工作的同学交流,他们说平时在写程序的时候应该保留默认的构造函数,即使我们有自己的构造函数,也是有必要的,设想一下,如果调用者忘了传参呢
,这不直接就挂了嘛!

回答了不少问题 还没得过分呢!!老师真忙啊



作者: 于清云    时间: 2012-4-24 07:53
王运科 发表于 2012-4-23 21:36
默认的构造方法是无参数的,但是如果你已经在类里定义了一个或多个构造方法,那么JAVA就不会提供默认的构造 ...

"FileDemo fd=new FileDemo(4);  //在这里就会报错,因为类FileDemo只有带参数的构造函数,默认的无参数构造函数已不存在。"
这里为什么会报错啊?默认的无参构造函数已不存在,可是你在这里创建对象fd的时候可是调用的带参的构造函数啊,应该不会报错才对 不是么?

作者: 于清云    时间: 2012-4-24 07:58
卡斯特隋隋隋 发表于 2012-4-23 22:40
不存在的,如果我们没有给这个类添加构造函数,则java会自动给添加一个无参数构造函数的,看看 java多人性 ...

呵呵 我也问了很多问题 都是我自己的疑问 不管问题难易怎么样 方正我不懂就是想问 也不嫌丢人 哈哈 老师也总忘了加分 不过没事 俺也不差那点分 早晚会很多的
作者: 王运科    时间: 2012-4-24 10:26
于清云 发表于 2012-4-24 07:53
"FileDemo fd=new FileDemo(4);  //在这里就会报错,因为类FileDemo只有带参数的构造函数,默认的无参数 ...

哈哈 不好意思啊  这里不会报错的  如果调用无参数的会报错了。
作者: 韩新凯    时间: 2012-4-24 12:06
当然不存在了
作者: 毕博    时间: 2012-4-24 12:36
不会存在的   写个小例子 如下
public class Test{
public int x;
public String y;

public static void main(String[] args){
  Test test = new Test();
  System.out.println("x = "+test.x);
  System.out.println("y = "+test.y);
}
}

保存为Test.java

这里并没有声名构造方法,所以它存在着默认的构造方法.

用javac Test.java 命令将其编译,得到Test.class文件!

然后用java Test 命令将其执行,输出的结果为:

x = 0
y = null

然后用javap Test 命令将Test.class文件反编译,得到如下结果:

public class Test extends java.lang.Object{
    public int x;
    public java.lang.String y;
    public Test();
    public static void main(java.lang.String[]);
}

可以看到,在类中多出来一个构造方法public Test();

但是这个构造方法并没有方法体,

所以,变量的初始化并不是构造函数执行的!!

而且当我自定义一个构造函数后,默认的构造函数也就消失了,又如何为变量初始化?

变量的初始化是在类被装载的时候自动初始化的!!
作者: 彭威    时间: 2012-4-24 13:13
    系统默认的构造方法是无参数的,但是如果你已经在类里定义了构造方法,那么JAVA就不会提供默认的构造方法。
如果已经在类里面建立了带参数的构造方法,还用默认的构造方法去创建对象的话,那就是非法语句的,
你可以 在里面重载多个不同参数变量的 构造方法。




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