zoukankan      html  css  js  c++  java
  • Java 从入门到进阶之路(八)

    在之前的文章我们介绍了一下 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、构造方法可以重载

  • 相关阅读:
    MySQL++:(转)mybatis 常用 jdbcType数据类型
    CF1556F Sports Betting (状压枚举子集DP)
    ICPC Greater New York Region 2020 F
    post方式实现导出/下载文件
    自定义一个v-if
    在vue项目中引用element-ui时 让el-input 获取焦点的方法
    element-select当下拉框数据过多使用懒加载
    vue强制刷新组件更新数据的方式
    .net core efcore dbfirst(sqlserver,mysql,oracle,postgresql)
    camunda安装配置mysql以及整合springboot
  • 原文地址:https://www.cnblogs.com/weijiutao/p/11097413.html
Copyright © 2011-2022 走看看