Java通过构造方法(构造器)来确保对象的初始化
当创建对象时,jvm会为对象分配内存空间,并调用对应构造方法.确保了在操作对象前对象已经被初始化了.一般来说,创建和初始化是彼此独立的概念.但是在Java中,初始化和创建捆绑在一起,两者不能分离.
接下来的问题是如何给这个方法命名,这里存在两个问题,一是构造方法的名字不能与类的成员的名字冲突.二是如何让编译器知道调用哪个方法.Java采用了与C++相同的方案,即构造器的名称与类名相同.
不接受任何参数的构造器叫做默认构造器,有时候也叫做无参构造器.如果在Java类中没有定义任何构造器,那么编译器会自动创建一个默认构造器.
方法重载
Java支持重载方法一项原因是就是构造方法.我们知道构造方法只有一个确定名字,即类名.那么想要多种方式创建一个对象就要用到方法重载了.
尽管重载方法是构造器所必须的,但是用在其他方法上也是同样方便的
区分重载方法
既然方法的名称相同,那么Java是如何区分方法的呢?其实规则很简单:每个重载方法都必须有有个独一无二的参数类型列表.
除了参数类型的差异外,参数顺序也足以区分两个方法,不过一般情况下不要这么做,因为这样会使代码变得难以维护.
涉及到基本类型的重载
基本类型能从一个较小的类型提升到一个较大的类型(如int提升到long),此过程一旦涉及到重载,可能会操作一些混淆,当调用方法时,没有方法匹配传入的数据类型(实际参数的类型),会将传入参数提升到较大的类型进行匹配
我们看一个例子
public class Test{
void f(float x){ System.out.println("f5(float)");}
void f(long x){ System.out.println("f5(long)");}
void f(double x){ System.out.println("f5(double)");}
public static void main(String[] args) {
Test test = new Test();
test.f(5);
}
}
output:
f(long)
char类型的参数是个例外,如果没有找到匹配char类型参数的方法,会先将char类型转换为int.