本篇主要介绍Java语言中的面向对象中的构造方法。

12 构造方法

构造方法是在使用new关键字创建对象时调用的方法,负责对象属性值的初始化工作。

12.1 构造方法的特性

1、构造方法的方法名与类名相同(包括字母大小写)
2、构造方法没有返回值(void类型也不能写)
3、构造方法如果开发者不提供,则编译器会默认提供一个无参的构造方法。若开发者提供了构造方法,则编译器不再提供无参的构造方法。

12.2 无参构造方法

12.2.1 隐藏的无参构造方法

隐藏的无参构造方法,即开发者在类中不需要提供构造方法,编译器会自动给这个类提供一个无参的构造方法。

public class Point{
        public int x;
        public int y;
   }
public static void main(String[] args) {
      //创建Point对象,调用了系统提供的隐藏的无参构造方法
      Point point = new Point();
      point.x = 3;
      point.y = 3;
   }
12.2.2 显式定义的无参构造方法

开发者在类中显式定义无参的构造方法后,系统不再提供隐藏的无参的构造方法。

public class Point{
        public int x;
        public int y;
        //显式定义的无参构造方法Point()
        public Point(){

        }
   }
public static void main(String[] args) {
      //创建Point对象,调用了开发者显式定义的无参构造方法
      Point point = new Point();
      point.x = 3;
      point.y = 3;
   }

注:隐藏的无参构造方法,只有在开发者未显式的的定义任何一个构造方法(不管有参还是无参)时,系统才会提供隐藏的无参构造方法。只要开发者定义了一个或者多个构造方法(不管有无参数),系统都不再提供隐藏的无参构造方法。

12.3 有参构造方法

有参的构造方法是为了创建对象时,使用指定的值将对象的属性值进行初始化而定义的构造方法。有参构造方法必须由开发者显式定义

public class Point{
        public int x;
        public int y;
        //有参构造方法
        public Point(int x, int y){
              this.x = x;//给对象的x属性赋值
              this.y = y;//给对象的y属性赋值
        }
   }
public static void main(String[] args) {
       Point point = new Point(3,4);//使用有参构造方法创建对象
       System.out.println("x坐标为"+point.x
        +",y坐标为"+point.y);//输出x坐标为3,y坐标为4
   }

上述代码中的有参构造方法,在给成员变量赋值时,使用了java中的关键字this,如this.x = x;此处如果写出x = x;则是将传入的参数x的值赋给了变量本身,而不是赋给成员变量x(因为此处形参与成员变量同名)。如果要把形参的值赋给同名的成员变量,需要使用this.成员变量名即可访问同名的成员变量。

12.4 构造方法的重载

一个类的构造方法有多个,这些构造方法的参数列表不同,就形成了构造方法的重载。

public class Point{
        public int x;
        public int y;
        //无参构造方法
        public Point(){

        }
        //1个参数的有参构造方法
        public Point(int x){
        this(x,x);//调用Point(int x, int y)
    }
    //2个参数的有参构造方法
    public Point(int x,int y){
        this.x = x;
        this.y = y;
    }
   }

上述代码的Point类中,定义了三个构造方法,这三个构造方法的参数列表是不同的,属于方法的重载。
其中,只有一个参数的构造方法,使用this(x,x)调用了有两个参数的构造方法,这是关键字this的另一种用法。
有了构造方法的重载,开发者就可以按需实例化Point的对象,比如:

Point p1 = new Point();//点p1的坐标为(0,0)
    Point p2 = new Point(3);//点p2的坐标为(3,3)
    Point p3 = new Point(4,5);//点p3的坐标为(4,5)

下一篇将介绍Java中的面向对象中的方法的重载。