情不知所起,一往而深。恨不知所踪,一笑而泯。

构造函数心得分享

源代码:

 package com.ryze.struct.test;  
public class Struct {  
    public static int i = 0;  
    public static void main(String[] args) {  
        A a1 = new A();  
        A a2 = new A("瑞兹","啦啦啦德玛西亚");  
        B b1 = new B();  
        B b2 = new B("法师","男");  
    }  
 
}  
 
class A{  
      
    String userName;  
    String passWord;  
    public A(){  
        System.out.println("A的无参构造函数第"+Struct.i+"次调用"+"\n");  
        Struct.i++;  
    }  
      
    public A(String name,String pword){  
        this.userName = name;  
        this.passWord = pword;  
        System.out.println("A的有参构造函数:\n"+"  "+"用户名:"+userName+"\n"+"   "+"密码:  "+passWord+"\n");  
    }  
}  
 
class B extends A{  
      
    String identity;  
    String sex;  
      
    public B(){  
        System.out.println("B的无参构造函数"+"\n");  
    }  
      
    public B(String id,String sex){  
        this.identity = id;  
        this.sex = sex;  
        System.out.println("B的有参构造函数:\n"+"   "+"性别:"+sex+"\n"+"   "+"身份:"+identity+"\n");  
    }  
}

运行结果:

A的无参构造函数第0次调用  
 
A的有参构造函数:  
  用户名:瑞兹  
   密码:  啦啦啦德玛西亚  
 
A的无参构造函数第1次调用  
 
B的无参构造函数  
 
A的无参构造函数第2次调用  
 
B的有参构造函数:  
   性别:男  
   身份:法师

        说明了创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。

        详细说明:

        1、如果程序员没有给类A提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不在提供默认的无参数构造函数。

        2、子类B实例化时会自动调用父类A的默认构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供了其他类型的构造函数,编译器同样会报错,因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数。

        3、在B的构造函数中显示的调用父类A的有参构造函数super(parameter);

联系我们 联系人:Neal Zhang 联系邮箱:master@pplns.com
© 2017 pplns.com 版权所有.