什么是构造函数?
构造函数 是一种特殊的方法,主要用来在创建对象时初始化对象。
为什么需要构造函数?
构造函数是完成对象的初始化,这个当然可以定义一个成员方法予以实现。但是这个方法必须显式调用,否则就可能因未初始化出现错误。我们希望这样的方法能够被自动调用,能被自动调用,那么它的名字一定是独一无二的,什么样的名字才是独一无二的呢?——以类名作为方法名。这就是构造函数。
构造函数,是在对象实例化时自动被系统调用,该函数名必须独一无二。对于一个类来说,就是将一个类名作为函数名。
构造函数不需要程序员去定义返回值,他是系统自动决定的,void也不行。
构造函数无法、也无需指定指定返回值,它是自动被调用的。
函数重载 多个函数使用同一个函数名,系统根据参数自动调用相应的函数。
函数重载解决了标识符统一的问题。
拷贝构造函数 用一个已经存在的本类的对象去复制新的对象
垃圾回收:所谓的“垃圾”是指之前系统分配的内存单元,但是现在没用了,
再具体的讲,就是没有引用指向它。对于“垃圾”来讲,程序员不需要自己去回收,而是系统提供的垃圾回收机制自动回收,
当程序员觉得有必要时,也可以强制让系统回收。
让我们用代码来理解一下
坐标类:判断圆是否相离,相切,相交
public class Point {
private double x;//横坐标
private double y;//纵坐标
//两个方法名都是init,但是参数不同,这个叫做函数重载。
//构造函数
public Point(){
x = 0;
y = 0;
}
public Point(double x,double y){
//这里有两个x,一个是数据成员x,一个是形参x
//前者在类的整个内部有效
//后者只在当前这个函数中有效
//当两者冲突时默认指的是行参x
//如果要访问前者得用this.x
this.x = x;
this.y = y;
}
/**
* 计算亮点之间的距离
* @param p 另一个点坐标
* @return 距离
* 按道理计算亮点之间的距离,需要提供两个点,那还一个点在哪?
* 还有一个就是当前这个点(this),每个成员方法都隐含一个参数-this
*/
public double distance(Point p){
return Math.sqrt((this.x-p.x)*(this.x-p.x)+(this.y-p.y)*(this.y-p.y));
}
}
如果用构造函数的话要使用多个函数使用一个函数名
public class Circle {
private Point p;
private double r;
public Circle(double x,double y,double r){
p = new Point(x, y);
this.r = r;
}
/**
* 计算两个圆的位置关系
* @param c 另一个圆
* @return 0(相切);1(相离);-1(相交)
*/
public int position(Circle c){
double d = this.p.distance(c.p);
if(d == this.r+c.r){
return 0;
}
if (d>this.r+c.r){
return 1;
}
return -1;
}
}
测试
public class Test {
public static void main(String[] args) {
Circle c1 = new Circle(0,0,5);
Circle c2 = new Circle(4,4,7);
int p = c1.position(c2);
switch (p){
case 0:
System.out.println("相切");
break;
case 1:
System.out.println("相离");
break;
case -1:
System.out.println("相交");
break;
}
}
}