构造器也叫构造方法(constructor),用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。
声明格式:
[修饰符] 类名(参数列表){
//n条语句
}
一、构造方法
1、构造器也叫构造方法(constructor),用于对象的初始化。
注:构造器也是方法,方法的特性也适用于构造方法。
要点:
1、通过new关键字调用;
2、构造器虽然有返回值,但是 不能定义返回值类型(返回值类型肯定是本类),
不能在构造器里使用return返回某个值;
3、如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数;
如果已定义则编译器不会自动添加;
4、构造器的方法名必须和类面一致。
2、例子如下:
/**
* @ClassName: point
* @Description: TODO(点类,用来描述二维的一个点)
*/
class Point{
double x, y; //类型相同,一行可以命名多个成员变量,命名坐标x和y
//这是一个构造方法,构造方法名称必须和类名保持一致
public Point(double _x, double _y) { //若写double x, double y。 则需要使用this关键字进行区别
x = _x;
y = _y;
return; //此处return只代表结束方法的运行,不代表有返回值,可以不写
}
/**
* @Title: getDistance
* @Description: TODO(测量距离的方法)
*/
public double getDistance(Point p) { //把另一个点传进来
return Math.sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y)); //Math的开方函数sqrt()
}
}
/**
* @ClassName: TestConstructor
* @Description: TODO(测试构造器(构造方法))
*/
public class TestConstructor {
/**
* @Title: main
*/
public static void main(String[] args) {
//新建对象调用构造方法,把3.0、4.0传给了构造方法,通过构造器把3.0、4.0传给了Point类的属性
Point p =new Point(3.0, 4.0);
//原点origin,调用构造方法创建了新的对象
Point origin = new Point(0.0, 0.0);
//打印p.getDistance(origin),算两点的距离
System.out.println(p.getDistance(origin));
}
}
运行结果:
3、雷区:
对象的创建完全是由构造方法实现的吗?
构造方法是java创建对象的重要途径。通过new关键字调用构造器时,构造器也确实返回了该类对象但这个对象并不完全由构造器负责创建的。
创建一个对象分如下四步:
1、分配对象空间,并将对象成员变量初始化为0或空;
2、执行属性值的显示初始化;
3、执行构造方法;
4、返回对象的地址给相关的变量。
二、构造方法的重载
1、构造方法也是方法,只不过有特殊的作用而已,与普通方法一样,构造方法也可以重载。
注:构造方法经常需要重载。
方法的重载:方法名称相同,参数列表不同。
2、例子如下:
/**
* @ClassName: User
* @Description: TODO(构造方法的重载)
*/
public class User {
int id; //id
String name; //账户名
String pwd; //密码
public User(){
}
public User(int id, String name) {
//super(); //构造方法的第一句总是super(),可以去掉,编译器会自动给
//右侧这个id用的是public User方法里的局部id,就近原则,谁离得近用谁,而不是成员变量int id
this.id = id;
//this表示创建好的对象,this.name表示的是属于public class User的成员变量String name,右侧的name是局部变量,就近原则
this.name = name;
}
public User(int id, String name, String pwd) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
}
/**
* @Title: main
* @Description: TODO(主函数 构造方法的重载)
*/
public static void main(String[] args) {
User u1 = new User();
User u2 = new User(11, "Charlie");
User u3 = new User(11, "Charlie", "123");
}
}
3、雷区:
如果方法构造中形参名与属性名相同时,需要使用this关键字区分属性与形参,如上例所示:
this.id表示属性id,id表示形参id。