黑马程序员技术交流社区

标题: 构造函数 [打印本页]

作者: 黑马罗坚    时间: 2012-4-17 14:53
标题: 构造函数
构造函数为了实例化类而存在 没构造函数类将不能被实例化 可以重载 当类里没构造函数系统会自动帮你添加默认构造函数 当你写了构造函数 系统不会帮你添加已你写的为主。
当类被实例化时每个构造函数最多只运行一次 最少运行一次构造函数
构造函数语法格式 访问修饰符 类名 函数体 函数体不能被省略
当所有构造函数被私有化时不能在外部类初始化该类只能在类内部初始化该类
初始化一个类需先初始化成员属性 初始化一个子类须先初始化父类
调用语句语法格式 this(参数列表);
该语句只能在构造函数里面使用而且必须在地一行使用 不能在成员方法里使用
构造函数不能被递归  构造函数之间不能相互被调用这样防止进入循环调用 如构造函数2调用构造函数1可以但是同时构造函数1调用构造函数2就报错  又如构造函数1和2调用构造函数3可以 但同时构造函数3调用构造函数1或2 就报错
  1. public class Demo{
  2. public Demo(){
  3.      //this(1);  编译通不过 互相调用如果把this();注释掉就可通过  
  4.     this(1,true); //通过  第一行被注释所以它在地一行
  5. }
  6. public Demo(int i){
  7.     this(); //单项调用 编译通过
  8. }
  9. public Demo(int i,boolean f){
  10.       this(true,2); //编译通过
  11. }
  12. public Demo(boolean f,int i){
  13. }    //Demo(1); 这里随便调用哪个构造方法会造成构造方法循环调用所以编译通不过。。
  14. }
复制代码


作者: 吴文华    时间: 2012-4-17 17:04
调用语句语法格式 this(参数列表);
该语句只能在构造函数里面使用而且必须在地一行使用。
这是一个规定,但细想我们觉得有道理。如下:
class Student
{
   Student()
{
}
Student(String name)
{
this.name="haha";
}
Student(String name,String age)
{
this.name=name;
this(name);
this.age=age;
}
}
你看上面的例子,如果我创建了一个对象:Student ss=new Student("java","2");
这时候构造函数先执行下面代码中的this:
Student(String name,String age)
{
this.name=name;
this(name);
this.age=age;
}
后来有调用构造函数this(name);把值又改成了haha,这就使得name出错。
所以,该语句只能在构造函数里面使用而且必须在地一行使用。
作者: 吴文华    时间: 2012-4-17 17:10
再来说说这段代码:
01.public class Demo{

02.public Demo(){

03.     //this(1);   // 这里为什么通不过,是因为当你创建了一个对象:Demo d=new Demo();对象初始化的时候,先运行这句,后来又去调用Demo(int i)构造函数,而Demo(int i)函数又调用Demo();而后Demo()又去调用Demo(int i),这两个人玩上了,还有你什么事,所以编译通不过。

04.    this(1,true); //

05.}

06.public Demo(int i){






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