当前位置: 首页 > news >正文

七. JAVA类和对象(二)

         hello!这里是敲代码的小董,很荣幸您阅读此文,本文只是自己在学习JAVA过程中的笔记,如有不足,期待您的评论指点和关注,欢迎欢迎~~

✨✨个人主页:敲代码的小董

💗💗系列专栏:JAVA

目录

5. 对象的构造及初始化

5.1 如何初始化对象

5.2 构造方法

5.2.1 概念

5.2.2 特性

5.3 默认初始化

5.4 就地初始化


上一节:七. JAVA类和对象(一)

5. 对象的构造及初始化

5.1 如何初始化对象

        通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

public static void main(String[] args) {int a;System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a

        要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象: 

public static void main(String[] args) {Date d = new Date();d.printDate();d.setDate(2021,6,9);d.printDate();
}
// 代码可以正常通过编译

需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。

通过上述例子发现两个问题:
1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

        对象初始化是为新建对象分配内存空间并设置初始值的过程。在面向对象编程中,正确的初始化是保证对象状态有效性的关键。

常见的初始化方式包括:

  • 构造方法初始化
  • 默认初始化
  • 声明时初始化(就地初始化)
// 示例:三种初始化方式的综合体现
public class Smartphone {private String brand;      // 默认初始化为nullprivate int storage = 128; // 就地初始化private double price;// 构造方法初始化public Smartphone(String brand, double price) {this.brand = brand;this.price = price;}
}

5.2 构造方法

5.2.1 概念

构造方法是类中用于初始化对象的特殊方法,具有以下特征:

  • 方法名与类名完全相同
  • 没有返回类型(包括void)
  • 在对象创建时自动调用
  • 可以重载(多个参数列表不同的构造方法)
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}
}

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

5.2.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();}
}

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

5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。

public class Date {public int year;public int month;public int day;public void printDate(){System.out.println(year + "-" + month + "-" + day);}public static void main(String[] args) {Date d = new Date();d.printDate();}
}

        上述Date类中,没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。 

注意:一旦用户定义,编译器则不再生成。 

6. 构造方法中,可以通过this调用其他构造方法来简化代码 

注意:

  • this(...)必须是构造方法中第一条语句。
  • 不能形成环。

7. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰(单例模式) 

5.3 默认初始化

为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

 局部变量未初始化:

成员变量未初始化:

当成员变量未显式初始化时,Java会根据数据类型自动进行默认初始化:

5.4 就地初始化

在声明成员变量时直接赋值,这种初始化方式:

  • 在构造方法执行前完成
  • 适合固定初始值的场景
  • 可以结合构造方法混合使用
public class Student {// 就地初始化private String school = "清华大学";private final int MAX_COURSES = 6; // 常量初始化private String name;private List<String> courses = new ArrayList<>(); // 复杂类型初始化public Student(String name) {this.name = name;}public void addCourse(String course) {if(courses.size() < MAX_COURSES) {courses.add(course);}}// 使用示例public static void main(String[] args) {Student stu = new Student("王小明");stu.addCourse("计算机组成原理");System.out.println("所属院校:" + stu.school); // 输出清华大学}
}

下一节:七. JAVA类和对象(三)-CSDN博客 


http://www.mrgr.cn/news/96762.html

相关文章:

  • 消息中间件对比与选型指南:Kafka、ActiveMQ、RabbitMQ与RocketMQ
  • 前端界面在线excel编辑器 。node编写post接口获取文件流,使用传参替换表格内容展示、前后端一把梭。
  • LLM应用层推荐 -- 基于文档的问答tools Web UI 框架 开源向量库 -- 推荐、对比
  • 003-JMeter发起请求详解
  • Vue中将pdf文件转为图片
  • GitPython库快速应用入门
  • 【超详细】一文解决更新小米澎湃2.0后LSPose失效问题
  • 使用 Less 实现 PC 和移动端样式适配
  • pytorch模型的进阶训练和性能优化
  • uniapp -- 列表垂直方向拖拽drag组件
  • 【橘子大模型】关于PromptTemplate
  • 从 BBRv2 到 BBRv3
  • Windows搭建AI大模型应用开发环境以及踩过的坑
  • sourceinsight 4.0 任意配置主题颜色风格的方法
  • RCU机制以及内存优化屏障
  • 【408--考研复习笔记】计算机网络----知识点速览
  • 【Golang】Windows系统键鼠空闲监测练习
  • STM32CubeMX的使用方法:使用STM32CubeMX生成基于STM32F103+HLA库的初始化代码,并在此基础上写出LED点灯程序
  • 数据结构实验1.3: 有序顺序表的归并
  • android 设置状态栏背景