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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高海燕 黑马帝   /  2011-8-7 02:31  /  2357 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果在一个类中写了一个带参的构造函数,那么原来类中默认的无参构造函数还存在吗?

评分

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

查看全部评分

6 个回复

倒序浏览
黑马网友  发表于 2011-8-7 03:08:21
沙发
这个。。。你测试下就知道了,弄个有参的,然后看看能不能new个无参的对象。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 说的对。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-7 08:40:44
藤椅

无参构造方法的必要性

一个类可以有多个构造方法,只要它们的参数个数或类型不同即可。
public class Person
{
    String name;
     int    age;
   person()
       {
       }
   person(String name)
        {
           this.name=name;
        }
   person(String name,int age)
        {
            this.name=name;  
            this.age=age;
        }
}
类中写了一个带参数的构造方法,系统将不会为它创建无参的构造方法。
注意:子类在创建实例时,必先调用父类默认的构造方法(无参构造方法),如果父类只有带参数的构造方法,子类就会找不到父类默认的构造方法,使编译器报错。只要我们显示的定义父类的无参构造方法,这个问题就得到了解决。当然我们也可让子类指定用父类带参数的构造方法。

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 我很赞同

查看全部评分

回复 使用道具 举报
:) 如果你在类中不写构造函数、系统会隐式的为你提供一个无参的构造函数
:) 如果你在类中定义一个有参的构造函数、系统不会再提供一个无参的构造函数[code=java]package cn.itcast.heima
public class TestConstructor
{
        public String name;
        public int count;
        //提供自定义的构造器,该构造器包含两个参数
        public TestConstructor(String name , int count)
        {
                //构造器里的this代表它进行初始化的对象
                //下面两行代码将传入的2个参数赋给this代表对象的name和count属性
                this.name = name;
                this.count = count;
        }
        public static void main(String[] args)
        {
                //使用自定义的构造器来创建TestConstructor对象
                //系统将会对该对象执行自定义的初始化
                TestConstructor tc = new TestConstructor("中关村黑马程序员训练营" , 20000);

                //一旦程序员定义了自定义构造器,则系统不会提供默认的无参构造器,下面的代码报错
                //TestConstructor tc = new TestConstructor();


                //输出TestConstructor对象的name和count属性
                System.out.println(tc.name);
                System.out.println(tc.count);
        }
}[/code]通常建业为Java类保留无参的默认构造器,因为在类的反射应用中,如果是通过字节码直接new 对象的时候是调用类中的无参构造函数、如下程序就说明这一定

咱们使用如下代码来对上面定义的类进行反射操作:[code=java]package cn.itcast.heima

import java.lang.reflect.*;
public class Demo {
        public static void main(String[] args)throws Exception{

                //1、取得TestConstructor类的Class;
                Class clazz = Class.forName("cn.itcast.heima.TestConstructor");
                                
                //2、第一种方式取得TestConstructor类中的有参构造器,String.class,int.class代表参数列表类型
                //这种方式不必要求类中一定要存在无参的构造器,因为这里调用的自定义的有参构造器
                Constructor<TestConstructor> con = clazz.getConstructor(String.class,int.class);
                //3、通过取得的有参构造器进行创建对象
                TestConstructor tc = con.newInstance("中关村黑马程序员训练营",800000);
                System.out.println(tc);


                 //2、第二种方式直接通过TestConstructor的Class对象来创建对象,这个时候是调用类中的无参构造函数
                 //如果类中定义了有参构造器而没有提供无参构造器将会产生异常
                TestConstructor tc  = (TestConstructor)clazz.newInstance("中关村黑马程序员训练营",800000);
                System.out.println(tc);


        }
}[/code]这就是为什么我们在定义JavaBean的时候建业提供一个无参的构造函数的原因
[ 本帖最后由 詹季春 于 2011-08-07  09:25 编辑 ]

评分

参与人数 1技术分 +3 收起 理由
老罗 + 3 太强了。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-7 09:50:38
报纸
通常建议。。。而已,比如我自己写了个工具类,要传个对象进去作为引用,要不然就没法使用,如果我特意不弄个一无参的构造方法,使用者在创建对象的时候就必须放个参数进去,起到提醒作用

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-7 14:21:44
地板
如果你在类中定义一个有参的构造函数、系统就不会自动生成那个无参的构造函数了,就更谈不上去调用了,一般在写程序时,都是会自动写上那个无参的构造函数的

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-7 19:56:13
7#
有参无参是对构造函数的重载,应该根据程序需要来确定。缺省的无餐构造函数应该是IDE的特性功能。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马