Java 对象和类

张开发
2026/4/12 7:37:56 15 分钟阅读

分享文章

Java 对象和类
一、核心概念类与对象1.1 什么是类 (Class)类是创建对象的模板或蓝图。它定义了一组具有相同属性字段和行为方法的对象的共同特征。抽象性类是抽象的概念内存中不直接存储类的实例数据除非是静态变量。定义使用class关键字。1.2 什么是对象 (Object)对象是类的实例(Instance)。它是根据类模板创建出来的具体实体存在于内存中拥有具体的属性值。具体性对象是实实在在的占用内存空间。创建使用new关键字。比喻类 建筑图纸定义了房子有几间房、什么结构。对象 根据图纸盖出来的具体房子张三的房子、李四的房子每栋房子的具体装修不同。二、类的定义与结构2.1 基本语法publicclass类名{// 1. 成员变量 (属性/字段) - 描述对象的状态privateStringname;privateintage;// 2. 构造方法 (Constructor) - 用于初始化对象public类名(Stringname,intage){this.namename;this.ageage;}// 3. 成员方法 (行为) - 描述对象能做什么publicvoidsayHello(){System.out.println(你好我是name);}// Getter 和 Setter 方法 (封装)publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}}2.2 成员变量 vs 局部变量特性成员变量 (Member Variables)局部变量 (Local Variables)位置类中方法外方法内、代码块内、参数列表生命周期随对象创建而存在随对象销毁而消失随方法调用而存在方法结束即消失默认值有(int0, booleanfalse, 引用null)无(使用前必须手动赋值)作用域整个类定义它的方法或代码块存储位置堆内存 (对象的一部分)栈内存三、对象的创建与使用3.1 创建对象的步骤加载类JVM 加载.class文件。分配内存在堆内存中为对象分配空间。初始化执行构造方法给成员变量赋值。返回引用将对象的内存地址返回给引用变量。3.2 代码示例publicclassStudent{Stringname;intage;// 构造方法publicStudent(Stringname,intage){this.namename;this.ageage;}publicvoidstudy(){System.out.println(name正在学习Java);}}publicclassMain{publicstaticvoidmain(String[]args){// 1. 声明引用变量 (栈内存)Students1;// 2. 创建对象 (堆内存)s1newStudent(张三,20);// 3. 使用对象System.out.println(姓名s1.name);// 访问属性s1.study();// 调用方法// 创建第二个对象Students2newStudent(李四,22);s2.study();}}四、构造方法 (Constructor)4.1 特点方法名必须与类名完全相同。没有返回值类型连void都不能写。在new对象时自动调用。用于初始化对象的状态。4.2 构造方法的重载一个类可以有多个构造方法只要参数列表不同类型、个数、顺序。publicclassPerson{Stringname;intage;// 无参构造方法publicPerson(){System.out.println(无参构造被调用);}// 全参构造方法publicPerson(Stringname,intage){this.namename;this.ageage;}// 单参构造方法publicPerson(Stringname){this.namename;this.age18;// 默认年龄}}4.3 默认构造方法如果类中没有定义任何构造方法Java 编译器会自动提供一个无参构造方法。一旦定义了任意构造方法编译器不再提供默认无参构造方法。五、关键字详解5.1this关键字含义代表当前对象的引用即调用该方法或访问该属性的对象本身。常见用法区分成员变量和局部变量当参数名与成员变量名相同时。在构造方法中调用其他构造方法(this(...)必须是第一行)。作为方法的返回值返回当前对象。publicclassStudent{privateStringname;privateintage;publicStudent(Stringname,intage){this.namename;// this.name 指成员变量name 指参数this.ageage;}publicvoidintroduce(){System.out.println(我是this.name);}}5.2new关键字用于在堆内存中创建对象实例。返回对象的内存地址引用。六、内存分析 (JVM 内存模型)理解对象和类必须理解内存分布栈内存 (Stack)存储局部变量包括引用变量如Student s1。存储方法调用的帧参数、局部变量。线程私有生命周期短。堆内存 (Heap)存储对象实例new Student(...)创建的部分。存储数组。所有线程共享由垃圾回收器 (GC) 管理。方法区 (Method Area / Metaspace)存储类信息类名、字段、方法、常量。存储static修饰的变量。所有线程共享。对象创建过程图解main 方法 (栈) 堆内存 (Heap) 方法区 (Method Area) ------------- ------------- ------------------ | Student s1 | ---- | [对象地址] | | Class: Student | | (引用变量) | | name: 张三| | - name (String) | ------------- | age: 20 | | - age (int) | | | | study() | ------------- ------------------七、封装 (Encapsulation)7.1 概念将对象的属性隐藏起来private只通过公共方法publicgetter/setter来访问和修改。7.2 好处安全性防止外部随意修改内部数据如年龄不能为负数。灵活性内部实现改变不影响外部调用。可维护性便于统一管理和调试。7.3 代码示例publicclassAccount{privateStringaccountNo;privatedoublebalance;// 余额外部不能直接修改publicAccount(StringaccountNo,doublebalance){this.accountNoaccountNo;setBalance(balance);// 通过方法设置进行校验}// GetterpublicdoublegetBalance(){returnbalance;}// Setter (包含逻辑校验)publicvoidsetBalance(doublebalance){if(balance0){this.balancebalance;}else{System.out.println(余额不能为负数);}}// 存款方法publicvoiddeposit(doubleamount){if(amount0){this.balanceamount;}}}八、对象作为参数和返回值8.1 对象作为参数Java 中对象传递是值传递传递的是引用的副本。在方法内修改对象的属性会影响原对象。在方法内让引用指向新对象不会影响原引用。publicclassTest{publicstaticvoidmodify(Students){s.age25;// 修改属性原对象改变snewStudent(王五,30);// 改变引用指向原引用不变}publicstaticvoidmain(String[]args){Students1newStudent(赵六,20);modify(s1);System.out.println(s1.age);// 输出 25 (属性被改了)System.out.println(s1.name);// 输出 赵六 (引用没变)}}8.2 对象作为返回值publicStudentcreateStudent(){returnnewStudent(测试,18);}九、常见面试题与易错点和equals()的区别比较基本数据类型时比较值比较引用类型时比较内存地址。equals()默认比较地址同但通常被重写如 String, Integer来比较内容。为什么要有构造方法确保对象在创建时就被正确初始化避免使用未初始化的对象。静态变量 (static) 与对象的关系静态变量属于类所有对象共享同一份静态变量。成员变量属于对象每个对象都有自己的一份。匿名对象的使用场景只调用一次方法时new Student().study();作为参数传递时method(new Student());十、综合实战案例场景模拟一个简单的银行账户管理系统。// 1. 定义类classBankAccount{// 属性privateStringaccountNumber;privateStringownerName;privatedoublebalance;// 构造方法publicBankAccount(StringaccountNumber,StringownerName,doubleinitialBalance){this.accountNumberaccountNumber;this.ownerNameownerName;if(initialBalance0){this.balanceinitialBalance;}else{this.balance0;}}// 存款publicvoiddeposit(doubleamount){if(amount0){balanceamount;System.out.println(存款成功当前余额balance);}}// 取款publicvoidwithdraw(doubleamount){if(amount0amountbalance){balance-amount;System.out.println(取款成功当前余额balance);}else{System.out.println(取款失败余额不足或金额非法);}}// 查询余额publicdoublegetBalance(){returnbalance;}// 显示信息publicvoidshowInfo(){System.out.println(账号accountNumber, 户名ownerName, 余额balance);}}// 2. 测试类publicclassBankSystem{publicstaticvoidmain(String[]args){// 创建对象BankAccountacc1newBankAccount(6222001,张三,1000.0);BankAccountacc2newBankAccount(6222002,李四,500.0);// 操作对象acc1.showInfo();acc1.deposit(500);acc1.withdraw(200);System.out.println(---);acc2.showInfo();acc2.withdraw(600);// 余额不足// 比较对象System.out.println(acc1 和 acc2 是同一个对象吗 (acc1acc2));// false}}总结类是模板对象是实例。构造方法负责初始化。封装保护数据安全。内存模型栈存引用堆存对象方法区存类信息。掌握对象和类是学习 Java 面向对象编程OOP的基石后续继承、多态都基于此。

更多文章