# 深入构造器
[TOC]
## 概述
>[danger] 构造器的最大用处就是创建对象
如果在类中没有显式的定义一个构造器,则编译器在编译源文件时,会创建一个没有参数,没有方法体的空的构造器,**也就是说在一个类中至少会存在一个构造方法**。
正是因为有了这样一个构造器,所以在实例化一个对象的时候,采用“new 构造器()”的时候才不会有没有无参数构造方法的错误信息。
如果显式的定义了一个构造器,则上述空的构造器将不会存在。
**通过构造器为成员变量定义初始化值,这也是构造器的最最最重要的用途之一**
## 构造器重载
如果需要在构造器中调用另外一个构造器,可以使用this(param);
在构造器中调用构造器,必须把this(param)放在有效的执行语句的第一行,而且不允许出现两条this(param)语句。
~~~
public Demo() {
super();
}
public Demo(int age) {
this.age = age;
System.out.println("调用了含age的构造器");
}
public Demo(String name) {
this.name = name;
System.out.println("调用了含name的构造器");
}
public Demo(int age,String name) {
this(age);
this.name = name;
}
Demo demo = new Demo(10, "Tom");
~~~
构造器的重载的好处在于,可以再对象实例化的时候通过不同的构造方法来进行属性初始化内容的设置,减少setter()方法的应用,以实现简化代码的目的。
## 方法的签名
什么是方法的签名:方法的签名是由方法的方法名和形参列表(注意:包含方法的参数和类型)组成;
注意:**不包含返回值和访问修饰符的**。
~~~
public void say(String name,String sayWhat,int age) {
System.out.println(name + "在" + age + "岁时,说" + sayWhat);
}
public void say(int sayWhat,String name,int age) {
System.out.println(name + "在" + age + "岁时,说" + sayWhat);
}
~~~
## 重载
重载(overload):是让类以同一种的方式处理不同类型的数据的一种手段,实质上就是多个具有不同的参数个数或者类型的同名方法(返回值的类型可以随意,不能以返回值的类型作为重载函数的区分标准)。
重载是在一个类中,多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法)。
重载的规则:方法名必须相同,必须具有不同的参数列表;可以有不同的返回类型;可以有不同的访问修饰符;可以抛出不同的异常;
~~~
public void say(String name,String sayWhat,int age) {
System.out.println(name + "在" + age + "岁时,说" + sayWhat);
}
public String say(int sayWhat,String name,int age) {
System.out.println(name + "在" + age + "岁时,说" + sayWhat);
return "";
}
~~~
单类**中**的多态性:这边强调的是在一个类中,本质上是类中方法的多态性;