一.构造函数的规则
1.构造方法是用来在对象实例化时初始化对象的成员变量的,以完成对象的初始化工作。
2.构造方法与类名相同且没有返回值(返回值也不能为void型)。如:public 构造方法名( ) { }
3.构造方法和new一起操作,在对象实例化时被系统自动调用,且只运行一次,不能被对象直接调用。
4.当没有自定义构造方法时,系统会自动添加无参的构造方法。
5.当有自定义构造方法,无论是有参、无参的构造方法,系统都不会再自动添加无参的构造方法。
6.构造方法不能被继承,因此,它不能被重写,但是能被重载,可以定义多个不同的参数个数或参数类型的构造方法。
7.当有父类时,子类在实例化对象时,会先执行父类的构造方法,然后执行子类的构造方法。其中,父类的构造方法可以有0个或多个。
(1)如果父类没有写构造方法,子类可以写super();也可以不写(系统会默认调用super();)。
(2)如果父类写了一个无参构造方法和多个有参构造方法,子类会默认调用无参构造方法,如果想调用某个有参构造方法,需在第一行写上super(参数);进行显式调用。
(3)如果父类有有参构造方法,却没有无参构造方法,子类必须在第一行显示地用super(参数);去调用。
(4)如果父类和子类都没有写构造函数,编译器会为父类和子类分别生成一个默认的无参构造函数。默认构造函数的修饰符只跟当前类的修饰符有关(如一个类被定义为public,那么它的构造方法也是public)。
二.this关键字
类的成员属性和方法,是提供了一个模子,设定有哪些东西。用此类实例化一个对象,那么此对象就具备了这些属性和方法。带参构造方法,即把参数值赋值给这个类的成员属性,该对象具有了当前属性值,如果类的成员属性名与带参构造方法的参数名相同,那么由于就近原则,参数值赋值不到成员属性那里。
public class Constructor { String name; public Constructor(String name){ this.name=name; //如果这里用name=name;就近原则,参数值赋给了局部变量name,但是成员属性name不会被赋值,对象的属性值为null } public static void main(String[] args){ Constructor c=new Constructor("小c"); System.out.println(c.name); } } //结果:小c
this在类中代表当前对象,可通过this 关键字完成当前对象的成员属性、成员方法和构造方法的调用。如:this.name=name; this.method(); this();
this();//表示调用本类中的无参构造方法,可在有参构造方法中被调用,即构造方法间可互相调用,但构造方法不能在普通方法中被调用,普通方法可以在构造方法中被调用,可以用this.method();也可以method();。
super(); //调用父类的无参构造函数
this();和super();均只能放在构造方法第一行。
例1
public class Test { String name; public Test(){ System.out.println("父类的无参构造方法"); } public Test(String name){ this.name=name; System.out.println(name+"的有参构造"); } } public class ChildTest extends Test { public static void main(String[] args){ ChildTest c=new ChildTest(); System.out.println(c.name); } public ChildTest(){ super("父类"); System.out.println("子类无参构造方法"); } } //运行结果: 父类的有参构造 子类无参构造方法 父类
子类继承了父类的属性,对象有其属性值。
例2
public class Test { public Test(){ System.out.println("construct"); } public void Test(){ System.out.println("call Test"); } public static void main(String[] args){ Test t=new Test(); //调用构造函数 t.Test(); //调用Test方法 } } //运行结果 construct call Test
普通方法可以与构造方法同名,但建议不要将类名作为普通方法名。