对象的构造及初始化

简介: 对象的构造及初始化

一、如何初始化对象

 在Java方法内部定义一个局部变量的时候,我们知道必须要进行初始化。

public class Test4 {
    public static void main(String[] args) {
        //未初始化的变量n
        int n;
        System.out.println(n);//尚未初始化变量n,编译失败
    }
}

如果要上述代码通过编译,只需要在使用n之前给它一个初始值即可。

如果要是一个对象,则如下面代码,需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。        

class Date{
    public int year;
    public int mouth;
    public int day;
    public void setDay(int year,int mouth,int day){
        this.year = year;
        this.mouth = mouth;
        this.day = day;
    }
    public void printfDate(){
        System.out.println(year + "年" + mouth + "月" + day + "日");
    }
}
public static void main(String[] args) {
  Date d = new Date();
  d.printDate();
  d.setDate(2023,3,30);
  d.printDate();
}
// 代码可以正常通过编译

但大家发现问题没有:

1.每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?

2.  为什么局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

下面为大家解释。


二、构造方法

1.概念

构造方法是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

public class Date {
  public int year;
  public int month;
  public int day;
  // 构造方法:
  // 名字与类名相同,没有返回值类型,设置为void也不行
  // 一般情况下使用public修饰
  // 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
  public Date(int year, int month, int day){
    this.year = year;
    this.month = month;
    this.day = day;
    System.out.println("Date(int,int,int)方法被调用了");
 }
  public void printDate(){
    System.out.println(year + "-" + month + "-" + day);
 }
  public static void main(String[] args) {
    // 此处创建了一个Date类型的对象,并没有显式调用构造方法
    Date d = new Date(2021,6,9);  // 输出Date(int,int,int)方法被调用了
    d.printDate();   // 2021-6-9
 }
}

2.特性

1. 名字必须与类名相同

2. 没有返回值类型,设置为void也不行

3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次

4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

public class Date {
  public int year;
  public int month;
  public int day;
  // 无参构造方法
  public Date(){
    this.year = 1900;
    this.month = 1;
    this.day = 1;
 }
 // 带有三个参数的构造方法
  public Date(int year, int month, int day) {
    this.year = year;
    this.month = month;
    this.day = day;
 }
  public void printDate(){
    System.out.println(year + "-" + month + "-" + day);
 }
  public static void main(String[] args) {
    Date d = new Date();
    d.printDate();
 }
}


上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载

注意:

  • 类中没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。
  • 构造方法中,可以通过this调用其他构造方法来简化代码


三、默认初始化

在上文中提出的第二个问题:为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

这是因为关键词new,当你new出一个对象的时候,在程序层面只是一条简单的语句,而在JVM层面会发生很多的事情,例如:

1. 检测对象对应的类是否加载了,如果没有加载则加载

2. 为对象分配内存空间

3. 处理并发安全问题

4. 初始化所分配的空间

       即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:


数据类型 默认值    
byte 0
int  0
double 0.0
char '\u0000'   
short 0
long 0L
boolean false
float 0.0f
reference  null

5. 设置对象头信息

6. 调用构造方法,给对象中各个成员赋值


四、就地初始化

 在声明成员变量时,就直接给出了初始值。

public class Date {
  public int year = 1900;
  public int month = 1;
  public int day = 1;
  public Date(){
 }
  public Date(int year, int month, int day) {
 }
  public static void main(String[] args) {
    Date d1 = new Date(2021,6,9);
    Date d2 = new Date();
 }
}


总结

 为大家带来对象的构造及初始化的小文,希望能够帮助大家!

目录
相关文章
考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化
考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化
|
SQL 安全 关系型数据库
sqli-labs通关笔记
sqli-labs通关笔记
726 0
|
JavaScript 前端开发 小程序
Vue.js | Vue.js开发 初体验
Vue.js | Vue.js开发 初体验
|
数据安全/隐私保护
无影云电脑专享优惠兑换——0元体验指南
无影云电脑专享优惠兑换——0元体验指南
6085 1
无影云电脑专享优惠兑换——0元体验指南
|
测试技术 数据库
gRPC阅读日记(三)rpc请求官方用例的实现
gRPC阅读日记(三)rpc请求官方用例的实现
164 0
|
消息中间件 监控 Kafka
带你领略基于ELK+Kafka的日志分析系统和Elasticsearch运维实践
阿里巴巴高级工程师赵汉青主要从五个方面对Elasticsearch在日志分析场景的应用与运维实践的问题进行详细讲解,分别对Elasticsearch及相关产品介绍、基于ELK+Kafka的日志分析系统、Elasticsearch运维实践、Elasticsearch优化经验以及阿里云Elasticsearch服务几个方面进行了详细的介绍。
9515 0
|
弹性计算 运维 Linux
通过建站学运维——公有云介绍
一、常见的云 1、私有云:搭建私有云的工具 OpenStack 2、公有云:阿里云、腾讯云、华为云、京东云、亚马逊云等 3、为什么要做公有云? 随着移动互联网的发展,抖音、微信等应用的交互催生了公有云的服务。
2351 0
|
机器学习/深度学习 人工智能 安全
5月28日云栖精选夜读丨阿里安全猎户座实验室:最新恶意软件VPNFilter的技术解析与防护建议
研究结果表明,VPNFilter是一个可扩展性强、有较好健壮性、高水平及非常危险的安全威胁,高度模块化的框架允许快速更改操作目标设备,同时为情报收集和寻找攻击平台提供支撑。VPNFilter破坏性较强,可以通过烧坏用户的设备来掩盖踪迹,比简单地删除恶意软件痕迹更深入,同时VPNFilter恶意软件的组件允许盗窃网站凭证和监控Modbus SCADA协议。
10265 0
下一篇
oss云网关配置