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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于清云 中级黑马   /  2012-4-23 21:11  /  3109 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个类中如果自定义了构造方法,那么原先的默认的构造方法是不是还存在?

12 个回复

倒序浏览
默认的构造方法是无参数的,但是如果你已经在类里定义了一个或多个构造方法,那么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只有带参数的构造函数,默认的无参数构造函数已不存在。
      }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
默认构造方法无参数,如果只定义了有参数的构造函数,那么原来默认的构造函数就不再存在。另外构造函数可以重载,也就是可以定义多个构造函数,其中可以包含无参数的也可以包含有参数的,此时有参无参的构造函数都可用。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
可以肯定的说:绝对不存在了。
回复 使用道具 举报
如果自定义了构造方法,java就不会再默认构造方法
构造函数:
1、与类名相同的名称
2、没有返回值;
3、不可以写return语句。构造函数无需在程序中直接调用,而是在对象产生时自动执行,利用它来对对象的数据成员做初始化的赋值

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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

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


评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
笨笨熊 + 1 革命尚未成功同志继续努力
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
王运科 发表于 2012-4-23 21:36
默认的构造方法是无参数的,但是如果你已经在类里定义了一个或多个构造方法,那么JAVA就不会提供默认的构造 ...

"FileDemo fd=new FileDemo(4);  //在这里就会报错,因为类FileDemo只有带参数的构造函数,默认的无参数构造函数已不存在。"
这里为什么会报错啊?默认的无参构造函数已不存在,可是你在这里创建对象fd的时候可是调用的带参的构造函数啊,应该不会报错才对 不是么?
回复 使用道具 举报
卡斯特隋隋隋 发表于 2012-4-23 22:40
不存在的,如果我们没有给这个类添加构造函数,则java会自动给添加一个无参数构造函数的,看看 java多人性 ...

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

哈哈 不好意思啊  这里不会报错的  如果调用无参数的会报错了。
回复 使用道具 举报
当然不存在了
回复 使用道具 举报
不会存在的   写个小例子 如下
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();

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

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

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

变量的初始化是在类被装载的时候自动初始化的!!
回复 使用道具 举报
    系统默认的构造方法是无参数的,但是如果你已经在类里定义了构造方法,那么JAVA就不会提供默认的构造方法。
如果已经在类里面建立了带参数的构造方法,还用默认的构造方法去创建对象的话,那就是非法语句的,
你可以 在里面重载多个不同参数变量的 构造方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马