jimingminlovefly

统计

最新评论

Java默认构造函数的作用

当new一个对象时,先判断是否调用的构造函数有参数,
如果有参数,则根据参数的个数、类型来自动调用相应
的构造函数构造对象,分配内存,并返回对象的引用。

“如果定义了一个带参数的构造方法后,就一定要定义一个
不带参数的构造方法,否则就不能创建新对象(无参数)。”
因为当构造一个类的对象时,编译器首先判断类是否有
构造函数,如果没有,则自动加上一个默认构造函数,
而一旦发现有构造函数后,则不再自动加上构造函数。
转而认为你没有用类的合法的构造函数而报出编译错误。

class Person
{
private String name="";
private int age=0;

public Person()
{
   System.out.println("person无参数构造函数");
}

public Person(String name,int age)
{
   this.name=name;
   this.age=age;
   System.out.println("person 2 参数的构造函数");  
}
}

class Student extends Person
{

private String school;
private String grade;

public Student()
{
   System.out.println("student 无参数的构造函数");
}

public Student(String name ,int age,String school)
{
   System.out.println("student 3 参数的构造函数");
}
    public   Student(String name ,int age,String school,String grade)
{
   super(name,age);
   this.school=school;
   this.grade=grade;
   System.out.println("student 4 参数的构造函数,super().");
}
}

class Test
{
public static void main(String [] args)
{
   System.out.println("st1:");
   Student st2=new Student();
      System.out.println("---------------------------");
     
   System.out.println("st2:");
   Student st=new Student("zhangshan",76,"武大");
   System.out.println("---------------------------");
  
   System.out.println("st3:");
   Student st3=new Student("lisi",24,"武大","研究生");

}

/*
=======================================
输出如下:

E:JavaWork>java Test
st1:
person无参数构造函数
student 无参数的构造函数
---------------------------
st2:
person无参数构造函数
student 3 参数的构造函数
---------------------------
st3:
person 2 参数的构造函数
student 4 参数的构造函数,super().

**************************************

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

=============================================

我们假设A是B的父类,B是A的子类。

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

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

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

posted on 2012-04-17 11:32 计明敏 阅读(746) 评论(0)  编辑  收藏 所属分类: j2se


只有注册用户登录后才能发表评论。


网站导航: