通过一个案例来解释构造函数
改写C102_06
如果忘了调用圆的初始化操作(这种情况是经常存在的),程序就会出现错误,报错如下:
Exception in thread "main" java.lang.NullPointerException
这种空指针错误,java中出现频率最高的异常
通过调试发现,圆心对象为null
因为在初始化方法中创建了圆心对象,如果忘了调用,p的值当然为null
public void init(double x, double y, double r){
p = new C102_05_Point();
p.init(x,y);
this.r = r;
}
怎么解决可能存在的遗忘问题,如果该初始化的函数能够自动调用,不就能解决吗!那么怎么才能自动调用呢?
如果一个函数要能被自动调用,该函数名应该是独一无二的。那么对于一个类来说,什么样的函数名才是独一无二的呢?
那就是将类名作为函数名——构造函数。
构造函数存在的价值就是自动被调用。
如何使用构造函数呢?
将init函数名换为类名作为函数名,同时去掉返回值(注意构造函数的返回值由系统自己决定,程序员不能指定,即使为void也不行)。
构造函数定义如下
public C102_07_Circle() {
p = new C102_05_Point();
r = 0;
System.out.println("第一个构造函数被自动调用了!");
}
public C102_07_Circle(double x, double y, double r){
p = new C102_05_Point();
p.init(x,y);
this.r = r;
System.out.println("第二个构造函数被自动调用了!");
}
public C102_07_Circle(C102_05_Point p, double r){
this.p = p;
this.r = r;
System.out.println("第三个构造函数被自动调用了!");
}
构造怎么调用呢?
构造函数无法显式调用(也无需),而是自动被调用。
C102_07_Circle c1 = new C102_07_Circle();
C102_05_Point p = new C102_05_Point();
C102_07_Circle c2 = new C102_07_Circle(p,6);
那么是何时被自动调用的呢?可以通过调试来查看。