Java 类和对象
Java 类与对象完整讲解
一、核心概念
1. 类(Class)
类是对象的模板、蓝图、抽象描述,定义一类事物共同的属性(成员变量) 和行为(成员方法)。
- 抽象:描述共性,不代表具体实体
- 组成:成员变量、成员方法、构造方法、代码块、内部类
2. 对象(Object)
对象是类的实例,真实存在的具体事物。
- 一个类可以创建多个不同对象
- 对象拥有类定义的属性和行为,属性值各自独立
关系总结
类 → 模板;对象 → 根据模板造出来的实物
例:Person(类)→ 张三、李四(对象)
二、类的语法结构
// 定义类
public class Person {
// 1. 成员变量(属性)
String name;
int age;
// 2. 构造方法(创建对象时调用,初始化属性)
public Person() {
// 无参构造
}
public Person(String n, int a) {
name = n;
age = a;
}
// 3. 成员方法(行为)
public void sayHello() {
System.out.println("我是" + name + ",今年" + age + "岁");
}
}
三、创建对象 & 使用对象
1. 两步创建对象
new Person():在堆内存开辟空间,创建实体Person p:栈内存引用变量,指向堆中的对象
// 方式1:分开写
Person p;
p = new Person("张三", 18);
// 方式2:合并(最常用)
Person p2 = new Person("李四", 20);
2. 访问属性、调用方法
// 访问成员变量
System.out.println(p.name);
System.out.println(p.age);
// 修改属性
p.age = 19;
// 调用成员方法
p.sayHello();
四、构造方法(Constructor)
特点
- 方法名和类名完全相同
- 没有返回值(连void都不能写)
- 创建对象
new时自动执行,用于初始化成员变量 - 一个类可以有多个构造方法(方法重载)
- 不手动写构造,编译器自动提供默认无参构造;写了有参构造,默认无参构造消失
示例:
public class Student {
String name;
// 无参构造
public Student() {}
// 有参构造
public Student(String n) {
name = n;
}
}
五、成员变量 vs 局部变量
| 对比项 | 成员变量(类中方法外) | 局部变量(方法/代码块内) |
|---|---|---|
| 位置 | 类内部,方法外面 | 方法、for、if 内部 |
| 内存 | 堆内存(随对象) | 栈内存(方法执行完销毁) |
| 默认值 | 有默认值(int=0,String=null) | 无默认值,必须手动赋值 |
| 生命周期 | 对象销毁才消失 | 方法执行结束立即消失 |
public class Test {
int a; // 成员变量,默认0
public void test() {
int b; // 局部变量,不赋值不能用
// System.out.println(b); 报错
}
}
六、this 关键字
this代表当前对象,解决成员变量和局部变量重名问题
this.成员变量:访问本类成员变量this.方法():调用本类其他方法this():调用本类其他构造方法,必须放在构造第一行
public Person(String name, int age) {
this.name = name; // this.name 对象属性,name 形参
this.age = age;
}
七、封装(类与对象核心特性)
问题
直接对象.属性可以随意修改数据,无法限制非法值(age=-50)
封装实现步骤
- 成员变量用
private私有,外部无法直接访问 - 提供
getter/setter公共方法,控制读写逻辑
public class Person {
private int age; // 私有
// set赋值
public void setAge(int age) {
if (age > 0 && age < 150) { // 数据校验
this.age = age;
} else {
System.out.println("年龄非法");
}
}
// get取值
public int getAge() {
return age;
}
}
// 使用
Person p = new Person();
p.setAge(20);
System.out.println(p.getAge());
八、内存图解简化理解
- 栈:存引用变量
Person p,存地址 - 堆:
new Person()真实对象,存放成员变量 - 赋值传递:
Person p2 = p只是复制地址,两个引用指向同一个对象,修改互相影响
Person p1 = new Person("小明",10);
Person p2 = p1;
p2.name = "小红";
System.out.println(p1.name); // 小红
九、完整示例代码
// 定义类
public class Cat {
// 属性
private String color;
private String name;
// 无参构造
public Cat() {}
// 有参构造
public Cat(String n, String c) {
name = n;
color = c;
}
// getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
// 方法
public void meow() {
System.out.println(name + ":喵喵喵,毛色" + color);
}
}
// 测试类
class TestCat {
public static void main(String[] args) {
// 创建对象
Cat cat1 = new Cat("橘猫", "橘黄色");
cat1.meow();
Cat cat2 = new Cat();
cat2.setName("布偶");
cat2.setColor("白色");
cat2.meow();
}
}
十、常见面试要点
- 类和对象区别:类是模板,对象是实例;类抽象,对象具体
- 构造方法作用:初始化对象属性,无返回值,与类同名
- this三种用法:访问成员变量、调用成员方法、调用本类构造
- 封装目的:隐藏内部细节,控制数据访问,提高安全性
- 成员变量默认值:数值0、布尔false、引用null
浙公网安备 33010602011771号