类的构造器是用来进行数据初始化的地方。
构造器比较特殊的地方是,它的名字和类名保持一致,且没有返回值(其他方法都是小写字母开头的,如果没有返回值,则将返回值类型设置为void)。
构造器的名字固定了,那么我们想要提供多种构造器怎么办呢?
那就需要进行重载了。所谓重载是指函数的方法名 返回值 访问权限等完全相同,不同的只是参数列表。
参数列表的不同包括:
- 参数个数不同
- 个数相同但类型不同
- 参数排列顺序不同(注意,这里的参数类型不能是同一种类型,那样顺序不同就没意义了,因为形参名不参与比较)
Java中,如果你不提供任何构造器,会自动生成一个无参构造器。但是,一旦你定义了任何一个构造器,java将不再自动添加无参构造器。
坑
当构造器参数是基本类型时,一定要注意了:
private JavaDoc(char a){
System.out.println("I am JavaDoc(char a)");
}
private JavaDoc(byte a){
System.out.println("I am JavaDoc(byte a)");
}
private JavaDoc(short a){
System.out.println("I am JavaDoc(short a)");
}
private JavaDoc(int a){
System.out.println("I am JavaDoc(int a)");
}
private JavaDoc(long a){
System.out.println("I am JavaDoc(long a)");
}
private JavaDoc(float a){
System.out.println("I am JavaDoc(float a)");
}
private JavaDoc(double a){
System.out.println("I am JavaDoc(double a)");
}
public static void main(String[] args){
new JavaDoc(1);
new JavaDoc('a');
new JavaDoc((byte)1);
new JavaDoc((short)1);
new JavaDoc((long)1);
new JavaDoc(1.0);
new JavaDoc((float)1.0);
new JavaDoc((double)1.0);
}
输出是:
I am JavaDoc(int a)
I am JavaDoc(char a)
I am JavaDoc(byte a)
I am JavaDoc(short a)
I am JavaDoc(long a)
I am JavaDoc(double a)
I am JavaDoc(float a)
I am JavaDoc(double a)
总结一下:
- 字面量整形值,会被自动提升为int类型
- 字面量浮点数,会被自动提升为double类型
- char类型比较特殊,如果能找到参数类型是char的构造器则调用它,否则被提升为整形(可以注掉那个构造器试试)
上面的情况是说被传递的值小于形参类型能支持的最大值。 那如果超过了呢? 答案是编译器报错