黑马程序员技术交流社区

标题: 关于构造函数的问题 [打印本页]

作者: 高海燕    时间: 2011-8-7 02:31
标题: 关于构造函数的问题
如果在一个类中写了一个带参的构造函数,那么原来类中默认的无参构造函数还存在吗?
作者: 匿名    时间: 2011-8-7 03:08
这个。。。你测试下就知道了,弄个有参的,然后看看能不能new个无参的对象。
作者: 匿名    时间: 2011-8-7 08:40
标题: 无参构造方法的必要性
一个类可以有多个构造方法,只要它们的参数个数或类型不同即可。
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;
        }
}
类中写了一个带参数的构造方法,系统将不会为它创建无参的构造方法。
注意:子类在创建实例时,必先调用父类默认的构造方法(无参构造方法),如果父类只有带参数的构造方法,子类就会找不到父类默认的构造方法,使编译器报错。只要我们显示的定义父类的无参构造方法,这个问题就得到了解决。当然我们也可让子类指定用父类带参数的构造方法。
作者: 詹季春    时间: 2011-8-7 09:22
:) 如果你在类中不写构造函数、系统会隐式的为你提供一个无参的构造函数
:) 如果你在类中定义一个有参的构造函数、系统不会再提供一个无参的构造函数[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 编辑 ]
作者: 匿名    时间: 2011-8-7 09:50
通常建议。。。而已,比如我自己写了个工具类,要传个对象进去作为引用,要不然就没法使用,如果我特意不弄个一无参的构造方法,使用者在创建对象的时候就必须放个参数进去,起到提醒作用
作者: 匿名    时间: 2011-8-7 14:21
如果你在类中定义一个有参的构造函数、系统就不会自动生成那个无参的构造函数了,就更谈不上去调用了,一般在写程序时,都是会自动写上那个无参的构造函数的
作者: 匿名    时间: 2011-8-7 19:56
有参无参是对构造函数的重载,应该根据程序需要来确定。缺省的无餐构造函数应该是IDE的特性功能。




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