引用:初始化和清理(之后再说清理)是涉及安全的两个重要问题。许多程序的错误都是由于忘记初始化变量。C++引入了构造器constructor,这是一个特殊方法:当创建对象是自动调用此方法。为了确保操作对象前,它已经初始化了,java也采用了构造器。
构造器又可以称为:构造函数、构造方法。
特点:
(1)方法名和类名相同;
(2)没有返回值,并不是返回值为空;
(3)每个类都至少有一个构造方法。
示例:
public class Animal{
Animal(){
System.out.println("Animal()");
}
}
Animal.java中Animal()就是一个构造方法。它与“每个方法首字母小写”的编码风格不同。
也许你可能会发现自己平常创建的一个类里面并没有构造方法,但这并不是上面第三个特点是错误的。
class Animal{}
public class Default{
public static void main(String[] args){
Animal d =new Animal();
}
}
Animal类中并没有构造器,但是newAnimal()创建了一个新对象。这是因为如果你写的类中没有构造器,编译器会自动帮你创建一个默认构造器。
默认构造器(又叫无参构造器)是没有形式参数的的构造器——它的作用是帮助我们创建一个对象。当我们显示的定义了一个构造器(不管是无参的还是有参的),编译器都不会再帮你自动创建默认构造器。
既然有构造器,当然也有 有参构造器了。
public class Animal{
String type;
int age;
Animal(){
System.out.println("Animal()");
}
Animal(string type){
this.type=type;
System.out.println("Animal(type)"+type);
}
Animal(int age){
this.age=age;
System.out.println("Animal(age)"+age);
}
Animal(string type,int age){
this.type=type;
this.age=age;
System.out.println("Animal()type"+type+"age"+age);
}
}
上面Animal类中有四个构造方法,(方法的重载)。我们可以根据不同的需求调用不同的构造方法,创建自己想要的对象。上述的方法我们可以在一个构造器中调用另一个构造器。我们可以这样:
Animal(string type,int age){
this(type);
//this(age); 在一个构造器中只能调用一个构造器,不能调用两个。
this.age=age;
//this(type);并且构造器必须置于最起始处,放在这里会编译出错的。
System.out.println("Animal()type"+type+"age"+age);
}
父类和子类构造器
先看一个例子:
class Person{
Person(){System.out.println("我是个人。");}
}
class Flower{
Flower(){System.out.println("我是一朵花。");}
}
class Man extends Person{
Man(){System.out.println("我是个帅哥。");}
}
public class Boy extends Man{
private Flower f =new Flower();
Boy(){System.out.println("我是个小男孩。");}
public static void main(String[] args){
new Boy();
}
}
输出:
我是个人。
我是个帅哥。
我是一朵花。
我是个小男孩。
上述代码调用构造器的顺序是:
1 调用基类构造器。这个步骤会不断反复递归下去。所以先输出的是Person中的内容然后是Man。
2 按声明顺序调用成员的初始化方法。初始化Flower输出“我是一朵花。”
3 调用导出类构造器的主体。
构造器的调用顺序非常重要。一定要记住。。。。
构造器和其他方法的区别:
1)构造器没有任何修饰符,方法又许多(final、public、protected等)。
2)返回类型也是非常重要的。方法能返回任何类型的值或者无返回值(void),构造器没有返回值,也不需要void。
3)两者的命名。构造器使用和类相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。