类的定义
类的语法格式
class ClassName{ field; // 字段/属性 /成员变量,描述事物特征 method; // 行为 /成员方法,描述事物功能 }
class:定义类的关键字
ClassName:类名,大驼峰命名 (单词首字母大写,如WashMachine、Student)
{}:类的主体,存放成员变量(属性) 和成员方法(行为)类和实例化
实例化
实例化
类 :是用户自定义的一种新数据类型(类似
int、double,只不过int是 Java 内置类型),用来描述一类事物的特征和行为实例化 :使用类来创建对象的过程 , Java 中用
new+ 类名 () 创建对象同一个类,可以创建多个对象
访问对象的成员(属性 / 方法)
使用
.点运算符 :对象.属性、对象.方法()
注意事项a)new:用来创建对象实例
b)
.:访问对象里面的属性和方法c)一个类可以实例化多个独立对象,对象之间数据互不干扰
this关键字
为什么要有 this 引用
形参名和成员变量名相同会发生什么?
- 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); }
多个对象调用同一个成员方法,方法怎么知道操作的是哪个对象
- 成员方法有一个隐藏参数 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 是什么
- this:指向当前对象的引用,当前对象 = 调用这个成员方法的对象
- 在成员方法中访问成员变量,本质都是this.成员变量,编译器默认帮你省略了 this
this 引用的特性
- this 的类型:当前类的引用类型,哪个对象调用,就代表哪个对象
- this只能在成员方法 / 构造方法中使用,静态方法 static 里面不能用 this
- 在成员方法里,this 只能代表当前调用的对象,不能引用别的对象
- this 是成员方法第一个隐藏参数
a) 编译器编译代码时自动加上 this;
b)调用方法时,自动把调用方法的对象引用传给 this。
c)例如:d.setDay(y,m,d)编译后等价于 setDay(d, y,m,d),方法内用 this 接收 d
this 的使用总结
- this.成员变量:访问当前对象的成员变量(用来区分同名形参)
- this.成员方法:调用当前对象的成员方法
- this(...):调用本类的其他构造方法(写在构造方法第一行)
对象的构造及初始化
成员变量初始化引出的问题
局部变量:方法内部定义,必须手动初始化,不赋值直接使用编译报错
对象成员变量
对象的成员变量没有手动赋值也能直接访问
Date1 d1=new Date1(); d1.printDate(); d1.setDate(2026,9,15); d1.printDate();问题 1: 每次创建完对象,还要额外调用setDate()方法赋值,比较麻烦,有没有办法在创建对象的时候就直接完成初始化?
答:使用构造方法,new对象的时候自动完成成员变量初始化
问题 2:局部变量必须手动初始化才能使用,为什么类的字段(成员变量)不赋值也可以直接使用?
答:成员变量有 JVM 提供的默认初始化值,对象在堆内存创建的时候,JVM 自动给所 有成员变量赋默认值。局部变量在栈上,没有默认值。
区分局部变量,对象成员变量
默认初始化
类的成员变量(字段),如果代码没有手动赋值,JVM 会自动给它分配一个默认值,这个过程就叫默认初始化
对比:方法里的局部变量 没有默认值,不赋值直接使用编译报错
Java成员变量默认值表








