Java 对构造器的简单理解

版权声明:聂CC~ https://blog.csdn.net/ncc1995/article/details/85169794
  • 根据代码先写一下自己的理解:

最初的代码,写完这个能跑出来,但是对于构造方法的使用还是很懵。

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构造函数在对象创建时被调用。 它构造值,即提供对象的数据,这是为什么它被称为构造函数。

有两种类型的构造函数:

  1. 默认构造函数(无参数构造函数)
  2. 参数化构造函数

没有参数的构造函数称为默认构造函数。如果类中没有构造函数,编译器会自动创建一个默认构造函数。默认构造函数根据类型为对象提供默认值,如:0null等。

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

参考链接:

https://www.yiibai.com/java/constructor.html

https://www.cnblogs.com/grl214/p/5895854.html

猜你喜欢

转载自blog.csdn.net/ncc1995/article/details/85169794