Java中的类与对象:零基础也能懂的OOP入门指南

发布时间:2026/7/24 2:59:54
Java中的类与对象:零基础也能懂的OOP入门指南 导读还在为“类”和“对象”这两个词发愁别担心这篇文章将带你用最通俗的方式彻底搞懂Java面向对象的核心概念。全程配有代码示例边学边练小白也能轻松掌握1. 引言程序是由“对象”组成的嘿你有没有想过我们每天用的手机App、电脑软件其实就像一个“小社会”里面各种功能不是凭空出现的而是由一个个“角色”协作完成的。比如你在用“外卖App”它背后可能有“用户对象”、“商家对象”、“订单对象”……它们各司其职互相“打电话”沟通最后才把一份热腾腾的饭送到你手上。这就是面向对象编程OOP的思想——把程序看作是由多个相互协作的对象构成的整体。核心观点来了类是模板对象是实例。就像“人类”是一个类而“张三”、“李四”就是具体的对象。下面我们就一步步揭开它的神秘面纱2. 什么是类怎么定义一个类2.1 类的本质同类型事物的共性抽象还记得那句老话吗“物以类聚人以群分”。我们天生就会分类看到四个轮子、能跑的我们叫它“汽车”看到能住人的大房子我们叫它“建筑物”在编程里我们也需要给“东西”分类。这个“分类的模板”就叫类Class。一个类就是对一类事物共同特征的抽象描述。比如所有“车”都有品牌、轮子数、座位数所有“学生”都有姓名、学号、联系方式。2.2 定义一个Java类在Java中定义一个类非常简单格式如下public class ClassName { // 属性描述“长什么样” // 方法描述“能干什么” }来我们动手定义两个类试试 定义Vehicle类车辆public class Vehicle { // 属性 - 车辆的特征 String name; // 名称如“奥迪Q5” String manufacture; // 制造商 int wheels; // 轮子数量 int seats; // 座位数 int fuelType; // 燃油类型1-汽油2-电 // 方法 - 车辆的行为 public void info() { System.out.println(Name: name); System.out.println(Manufacture: manufacture); System.out.println(Wheels: wheels); System.out.println(Seats: seats); String t (fuelType 1 ? Gasoline : Electricity); System.out.println(Fuel Type: t); } }‍ 定义Student类学生import java.util.Scanner; public class Student { // 属性 String name; String sid; String phone; String address; // 方法显示信息 public void display() { System.out.println(姓名 name); System.out.println(学号 sid); System.out.println(联系电话 phone); System.out.println(家庭地址 address); } // 方法输入信息 public void input_info() { Scanner sc new Scanner(System.in); System.out.println(请输入学生姓名); name sc.nextLine(); System.out.println(请输入学生学号); sid sc.nextLine(); System.out.println(请输入学生电话); phone sc.nextLine(); System.out.println(请输入学生地址); address sc.nextLine(); } }小贴士属性就像对象的“身份证信息”方法就像对象的“技能包”它能做什么事2.3 在IDEA中创建Java类简要步骤想写代码得有个“家”对吧我们通常这样做打开 IDEA新建一个 Maven 工程在src/main/java下找到你的包比如org.example右键 → New → Java Class → 输入类名如VehicleIDEA 自动帮你生成.java文件接下来就可以往里填代码啦是不是很简单现在你已经有了两个“模板”了。3. 创建并使用对象3.1 对象是怎么来的记住这句话类是图纸对象是盖出来的房子。有了类怎么变出真正的“对象”呢靠new关键字// 创建一个 Vehicle 对象 Vehicle myCar new Vehicle();这行代码干了三件事在内存中开辟一块空间按照Vehicle类的结构创建对象把这个对象的“地址”交给变量myCar去保管 这个过程就叫实例化得到的东西就是对象实例。3.2 创建多个对象的例子我们可以用同一个“图纸”造很多辆车// 第一辆车 Vehicle v1 new Vehicle(); v1.name 奥迪Q5; v1.manufacture 第一汽车公司; v1.wheels 4; v1.seats 5; v1.fuelType 1; v1.info(); // 输出信息 System.out.println(--- 分隔线 ---); // 第二辆车 Vehicle v2 new Vehicle(); v2.name 比亚迪宋; v2.manufacture 比亚迪; v2.wheels 4; v2.seats 5; v2.fuelType 2; v2.info();输出结果Name: 奥迪Q5 Manufacture: 第一汽车公司 Wheels: 4 Seats: 5 Fuel Type: Gasoline --- 分隔线 --- Name: 比亚迪宋 Manufacture: 比亚迪 Wheels: 4 Seats: 5 Fuel Type: Electricity✅重点理解每个对象都有自己独立的属性空间。改v1不会影响v2就像你改自己家装修不会影响邻居一样。3.3 同时操作不同类的对象程序的世界里不只有一种对象。我们可以同时操控“车”和“学生”public class Main { public static void main(String[] args) { // 创建车辆对象 Vehicle car new Vehicle(); car.name 奔驰S320; car.info(); // 创建学生对象 Student stu new Student(); stu.input_info(); // 让用户输入信息 stu.display(); // 显示信息 } }看到没程序就是由这些不同的对象一起“搭台唱戏”的4. 构造函数让对象一出生就有名字4.1 什么是构造函数每次创建对象后都要手动设置一堆属性太麻烦了能不能让对象“一出生”就自带信息当然可以这就用到构造函数Constructor。构造函数是一种特殊的方法它名字必须和类名完全一样没有返回值类型连void都不能写在new的时候自动调用我们给Vehicle加个构造函数public class Vehicle { String name; String manufacture; int wheels; int seats; int fuelType; // 构造函数来了 public Vehicle(String name, String manufacture, int wheels, int seats, int fuelType) { this.name name; this.manufacture manufacture; this.wheels wheels; this.seats seats; this.fuelType fuelType; } public void info() { // ... 和之前一样 } }注意这里的this关键字当参数名和属性名冲突时this.xxx表示“当前对象的 xxx 属性”。现在创建对象就方便多啦Vehicle car new Vehicle(宝马X5, 华晨宝马, 4, 5, 1); car.info();一行搞定4.2 构造函数重载如果我不想一次性填完所有信息怎么办Java支持构造函数重载——一个类可以有多个构造函数只要参数不同就行。比如给Student类加三个构造方式public class Student { String name; String sid; String phone; String address; // 方式1啥都不填默认值 public Student() { this.name Unknown; this.sid 000000000000; this.phone 000000000000; this.address Unknown; } // 方式2只知道名字 public Student(String name) { this.name name; this.sid 000000000000; this.phone 000000000000; this.address Unknown; } // 方式3全都知道 public Student(String name, String sid, String phone, String address) { this.name name; this.sid sid; this.phone phone; this.address address; } // display() 和 input_info() 方法略... }测试一下public class Main { public static void main(String[] args) { Student s1 new Student(); // 默认 Student s2 new Student(张三); // 只有名字 Student s3 new Student(李四, 20220001, 138..., 北京); // 全部 s1.display(); s2.display(); s3.display(); } }Java会根据你传的参数自动选择合适的构造函数。是不是很智能5. 静态成员大家共有的东西5.1 静态属性static field想象一下每个“圆”都有自己的半径但它们都共享同一个数学常数——πPI。这种“大家一起用”的属性就该用static来修饰。来看Circle类public class Circle { static float PI 3.1415926f; // 静态属性所有圆共享 float r; // 实例属性每个圆有自己的半径 public Circle(float r) { this.r r; } public float area() { return PI * r * r; // 直接使用 PI } public void info() { System.out.println(圆的半径 r); System.out.println(圆的面积 area()); } }访问静态属性推荐用类名System.out.println(Circle.PI); // ✅ 推荐 System.out.println(c.PI); // ❌ 不推荐虽然也能运行重要结论static属性属于类本身而不是某个具体对象。所有对象共享同一份数据。5.2 静态方法static method同理有些方法也不依赖具体对象可以直接通过类调用。比如我们想修改全局的 π 值public static void setPI(float pi) { PI pi; }调用方式Circle.setPI(3.14f); // 直接用类名调用不需要 new 对象这类方法常用于工具类比如Math.random()、Arrays.sort()。5.3 静态代码块有时候我们需要在程序启动时就做一些准备工作比如加载配置文件、连接数据库。这时可以用静态代码块static { System.out.println(这是Circle中的静态代码块); System.out.println(JVM加载类时自动执行一次); }它会在类被加载进内存时自动执行一次非常适合做初始化工作。5.4 最佳实践总结什么时候用static✅适合用 static全局常量如PI工具方法如Math.max()配置管理、日志工具❌不要乱用 static普通的业务数据如学生姓名会随着对象变化的状态⚠️ 注意静态方法只能直接访问静态成员不能访问非静态的属性或方法哦6. 内部类藏在类里面的类有时候某个“小助手”类只在一个特定类里用不想让它到处乱跑。这时候就可以把它“藏”起来——用内部类。6.1 成员内部类就像“心脏”属于“人体”一样成员内部类属于外部类的一部分。public class Company { String name; FoundDate date; // 使用内部类作为属性 public Company(String name, int year, int month, int day) { this.name name; this.date new FoundDate(year, month, day); // 创建内部类对象 } // 成员内部类公司成立日期 class FoundDate { int year, month, day; public FoundDate(int year, int month, int day) { this.year year; this.month month; this.day day; } Override public String toString() { return year - month - day; } } public void info() { System.out.println(公司名称 name); System.out.println(成立日期 date); } }使用它Company c new Company(腾讯, 1998, 11, 11); c.info(); 思考题为什么FoundDate要放在Company里面因为它只服务于“公司”这个场景别的地方用不到封装性更强6.2 静态内部类如果内部类不需要依赖外部类的实例就可以加上static变成静态内部类。比如描述一个人的“身份证信息”和“收入情况”public class Person { String name; IDD idd; // 身份证信息 Revenue revenue; // 收入情况 public Person(String name, IDD idd, Revenue revenue) { this.name name; this.idd idd; this.revenue revenue; } // 静态内部类身份证信息 public static class IDD { String province, birth, area; public IDD(String province, String birth, String area) { this.province province; this.birth birth; this.area area; } Override public String toString() { return province birth area; } } // 静态内部类收入情况 public static class Revenue { float gaining, tax, education; public Revenue(float gaining, float tax, float education) { this.gaining gaining; this.tax tax; this.education education; } Override public String toString() { return 年收入 gaining , 纳税额 tax , 教育支出 education; } } public void info() { System.out.println(姓名 name); System.out.println(IDD idd); System.out.println(Revenue revenue); } }创建静态内部类对象更简单Person.IDD idd new Person.IDD(京, 19900101, 001); Person.Revenue rev new Person.Revenue(200000, 30000, 50000); Person p new Person(张三, idd, rev); p.info();6.3 应用场景对比类型是否依赖外部类实例创建方式适用场景成员内部类✅ 是外部类.new 内部类()仅在外部类内部使用静态内部类❌ 否类名.内部类()多个类共用组织辅助类7. 实战案例用Java描述一元二次方程学了这么多来实战一把我们要用Java来表示数学里的一元二次方程ax² bx c 0并计算它的根。7.1 任务目标定义Quadratic类包含系数 a、b、c提供getRoots()方法求解方程的根处理各种边界情况a0、判别式小于0等7.2 代码实现public class Quadratic { float a, b, c; // 构造函数初始化系数 public Quadratic(float a, float b, float c) { this.a a; this.b b; this.c c; } // 求根方法 public void getRoots() { if (a 0) { if (b 0) { if (c 0) { System.out.println(任何实数都是根); } else { System.out.println(无解); } return; } System.out.println(只有一个根 (-c / b)); return; } // 计算判别式 Δ b² - 4ac float delta b * b - 4 * a * c; if (delta 0) { System.out.println(有两个不同实根); double x1 (-b Math.sqrt(delta)) / (2 * a); double x2 (-b - Math.sqrt(delta)) / (2 * a); System.out.println(x1); System.out.println(x2); } else if (delta 0) { System.out.println(有两个相同实根); System.out.println(-b / (2 * a)); } else { System.out.println(没有实数根); } } Override public String toString() { return 方程 a x² b x c 0; } }7.3 测试运行import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); System.out.print(请输入系数 a: ); float a sc.nextFloat(); System.out.print(请输入系数 b: ); float b sc.nextFloat(); System.out.print(请输入系数 c: ); float c sc.nextFloat(); Quadratic q new Quadratic(a, b, c); System.out.println(q.toString()); q.getRoots(); } }运行效果请输入系数 a: 1 请输入系数 b: -3 请输入系数 c: 2 方程1.0x² -3.0x 2.0 0 有两个不同实根 2.0 1.0 搞定我们成功用Java“建模”了一个数学问题8. 小结我们学到了什么今天我们从零开始一步步走进了Java面向对象的世界。来回顾一下核心知识点类与对象类是模板对象是实例用new创建对象每个对象有独立属性构造函数特殊方法名字和类名一样用于初始化对象支持重载static 静态成员属于类被所有对象共享可直接通过类名.成员访问内部类成员内部类依赖外部类实例静态内部类不依赖可独立使用最重要的是思维转变别再想着“一步步怎么做”而是思考“谁来做这件事”。把程序看作一群对象在“打电话”协作你会发现代码变得更清晰、更易维护最后送你一句话“编程不是写代码而是建模世界。”—— 学会用类和对象去抽象现实你就真正掌握了OOP的灵魂。现在快去试试自己定义一个Cat类或者Book类吧实践才是最好的老师