从0到1:Java面向对象编程入门全解

📅 发布时间:2026/7/9 13:02:06 👁️ 浏览次数:
从0到1:Java面向对象编程入门全解
从0到1Java面向对象编程入门全解作为编程新手你是否曾对“面向对象”这个词感到既熟悉又陌生它就像编程世界的一把钥匙帮我们从“按步骤做事”的思维转变为“用对象建模”的思维。今天就让我们一起从最基础的概念开始一步步揭开Java面向对象编程的神秘面纱。一、什么是面向对象在学习编程之前我们思考问题的方式通常是“过程式”的先做什么再做什么一步一步完成任务。比如我们要做一杯奶茶可能会想拿杯子 → 加茶底 → 加奶 → 加糖 → 加珍珠。而面向对象Object-Oriented Programming, OOP则是一种更贴近现实世界的思维方式。我们不再关注“步骤”而是关注“参与者”。在做奶茶的例子里我们会把“奶茶师”、“奶茶”、“原料”都看作一个个独立的“对象”每个对象都有自己的属性比如奶茶的甜度、温度和行为比如奶茶师制作奶茶。简单来说面向对象就是用代码来模拟现实世界中的事物让程序的结构更清晰、更易于维护和扩展。二、类和对象面向对象的基石1. 什么是类类Class是对一类具有相同属性和行为的事物的抽象描述。它就像是一个“模板”或“设计图纸”。比如我们可以定义一个“学生”类属性是什么姓名、年龄、学号行为能做什么学习、考试、睡觉在Java中定义一个类的基本语法是public class Student { // 属性成员变量 String name; int age; String studentId; ​ // 行为成员方法 public void study() { System.out.println(name 正在学习...); } }2. 什么是对象对象Object是类的一个具体实例。如果说“学生”是一个类那么“张三20岁学号2023001”就是这个类的一个具体对象。根据“图纸”类我们可以“盖房子”创建对象// 创建一个Student对象名字叫张三 Student zhangSan new Student(); // 给这个对象的属性赋值 zhangSan.name 张三; zhangSan.age 20; zhangSan.studentId 2023001; // 调用这个对象的行为 zhangSan.study(); // 输出张三正在学习...三、封装保护你的数据1. 什么是封装封装Encapsulation是面向对象的三大核心特征之一。它就像给你的对象穿上了一件“保护衣”把对象的内部状态属性隐藏起来只对外暴露必要的操作方法。这样做有两个好处数据安全防止外部随意修改内部数据保证数据的合理性。降低耦合外部只需要知道如何调用方法不需要关心内部实现细节。2. 如何实现封装在Java中我们通常通过以下步骤实现封装私有化属性使用private关键字修饰成员变量让它们不能被外部直接访问。提供公共的访问器getter和修改器setter方法让外部可以通过这些方法安全地读取和修改属性。public class Student { // 1. 私有化属性 private String name; private int age; ​ // 2. 提供getter和setter方法 public String getName() { return name; } ​ public void setName(String name) { this.name name; } ​ public int getAge() { return age; } ​ // 在setter方法中可以加入数据校验 public void setAge(int age) { if (age 0 age 120) { this.age age; } else { System.out.println(年龄输入不合法); } } }四、就近原则和this关键字1. 就近原则当方法中的局部变量和类的成员变量同名时Java会遵循“就近原则”优先使用离它更近的局部变量。public class Student { private String name 默认名; ​ public void setName(String name) { // 这里的name是方法参数局部变量而不是成员变量 System.out.println(传入的名字是 name); // 如何访问被隐藏的成员变量呢这就需要用到this。 } }2. this关键字this代表的是“当前对象”的引用。它主要有两个作用访问当前对象的成员变量解决成员变量和局部变量的命名冲突。调用当前对象的其他方法或构造方法。public void setName(String name) { // this.name 指的是成员变量name 指的是局部变量方法参数 this.name name; }从内存角度看当我们创建一个对象时this就指向了这个对象在堆内存中的地址帮助我们准确地操作这个对象自己的数据。五、构造方法对象的“出生证明”1. 什么是构造方法构造方法Constructor是一种特殊的方法它在我们使用new关键字创建对象时被自动调用用于完成对象的初始化工作比如给属性赋初值。它有几个特点方法名必须与类名完全相同包括大小写。没有返回值类型连void也不能写。不能被static、final、abstract等修饰。2. 默认构造方法和有参构造方法默认构造方法如果你没有定义任何构造方法Java会自动提供一个无参的构造方法。一旦你定义了自己的构造方法这个默认的就消失了。有参构造方法我们可以自己定义带参数的构造方法在创建对象的同时就完成属性的初始化。public class Student { private String name; private int age; ​ // 无参构造方法 public Student() {} ​ // 有参构造方法 public Student(String name, int age) { this.name name; this.age age; } } ​ // 使用有参构造方法创建对象一步到位 Student liSi new Student(李四, 19);3. 标准的JavaBean类一个符合规范的JavaBean类通常具备以下特点类是public的。所有成员变量都是private的。提供无参的构造方法。为每个私有属性提供public的getter和setter方法。可选提供有参构造方法。这是我们在开发中最常用的类的写法。六、static关键字属于“类”的成员1. 静态变量和静态方法我们之前定义的属性和方法都是属于“对象”的必须通过对象来访问。而被static修饰的成员属于“类”本身我们称之为静态成员。静态变量类变量所有对象共享一份数据内存中只有一份拷贝。静态方法类方法可以直接通过类名调用不需要创建对象。常用于定义工具类方法。public class MathUtil { // 静态变量 public static final double PI 3.1415926; ​ // 静态方法工具方法 public static int add(int a, int b) { return a b; } } ​ // 直接通过类名调用无需创建对象 double pi MathUtil.PI; int sum MathUtil.add(1, 2);2. static的注意事项静态方法中不能直接访问非静态的成员变量和方法因为静态方法属于类在对象还没创建时就可以调用。静态方法中不能使用this关键字因为this代表对象而静态方法不依赖于对象。七、继承代码复用的艺术1. 什么是继承继承Inheritance是面向对象的另一大核心特征。它允许我们定义一个新的类子类/派生类去继承一个已经存在的类父类/基类/超类。子类会自动拥有父类中所有可继承的属性和行为。比如我们可以定义一个“动物”类作为父类然后定义“猫”、“狗”等子类去继承它。这样猫和狗就自动拥有了“动物”的“呼吸”、“进食”等行为我们只需要在子类中编写它们特有的行为即可。// 父类 public class Animal { public void eat() { System.out.println(动物在进食...); } } ​ // 子类Dog继承父类Animal public class Dog extends Animal { // 子类特有的行为 public void bark() { System.out.println(汪汪汪); } } ​ // 使用 Dog dog new Dog(); dog.eat(); // 调用从父类继承来的方法 dog.bark(); // 调用子类自己的方法2. 继承中的访问特点在继承体系中成员变量和成员方法的访问遵循以下规则成员变量编译看左边父类运行看左边父类。成员方法编译看左边父类运行看右边子类。这就是方法的重写Override。3. this和super关键字this代表当前子类对象的引用用于访问子类的成员。super代表父类存储空间的标识可以理解为父类对象的引用用于访问父类的成员。在子类的构造方法中必须先调用父类的构造方法来完成父类部分的初始化这通常通过super()来实现。八、多态同一个行为的不同表现1. 什么是多态多态Polymorphism是面向对象的第三大核心特征。它指的是同一个行为在不同的对象上会表现出不同的形态。比如“动物”都有“叫”的行为但“猫”叫是“喵喵”“狗”叫是“汪汪”。这就是多态。2. 多态的前提和实现前提要有继承或实现接口关系。要有方法的重写。要有父类引用指向子类对象Animal a new Cat();。实现public class Cat extends Animal { // 重写父类的eat方法 Override public void eat() { System.out.println(猫在吃鱼...); } } ​ // 父类引用指向子类对象 Animal animal new Cat(); // 运行时调用的是子类Cat重写后的eat方法 animal.eat(); // 输出猫在吃鱼...3. 多态的优势多态的最大优势在于提高了程序的可扩展性和可维护性。我们可以编写面向父类或接口的代码当需要扩展新的子类时原有的代码几乎不需要修改只需要添加新的子类即可。九、抽象类和接口更高层次的抽象1. 抽象类当一个类的某些方法无法给出具体实现时我们可以把它定义为抽象类Abstract Class。抽象类使用abstract关键字修饰它不能被实例化只能作为父类被继承。抽象类中可以包含抽象方法没有方法体用abstract修饰子类必须重写所有的抽象方法否则子类也必须是抽象的。2. 接口接口Interface是一个比抽象类更“纯粹”的抽象。它可以看作是一个“行为规范”或“契约”。接口中所有的方法默认都是public abstract的。一个类可以实现implements多个接口从而弥补了Java单继承的不足。接口中也可以定义常量public static final和默认方法Java 8。// 定义一个接口 public interface Swim { void swim(); } ​ // 一个类可以实现多个接口 public class Duck extends Animal implements Swim { Override public void swim() { System.out.println(鸭子在水里游...); } }十、内部类类中的类内部类Inner Class是定义在另一个类内部的类。它可以访问外部类的私有成员主要分为以下几种成员内部类定义在外部类的成员位置需要通过外部类对象来创建。静态内部类用static修饰的成员内部类相当于外部类的静态成员。局部内部类定义在方法或代码块中的类。匿名内部类没有名字的局部内部类通常用于简化代码直接创建一个实现了接口或继承了类的对象。// 匿名内部类的经典用法创建一个Runnable对象 new Thread(new Runnable() { Override public void run() { System.out.println(线程运行中...); } }).start();结语面向对象编程是一个庞大而精妙的体系本文只是带你走马观花地浏览了一遍核心概念。从类和对象到封装、继承、多态再到static、接口和内部类每一个知识点都是构建复杂程序的基石。作为新手最重要的是多写代码多思考。尝试用面向对象的思维去解决一个小问题比如设计一个简单的学生管理系统你会对这些概念有更深刻的理解。