对象的构造及初始化

Posted 是小辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象的构造及初始化相关的知识,希望对你有一定的参考价值。

目录

一、如何初始化对象

二、构造方法

1.概念

2.特性

三、默认初始化

四、就地初始化

总结


一、如何初始化对象

  在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. 初始化所分配的空间

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

数据类型默认值    
byte0
int 0
double0.0
char'\\u0000'   
short0
long0L
booleanfalse
float0.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();
 

总结

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

构造器及重载

1 问题

在新建一个类的对象之后,想要初始化对象的值,必须添加构造器(也叫构造方法),分为无参构造器和有参构造器,如果没有手动定义有参构造器,编译器会自动定义一个无参构造器,用于对象的初始化。而构造器的重载用于创建不同的对象。

2 方法

2.1定义构造器

普通方法的特性依旧全部适用于构造器,需要注意构造器的方法名必须和类名保存一致,构造器在被定义之后,创建一个类的对象时就会默认执行构造方法。构造器通过new关键字调用.

package test03;
public class MenuItem
   // (1.1)菜单序号
   int no;
   //(1.2)菜单内容
   String content;
   public static void main(String[] args)
       // 通过new关键字调用构造方法
       MenuItem item01 = new MenuItem();
       MenuItem item02 = new MenuItem(30,"陈相君");
   
   MenuItem()  // 无参构造器
   
   MenuItem(int no,String content)   // 有参构造器
       // 构造器有返回值,但是不能定义返回值的类型,返回值是本类,无需定义.
       //  return new item;
       // this 在构造方法中代表当前对象 this的本质就是创建好的对象的地址.
       this.no = no;
       this.content = content;
   

2.2构造器的重载

构造器的重载跟方法的重载一模一样,构造器经常需要重载,用于创建不同的用户对象,构造器重载就是构造器的方法名一样,形参列表不同.

package test03;
// 测试构造器重载
public class Student
   int no;  // 学号
   int passwd; // 密码
   String name; // 姓名
   public static void main(String[] args)
       Student stu1  = new Student();
       Student stu2 = new Student(30,"陈相君");
       Student stu3 = new Student("陈相君",30,123456);
   
   Student()  // 无参构造器
   
   Student(int no, String name)   // 带参构造器
       this.no = no;      // this 表示创建好的对象
       this.name = name;  // 构造方法中形参与属性名相同时,用this区分属性与形参.
   
   Student(String name,int no,int passwd )
       this.name = name;
       // this.no 表示属性no, this 用于区分成员变量和局部变量.
       this.no = no;
       this.passwd = passwd;
   

3 结语

本文简单介绍了如何定义构造器和怎样被调用,以及构造器的重载,在面向对象编程基础上增加了一定的基础知识,还有很多的细节和扩展知识值得了解,未来在实际开发中还需不断继续学习。

以上是关于对象的构造及初始化的主要内容,如果未能解决你的问题,请参考以下文章

JVM中实例对象的创建

Java之构造方法及thissuper关键字

Java—面向对象—构造方法及相关思维导图

Java构造方法及类的初始化

静态代码块构造代码块构造函数以及Java类初始化顺序

java JVM常见的四大异常及处理方案