Java构造方法的作用

构造方法的作用

构造方法的作用之一就是实例化对象,之前对此一直都不是很了解,为什么要实例化对象呢?我们知道对象具有一定的属性,例如姓名,年龄,身高等,我们在定义类的时候就得要定义这些属性,但是实例化的意思是什么呢?就是通过这些属性,把这些人实际的表达出来,通过属性或方法来实例一个人。

[java] view plain copy
  1. public Person{//定义了一个人的属性,具备一些特征和功能  
  2.     String name;  
  3.     int age;  
  4.     float  height;  
  5.     void talk(){};  
  6. //我们可以将定义的属性和方法组合起来,就可以组合成一个人了  
  7.     Person(String name,int age,float height){  
  8.     This.name=name;  
  9.     This.age=age;  
  10.     This.height=height;   
  11. }  
  12. }  
  13. //组合完成之后,便可以定义不同的人了  
  14. Public class Gouzao{  
  15.     Public static void main(String[] args){  
  16.     Person    ren1=new Person(“张三”,20,180);  
  17.     ren1.talk();  
  18.     Person    ren2=new Person(“李四”,25,170);  
  19.     ren2.talk();  
  20.     Person    ren3=new Person(“王二”,30,185);  
  21.     ren3.talk();  
  22. <span style="white-space:pre">    </span>}  
  23. }  

如果没有构造方法,我们得要这样写:Person   ren1=new Person();

Ren1.name=(“张三”);   ren1.age=20; ren1.height=180;  多麻烦……所以用构造方法,相当于建立了一个代码块,直接填充进去就可以……


----------------------------------------------------------分割线-------------------------

封装的高复用泛型类,运用了构造方法,以及创建成功的返回方法,和错误的放回方法

 
package com.mmall.common;

import com.sun.org.apache.regexp.internal.RE;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;

import java.io.Serializable;

/**
 * Created by qxl on
 * 2018/4/6
 *
 * 1. 高封装类
 * 2. 序列化的结果返回给前端
 * 3.有的时候需要返回data (对象),有的时候不需要,
 * 4.不要null
 * 5. 如果只需要status,可以直接返回status。没有msg 没有data
 * /**
 *
 * 在我们使用泛型类的时候,虽然传入了不通的泛型实参,但并没有真正意义上生成不通的类型
 * 传入不通泛型实参的泛型类在内存上只有一个,即还是原来的最基本的类型,本实例中为ox,
 * 当然,在逻辑上我们可以理解成多个不通的泛型类型
 *
 * 究其原因,在余java泛型的这一概念提出的母的,导致其只是作用与代码编译阶段,在编译过程中,
 * 对于检验法宁结果后,会将法宁的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段
 *
 * 对此总结成一句话: 泛型类型在逻辑上看以看成是多个不通的类型,实际上都是相同的基本类型。
 *
 */

@JsonSerialize( include = JsonSerialize.Inclusion.NON_NULL)
// 不要null  报纸序列化json时候,如果是null的对象,key也会消息
// 返回json中去除null字段
public class ServerResponse<T> implements Serializable {

    //status   跟ajax返回的一致
    private int status;
    //info
    private String msg;
    //对象
    private T data;
    //构造方法
    private ServerResponse(int status){
        this.status =status;
    }
    private ServerResponse(int status,T data){
        this.status =status;
        this.data = data;
    }
    private  ServerResponse(int status,String msg){
        this.status =status;
        this.msg = msg;
    }

    private ServerResponse(String msg){
        this.msg = msg;
    }
    private ServerResponse(int status,String msg,T data){
        this.status =status;
        this.msg = msg;
        this.data = data;
    }
    /**
     * 疑点 :T任意对象  用String到底是哪一个
     */
   /* public static void main(String[] args) {
        ServerResponse sr1 =new ServerResponse(1,new Object());
        ServerResponse hello = new ServerResponse(1, "hello");
        System.out.println("console");
    }*/

    /**
     * 是否成功 0成功  1失败
     * @return
     */
    /**
     * boolean 显示在json中
     * 1、加注解 @JsonIgnore 就不会显示在json里面
     * @return
     */
   @JsonIgnore
   //不在json序列化结果之中
   public  boolean isSuccess(){
        //是0状态成功  1状态是失败
        return this.status == ResponseCode.SUCCESS.getCode();
   }
    //这三个就在
   public  int getStatus(){
       return status;
   }
   public   String getMsg(){
       return msg;
   }
   public T getData(){
       return data;
   }

