当前位置: 首页 > 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;      // 默认初始化为null
    private 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); // 输出清华大学
    }
}

相关文章:

  • FreeCAD傻瓜教程-装配体Assembly的详细使用过程
  • java基础知识面试题总结
  • Android学习总结之算法篇三(排序)
  • git kex_exchange_identification 相关问题
  • C/C++ JSON 库综合对比及应用案例(六)
  • Redis 与 AI:从缓存到智能搜索的融合之路
  • UI设计系统:如何构建一套高效的设计规范?
  • S32K144入门笔记(二十三):FlexCAN解读(1)
  • SAP CO88根据标准价格拆分增量错误解决
  • SpringBoot实战:Excel文件上传、数据验证与存储全流程解析
  • EasyExcel导出导入excel工具类
  • 【创新项目实训个人博客】camel学习笔记(1)camel介绍
  • 【教程】如何利用bbbrisk一步一步实现评分卡
  • 设计模式(2)
  • 前端资源缓存策略全面解析:从原理到实践
  • 【Ultralytics YOLO COCO 评估脚本 | 获得COCO评价指标】
  • 鲲鹏920部署GAZELLE用户态协议栈
  • 通用智能人“通通”2.0发布,AI迈向“类人”智能新时代
  • 用Python做数据分析之数据统计
  • 在STM32H725多定时器同步移相(基于ASTM32CubeMX)
  • 这个死亡率第一的“老年病”,正悄悄逼近年轻人
  • 美俄亥俄州北部发生火车撞人事故,致2人死亡、至少1人失踪
  • 国家统计局:1-4月份,全国固定资产投资同比增长4.0%
  • 《风林火山》千呼万唤始出来,戛纳首映后口碑崩盘?
  • 以军证实空袭也门多个港口
  • 上海国际珠宝时尚功能区未来三年如何建设?六大行动将开展