【java】类和对象

类的定义

类的语法格式

复制代码
   class ClassName{
       field;    // 字段/属性 /成员变量,描述事物特征
       method;   // 行为 /成员方法,描述事物功能
   }
  1. class:定义类的关键字
    ClassName:类名,大驼峰命名 (单词首字母大写,如WashMachine、Student)
    {}:类的主体,存放成员变量(属性) 和成员方法(行为)

类和实例化

实例化

  1. 实例化

    类 :是用户自定义的一种新数据类型(类似 int、double,只不过int是 Java 内置类型),用来描述一类事物的特征和行为

    实例化 :使用类来创建对象的过程 , Java 中用 new + 类名 () 创建对象

  2. 同一个类,可以创建多个对象

访问对象的成员(属性 / 方法)

  1. 使用 . 点运算符 :对象.属性、对象.方法()

  2. 注意事项

    a)new:用来创建对象实例

    b).:访问对象里面的属性和方法

    c)一个类可以实例化多个独立对象,对象之间数据互不干扰

this关键字

为什么要有 this 引用

形参名和成员变量名相同会发生什么?

  1. Java 遵循就近原则:局部变量 / 形参会屏蔽同名成员变量

复制代码
      public int year;
      public int month;
      public int day;

      //this 关键字的作用
      //谁调用方法谁就是this
      //当形参和成员变量同名时,只是自己赋值给自己,
      public void setDate(int year,int month,int day)
      {
          year=year;
          month=month;
          day=day;

          System.out.println("方法内year/month/day值:"
                  +year+"/"+month+"/"+day);
      }

多个对象调用同一个成员方法,方法怎么知道操作的是哪个对象

  1. 成员方法有一个隐藏参数 this,哪个对象调用方法,this 就指向谁
    例如:d1.setDay()的时候,编译器自动把d1这个对象引用传给 this;d2.setDay(),this 就指向 d2

复制代码
      //this 强制访问对象的成员变量,不在使用就近的形参
      public void setDate(int year,int month,int day)
      {
          this.year=year;
          this.month=month;
          this.day=day;

          System.out.println("方法内year/month/day值:"
                  +year+"/"+month+"/"+day);
      }
  • 强制访问对象的成员变量,不再使用就近的形参
    总结

  • 没有this.时,方法内变量名优先匹配局部 / 形参

  • this.变量名,代表对象的成员变量,不受就近原则影响


this 是什么

  1. this:指向当前对象的引用,当前对象 = 调用这个成员方法的对象
  2. 在成员方法中访问成员变量,本质都是this.成员变量,编译器默认帮你省略了 this

this 引用的特性

  1. this 的类型:当前类的引用类型,哪个对象调用,就代表哪个对象
  2. this只能在成员方法 / 构造方法中使用,静态方法 static 里面不能用 this
  3. 在成员方法里,this 只能代表当前调用的对象,不能引用别的对象
  4. this 是成员方法第一个隐藏参数
    a) 编译器编译代码时自动加上 this;
    b)调用方法时,自动把调用方法的对象引用传给 this。
    c)例如:d.setDay(y,m,d)编译后等价于 setDay(d, y,m,d),方法内用 this 接收 d

this 的使用总结

  • this.成员变量:访问当前对象的成员变量(用来区分同名形参)
  • this.成员方法:调用当前对象的成员方法
  • this(...):调用本类的其他构造方法(写在构造方法第一行)

对象的构造及初始化

成员变量初始化引出的问题

  1. 局部变量:方法内部定义,必须手动初始化,不赋值直接使用编译报错

  2. 对象成员变量

    对象的成员变量没有手动赋值也能直接访问

    复制代码
            Date1 d1=new Date1();
            d1.printDate();
            d1.setDate(2026,9,15);
            d1.printDate();
  3. 问题 1: 每次创建完对象,还要额外调用setDate()方法赋值,比较麻烦,有没有办法在创建对象的时候就直接完成初始化?

    答:使用构造方法,new对象的时候自动完成成员变量初始化

  4. 问题 2:局部变量必须手动初始化才能使用,为什么类的字段(成员变量)不赋值也可以直接使用?

    答:成员变量有 JVM 提供的默认初始化值,对象在堆内存创建的时候,JVM 自动给所 有成员变量赋默认值。局部变量在栈上,没有默认值。

  5. 区分局部变量,对象成员变量

默认初始化

  1. 类的成员变量(字段),如果代码没有手动赋值,JVM 会自动给它分配一个默认值,这个过程就叫默认初始化

    对比:方法里的局部变量 没有默认值,不赋值直接使用编译报错

  2. Java成员变量默认值表

相关推荐
斯内普吖8 小时前
(开源)宠物饲养系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源·宠物
燕落南枝8 小时前
c语言 洛谷P1765手机题解
c语言·开发语言
知守观8 小时前
Spring Boot 2.1 → 3.5 迁移推演:这个 2018 年的项目会炸在哪
java·spring boot
Rosanci8 小时前
Codex 下载与本地部署实战:从安装到运行全流程指南
开发语言·前端·算法·chatgpt·codex
Flynt8 小时前
800KB 的 JSON 吃掉 8.5 秒 CPU:jackson 这波修复里,最容易被漏掉的洞藏在字符串里
java·安全
后端LV8 小时前
Caffeine 快到 1450 万 ops/s,为什么我还是不敢说数据一致
java·后端
zhangzeyuaaa8 小时前
深入 Ruby:Block、Proc、Lambda 核心区别与最佳实践
开发语言·前端·ruby
蜗牛互联网8 小时前
Java 17调用Embeddings API:余弦相似度与FAQ拒答阈值
java·开发语言·人工智能
郝学胜-神的一滴8 小时前
AI 编程智能体 05:拆解智能体分级体系、类型与全行业落地场景
开发语言·人工智能·python·程序人生·pycharm
朝朝辞暮i8 小时前
C++ 第 38 课:线程、SingleThreadedExecutor、MultiThreadedExecutor、Callback Group
开发语言·c++·算法·ros2