    /**
     * 創建成功 返回一個status状态
     * @param <T>
     * @return
     */
   public static <T> ServerResponse<T> createBySuccess (){
       return new ServerResponse<T>(ResponseCode.SUCCESS.getCode());
   }

    /**
     * 成功返回 和 消息
     * @param msg
     * @param <T>
     * @return
     */
   public  static <T> ServerResponse<T> createBySuccessMessage(String msg){
        return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg);
   }

    /**
     * 成功状态   和 对象
     * @param data
     * @param <T>
     * @return
     */
   public  static <T> ServerResponse<T> createBySuccessData(T data){
        return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),data);
   }

    /**
     *  成功状态  和 消息  对象
     * @param msg
     * @param data
     * @param <T>
     * @return
     */
   public  static <T> ServerResponse<T> createBySuccessData(String msg,T data){
        return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg,data);
   }

    /**
     * 错误
     * @param <T>
     * @return
     */
   public  static <T> ServerResponse<T> createByError(){
       return new ServerResponse<T>(ResponseCode.ERROR.getCode());
   }

    /**
     * 错误的状态  和 消息
     * @param errormsg
     * @param <T>
     * @return
     *  类上的泛型是对象的
        静态的只能自己定义泛型
     */
   public  static <T> ServerResponse<T> createByErrorMessage(String errormsg){
       //返回值是ServerResponse  实例化的每個返回值都是構造方法。 所以可以
        return new ServerResponse<T>(ResponseCode.ERROR.getCode(),errormsg);
   }

    /***
     *  参数错误   需要登录,code做成变量,
     *  参数错误的话,需要暴露出来
     * @param errormsg
     * @param <T>
     * @return
     */
    public  static <T> ServerResponse<T> createByErrorCodeMessage(int errorcode,String errormsg){
        return new ServerResponse<T>(errorcode,errormsg);
    }

    }




