Java基础笔记(十四)——面向对象(续)【构造方法和this关键字】

时间:2022-05-31 00:43:39

一.构造函数的规则

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

普通方法可以与构造方法同名,但建议不要将类名作为普通方法名。