一.构造函数的规则
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
普通方法可以与构造方法同名,但建议不要将类名作为普通方法名。
this小结:
Java中,this用来指向当前实例对象,它区分了对象的成员变量与方法的形参,当一个方法的形参与成员变量的名字相同时,就会覆盖成员变量。(就近原则)
构造方法:
创建对象时,如Animal one=new Animal(); 或者Animal one = new Animal("one",2);
相应的会选择调用无参构造方法或者有参构造方法,构造方法都是用来初始化对象的,有参构造方法的参数作用可以把对象的实参传给形参,形参值赋值给成员属性,使得当前对象拥有赋值后的属性值。成员属性是这个类共同拥有的,该类实例化对象后,把值赋值给成员属性,当前对象即拥有赋值后的属性值。