Java 从入门到进阶之路(八)

  • 2019 年 10 月 15 日
  • 筆記

在之前的文章我们介绍了一下 Java 中的重载,接下来我们看一下 Java 中的构造方法。

我们之前说过,我们在定义一个变量的时候,java 会为我们提供一个默认的值,字符串为 null,数字为 0。如下:

 1 public class HelloWorld {   2     public static void main(String[] args) {   3         User e = new User(); // 创建一个 User 对象   4         e.print(); // 姓名:null 年龄:0 性别:null   5     }   6 }   7   8 class User {   9     String name;  10     int age;  11     String gender;  12  13     void print() {  14         System.out.print("姓名:" + name + "年龄:" + age + "性别:" + gender);  15     }  16 }

但是我们往往在使用的时候并不是想用默认的值,而是自己去定义我们想要的值,如下:

 1 public class HelloWorld {   2     public static void main(String[] args) {   3         // 创建一个 zs 的 User 对象   4         User zs = new User();   5         zs.name = "张三";   6         zs.age = 20;   7         zs.gender = "男";   8         zs.print(); // 姓名:张三 年龄:20 性别:男   9  10         // 创建一个 ls 的 User 对象  11         User ls = new User();  12         ls.name = "李四";  13         ls.age = 22;  14         ls.gender = "女";  15         ls.print(); // 姓名:李四 年龄:22 性别:女  16     }  17 }  18  19 class User {  20     String name;  21     int age;  22     String gender;  23  24     void print() {  25         System.out.print("姓名:" + name + "年龄:" + age + "性别:" + gender);  26     }  27 }

在上面的代码中,我们每次实例化一个 User 对象并赋值时,都要重复写很多代码,造成代码冗余,我们可以将初始化参数也一并写到队形的方法内来解决,如下:

 1 public class HelloWorld {   2     public static void main(String[] args) {   3         // 创建一个 zs 的 User 对象   4         User zs = new User();   5         zs.userInfo("张三", 20, "男");   6         zs.print(); // 姓名:张三 年龄:20 性别:男   7   8         // 创建一个 ls 的 User 对象   9         User ls = new User();  10         ls.userInfo("李四", 22, "女");  11         ls.print(); // 姓名:李四 年龄:22 性别:女  12     }  13 }  14  15 class User {  16     String name;  17     int age;  18     String gender;  19  20     void userInfo(String name, int age, String gender) {  21         this.name = name;  22         this.age = age;  23         this.gender = gender;  24     }  25  26     void print() {  27         System.out.print("姓名:" + name + "年龄:" + age + "性别:" + gender);  28     }  29 }

在上面的代码中,我们定义了一个 userInfo( ) 的方法,通过赋值的形式将参数初始化,其中 this.name = name 中的 this 关键字表示的是 调用改方法的那个对象,即 User,我们可以将其浅显地理解为 zs.name = name;或者 ls.name = name;这样我们在创建 User 实例后通过调用 userInfo( ) 方法来赋值。

通过以上方法我们就可以有效地减少我们在做初始化参数值的时候的代码冗余。

Java 其实已经为我们提供了更为简单的方法:构造方法。如下

 1 public class HelloWorld {   2     public static void main(String[] args) {   3         // 创建一个 zs 的 User 对象   4         User zs = new User("张三", 20, "男");   5         zs.print(); // 姓名:张三 年龄:20 性别:男   6   7         // 创建一个 ls 的 User 对象   8         User ls = new User("李四", 22, "女");   9         ls.print(); // 姓名:李四 年龄:22 性别:女  10     }  11 }  12  13 class User {  14     String name;  15     int age;  16     String gender;  17  18     User(String name, int age, String gender) {  19         this.name = name;  20         this.age = age;  21         this.gender = gender;  22     }  23  24     void print() {  25         System.out.print("姓名:" + name + "年龄:" + age + "性别:" + gender);  26     }  27 }

我们将 void userInfo() 方法改为了和类名 User 一样的 User( ),然后在初始化实例的时候直接将参数传入,使代码更加简洁。

其实我们之前一直写的 User zs = new User( ) 就是一个无参数构造方法。

在有的时候,我们常常会根据也无需要来传递自己想要的参数,类似于之前提到的窗口支付问题,那就需要用到重载,构造方法也是可以重载的,如下:

 1 public class HelloWorld {   2     public static void main(String[] args) {   3         // 创建一个 zs 的 User 对象   4         User zs = new User();   5         zs.print(); // 姓名:null 年龄:0 性别:null   6   7         // 创建一个 ls 的 User 对象   8         User ls = new User("李四", 22, "女");   9         ls.print(); // 姓名:李四 年龄:22 性别:女  10     }  11 }  12  13 class User {  14     String name;  15     int age;  16     String gender;  17  18     User(){  19  20     }  21  22     User(String name, int age, String gender) {  23         this.name = name;  24         this.age = age;  25         this.gender = gender;  26     }  27  28     void print() {  29         System.out.print("姓名:" + name + "年龄:" + age + "性别:" + gender);  30     }  31 }

我们对构造方法的 User( ) 进行了重载,这样就可以根据需求来初始化自己想要的参数了。

 

构造方法的定义与约束:

1、常常用于给成员变量赋初始值

2、与类同名,没有返回类型

3、在创建(new)对象时被自动调用

4、若自己不写构造方法,则编译器默认提供无参构造,若自己写了构造,则不再默认提供。

5、构造方法可以重载