-
根据代码先写一下自己的理解:
最初的代码,写完这个能跑出来,但是对于构造方法的使用还是很懵。
package oper;
public class testConstructor{
public static void main(String[] args) {
Point p = new Point(3.0, 4.0);
Point or = new Point(0.0, 0.0);
System.out.println(p.getDistance(or));
}
}
class Point {
double x, y;
public Point(double _x, double _y) {
x = _x;
y = _y;
}
public double getDistance(Point p) {
return Math.sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
}
}
这个是为了理解自己改了一下的代码:
package oper;
public class testConstructor {
public static void main(String[] args) {
Point or = new Point(3.0, 4.0);
Point p = new Point(0.0, 0.0);
double dist = p.getDistance(or);
double o = or.getDistance(p);
System.out.println(dist);
System.out.println("print o:"+o);
}
}
class Point{
double x, y;
//构造器名称与类名必须一致
public Point(double _x, double _y) {
x = _x+1;
y = _y+1;
}
public double getDistance(Point p) {
System.out.println("p.x:"+p.x);
System.out.println("p.y:"+p.y);
return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
}
}
当构造器只有一个参数时,输入也只能有一个参数,而和类中定义了几个变量无关。
package oper;
public class testConstructor {
public static void main(String[] args) {
Point or = new Point(3.0);
Point p = new Point(0.0);
double dist = p.getDistance(or);
double o = or.getDistance(p);
System.out.println(dist);
System.out.println("print o:"+o);
}
}
class Point{
double x, y;
//构造器名称与类名必须一致
public Point(double _x) {
x = _x+1;
//y = _y+1;
}
public double getDistance(Point p) {
System.out.println("p.x:"+p.x);
System.out.println("p.y:"+p.y);
return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
}
}
构造器需要的注意事项:
1. 通过new关键字调用!!
2. 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
3. 如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加!
4. 构造器的方法名必须和类名一致!
(为什么必须一致:调用构造器是编译器的责任,所以必须让编译器知道调用的是哪一个方法。所以Java采取了与类同名的方法命名构造器。)
可以发现对构造器的调用与创建一个新的对象方法一样,而且构造器的名字与类名完全一致,这就是我困惑的一个地方,怎么区分哪个是创建的对象,哪个是对构造器的调用。
我自己的理解是:class中包含其他的方法,是class中的方法对构造器进行调用,在main函数中谁作为参数传入方法中谁就是构造器。(构造器具体作用是什么还是不清楚。
-
查了些资料后,发现自己对构造器的理解偏差很大,下面的代码是修改了一下,新的理解 :
package oper;
public class testConstructor {
public static void main(String[] args) {
Point or = new Point();
Point p = new Point();
double dist = p.getDistance(or);
//double o = or.getDistance(p);
System.out.println(dist);
//System.out.println("print o:"+o);
}
}
class Point{
double x = 0.0, y = 3.0;
//构造器名称与类名必须一致
/*public Point(double _x) {
x = _x+1;
//y = _y+1;
}*/
public double getDistance(Point p) {
System.out.println("p.x:"+p.x);
System.out.println("p.y:"+p.y);
return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
}
}
构造器的最大的用处就是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象的实例进行默认的初始化。如果想改变这种默认的初始化,就可以通过自定义构造器来实现。
就比如上面这个修改后的代码,将构造器删除之后,x,p.x的值完全一样,y和p.y也完全一样,这样为了计算两点距离而写的代码并不能得到想要的结果。而加入构造器之后,就可以在创建对象时进行不同的初始化操作。因此,我的理解:构造器在创建对象的时候与调用方法一样 可以传入参数来进行初始化。
-
被某些人批评理解的太片面,继续查资料:
java中的构造方法是一种特殊类型的方法,用于初始化对象。Java构造函数在对象创建时被调用。 它构造值,即提供对象的数据,这是为什么它被称为构造函数。
有两种类型的构造函数:
- 默认构造函数(无参数构造函数)
- 参数化构造函数
没有参数的构造函数称为默认构造函数。如果类中没有构造函数,编译器会自动创建一个默认构造函数。默认构造函数根据类型为对象提供默认值,如:0
,null
等。
package oper;
public class testConstructor {
public static void main(String[] args) {
Point or = new Point();
or.display();
//Point p = new Point();
//double dist = p.getDistance(or);
//double o = or.getDistance(p);
//System.out.println(dist);
//System.out.println("print o:"+o);
}
}
class Point{
int x, y;
String cc;
//构造器名称与类名必须一致
/*public Point(double _x) {
x = _x+1;
//y = _y+1;
}*/
void display() {
System.out.println(x+" "+y+" "+cc);
}
/*
public double getDistance(Point p) {
System.out.println("p.x:"+p.x);
System.out.println("p.y:"+p.y);
return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
}*/
}
--------------------------------------------------------------------------
out:0 0 null
参考链接: