:) 如果你在类中不写构造函数、系统会隐式的为你提供一个无参的构造函数
:) 如果你在类中定义一个有参的构造函数、系统不会再提供一个无参的构造函数[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 编辑 ] |