黑马程序员技术交流社区
标题:
关于构造函数的问题
[打印本页]
作者:
高海燕
时间:
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