<think>首先,用户的问题是:“我想理解Java构造方法作用和功能 请问Java 构造方法作用和使用场景”。这基于系统级指令,我需要用中文回答,并遵循特定的格式要求。 关键点来自系统级指令: - 所有行内数学表达式必须使用 `$...$` 格式。 - 独立公式使用 `$$...$$` 并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 - 参考站内引用:提供了几个引用,我需要参考它们来构建回答。 提供的引用是关于Java构造方法的: - [^1]: 介绍了构造方法的基本概念、定义规则、实际应用等。 - [^2]: 讨论了构造方法作用和具体实现机制。 - [^3]: 强调了构造方法在对象创建中的角色,包括重载、继承等。 - [^4]: 解释了如何调用构造方法创建对象。 - [^5]: 描述了构造方法的调用场景。 用户的问题焦点是“作用”和“使用场景”,所以我需要围绕这些点构建回答。 回答结构: - 由于指令要求“结构清晰,帮助用户逐步解决问题”,我应该从基本概念开始,逐步解释作用和功能。 - 包括定义、作用、使用场景等。 - 使用中文。 - 在适当的地方添加引用标识,但引用的内容是基于提供的引用文本,我需要自然地整合它们。 - 最后,生成相关问题。 数学表达式:用户的问题是关于Java构造方法的,没有明显的数学内容。但指令说“所有行内数学表达式必须使用$...$格式”,所以如果有数学相关部分,才需要。但在编程中,可能涉及一些表达式。例如,如果讨论参数传递,但这里可能不必要。我会确保如果有任何数学元素,使用LaTeX格式。 生成相关问题:在回答结束时,添加“§§相关问题§§”部分,列出2-3个相关问题,类似于示例。 整合引用: - 在回答中,当提到相关概念时,自然地添加引用标识。 - 例如,当解释作用时,引用[^2];当解释使用场景时,引用[^5]等。 大纲回答: 1. **介绍构造方法**:定义什么是构造方法,使用简单语言。 - 引用[^1]:介绍基本概念。 2. **作用**:详细解释构造方法作用。 - 引用[^2]:作用包括对象的创建和初始化。 3. **功能**:解释构造方法的功能,如初始化实例变量、执行代码等。 - 引用[^4]:调用构造方法创建对象。 4. **使用场景**:列出常见的使用场景。 - 引用[^5]:调用场景,如创建对象、在构造方法中调用另一个构造方法。 5. **总结**:简要总结重要性。 - 引用[^3]:合理使用构造方法的关键性。 6. **相关问题**:生成相关问题。 确保回答真实可靠:基于提供的引用和一般Java知识。 最终输出: - 回答部分。 - §§相关问题§§。</think>### Java 构造方法作用和使用场景 在 Java 编程中,构造方法(Constructor)是一个特殊的方法,用于在创建对象时初始化对象的实例变量和执行必要的操作。它确保了对象在创建时处于一个有效和一致的状态。下面我将逐步解释构造方法作用和功能,以及常见的使用场景,帮助你全面理解这一核心概念。 #### 1. **构造方法的基本定义和作用** - **作用**:构造方法的主要作用是初始化新创建的对象。它在对象被实例化时自动调用,负责设置对象的初始状态,包括为实例变量赋初值、验证输入参数或执行其他初始化逻辑。这确保了对象在创建后立即可用,避免了未初始化的状态错误[^2]。 - 例如:在创建 `Person` 对象时,构造方法可以初始化 `name` 和 `age` 字段。 - 数学表达式示例:如果涉及参数验证,如检查年龄是否为正数,可以用行内表达式表示:$ \text{age} > 0 $。 - **功能特点**: - **自动调用**:当使用 `new` 关键字创建对象时,构造方法被隐式调用,无需手动调用[^4]。 - **无返回值**:构造方法没有返回类型(包括 `void`),其名称必须与类名完全相同。 - **重载支持**:Java 允许多个构造方法(重载),通过不同参数列表实现灵活的初始化方式[^3]。 #### 2. **构造方法的核心功能** - **初始化实例变量**:构造方法可以直接为对象的字段赋值,确保对象属性有合理的默认值。例如: ```java public class Car { private String model; // 构造方法 public Car(String model) { this.model = model; // 初始化 model 字段 } } ``` 在这个例子中,构造方法接受一个参数并赋值给 `model`,避免了对象创建后字段为 `null` 的风险[^1]。 - **执行额外操作**:构造方法可以包含业务逻辑,如参数验证、资源分配或日志记录。例如,检查输入是否有效:如果参数无效,可以抛出异常。 - 数学表达式示例:验证数值范围时,如 $ \text{value} \geq 0 $,确保数据合法性。 - **确保对象一致性**:通过构造方法,开发者可以强制要求某些参数必须提供,从而保证对象在创建时就满足业务规则[^3]。 #### 3. **常见使用场景** 构造方法Java 开发中广泛应用,主要场景包括: - **对象创建**:这是最常见的使用场景,通过 `new` 关键字调用构造方法创建类实例。例如: ```java Car myCar = new Car("Toyota"); // 调用 Car 类的构造方法 ``` 在这里,实参 `"Toyota"` 被传递给构造方法,完成对象的初始化[^5][^4]。 - **构造方法重载**:当类需要支持多种初始化方式时,可以定义多个构造方法。例如: ```java public class Student { private String name; private int age; // 默认构造方法 public Student() { this.name = "Unknown"; this.age = 0; } // 带参数的构造方法 public Student(String name, int age) { this.name = name; this.age = age; } } ``` 这允许开发者根据需求选择不同的初始化路径,提高代码的灵活性[^3][^5]。 - **在构造方法中调用另一个构造方法**:使用 `this()` 关键字在一个构造方法中调用同一类的其他构造方法,避免代码重复。例如: ```java public class Employee { private String id; public Employee() { this("E001"); // 调用带参数的构造方法 } public Employee(String id) { this.id = id; } } ``` 这常用于提供默认值或简化初始化逻辑[^5]。 - **继承中的构造方法调用**:在子类中,使用 `super()` 调用父类构造方法,确保父类初始化完成。例如: ```java public class Manager extends Employee { public Manager() { super(); // 调用父类 Employee 的构造方法 // 子类特有初始化 } } ``` 这保证了继承层次中对象的正确初始化[^3]。 #### 4. **总结** 构造方法Java 中扮演着至关重要的角色,它不仅负责对象的创建和实例变量的初始化,还允许开发者在对象创建时执行额外的操作,从而确保对象的正确性和一致性[^2]。合理使用构造方法(如通过重载或调用其他构造方法)可以提升代码的可读性和可维护性,是面向对象编程的基础[^3]。掌握这些知识,能帮助你在实际开发中高效地设计和实现类。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值