9、类、对象、引用
发布日期:2021-05-14 14:25:24 浏览次数:17 分类:精选文章

本文共 2758 字,大约阅读时间需要 9 分钟。

面向对象编程入门

面向对象的基本概念

在编程领域,面向对象和面向过程是两种不同的编程范式。面向过程(Procedural Programming)关注的是程序的执行流程,而面向对象(Object-Oriented Programming,简称OO)则关注的是对象之间的交互。

面向对象的核心思想是将程序中的数据和操作封装到独立的对象中,每个对象都可以封装其自身的状态和行为,从而使程序更易于理解和维护。

面向对象的优缺点

优势:

  • 低耦合度:对象之间通过接口或抽象类连接,减少了直接调用方法的耦合度。
  • 高扩展性:面向对象更容易支持程序的扩展和维护。
  • 易于复用:可以通过继承和多态将已有的代码复用到新项目中。

缺点:

  • 开发成本高:面向对象需要进行大量的系统分析和设计。
  • 复杂性:面向对象的程序通常比面向过程的程序复杂。

面向对象的三大特征

面向对象的三大特征是封装、继承和多态。这些特征使得面向对象具有高度的可扩展性和复用性。

  • 封装:将数据和操作合为一个整体,保证了数据的安全性和一致性。
  • 继承:允许一个类继承另一个类的属性和方法,从而减少代码的冗余。
  • 多态:同一个方法可以在不同类型的对象上有不同的行为,增加了程序的灵活性。
  • 面向对象的设计原则

    面向对象编程中有六大设计原则,通常被称为“六大原则”或“设计模式六大原则”:

  • 单一职责原则(Single Responsibility Principle,SRP):一个类只能有一个主要的职责。
  • 接口隔离原则(Interface Segregation Principle,ISP):类之间通过接口进行交互,尽量减少直接依赖。
  • 里氏替换原则(Liskov Substitution Principle,LSP):对象类型可以被其子类替换而不影响系统的行为。
  • 依赖倒置原则(Dependence Inversion Principle,DIP):不要让高层次的模块依赖低层次的模块,而是倒置依赖关系。
  • 开放封闭原则(Open/Closed Principle,OCP):类的开闭原则指的是类应该是开放的(对扩展开放)而封闭的(对修改封闭)。
  • 迪米特法则(Law of Demeter):一个对象 shouldn't send messages to another object that it shouldn't have access to.
  • 面向对象的生命周期

    面向对象的开发流程通常包括以下几个阶段:

  • 面向对象分析(OOA):通过分析现有的问题,确定系统的需求和功能。
  • 面向对象设计(OOD):根据分析结果设计类的结构和接口。
  • 面向对象编程(OOP):将设计转化为具体的代码实现。
  • 类与对象的关系

    类是什么?

    • 类是现实世界中抽象出来的一种模板,它描述了一个事物的共同特征。
    • 类可以看作是人类大脑在思考过程中对一类事物的抽象和总结。
    • 类的主要作用是描述对象的状态和行为。

    类的组成部分

    • 属性(Attributes):描述对象的状态信息,通常采用变量的方式定义。
    • 方法(Methods):描述对象的行为信息。

    对象是什么?

    • 对象是现实世界中的具体个体,它具有独立的生活,并与其他对象发生交互。
    • 对象是类实例化的结果,通常用new运算符创建。

    类与对象的关系

    • 类是对象的模板,通过实例化操作生成对象。
    • 对象是类的具体实例,具有独立的状态和行为。

    Java中的引用数据类型

    在Java中,所有的.class文件都是引用数据类型。常见的引用数据类型包括:

    • String:字符串类型,由字符串类提供。
    • Student:程序猿自定义的学生类。

    引用机制

    • 在Java中,对象是通过引用访问的。引用是一个变量,保存了对象在堆内存中的内存地址。
    • Java不允许直接操作堆内存,只能通过引用间接访问对象内部的实例变量。

    Java内存模型

    Java的内存模型包括三个主要的内存区域:

  • 方法区内存(Method Area):存储类的定义、静态变量以及编译时的常量。
  • 栈内存(Stack Area):存储方法的局部变量和代码片段。
  • 堆内存(Heap Area):存储动态创建的对象实例。
  • 对象的内存分配

    • new运算符:用于在堆内存中创建对象,返回对象的引用。
    • 引用:引用是一个变量,只是保存了对象的内存地址。

    垃圾回收机制

    • Java的垃圾回收器自动管理堆内存中的对象。
    • 当没有任何引用指向一个对象时,该对象会被垃圾回收器回收。

    Java中的变量分类

    • 局部变量:在方法体内声明的变量,存储在栈内存中。
    • 成员变量:在类体内定义的变量,分为实例变量和静态变量。
      • 实例变量:前面没有static修饰符,存储在堆内存中。
      • 静态变量/类变量:前面有static修饰符,存储在方法区内存中。

    内存管理

    • 栈内存:存储方法的局部变量,线程私有。
    • 堆内存:存储对象实例,唯一性强调。
    • 方法区内存:存储类信息和静态变量,只有一个。

    垃圾回收条件

    • 没有任何引用指向某个堆内存中的对象时,该对象会被垃圾回收器回收。

    常见错误示例

    以下程序编译可以通过,但运行会抛出NullPointerException

    public class OOTest04 {
    public static void main(String[] args) {
    Customer c = new Customer();
    System.out.println(c.id); // 输出Customer对象的id字段
    c = null; // 将c引用设置为null
    System.out.println(c.id); // 调用null引用时会抛出NullPointerException
    }
    }

    原因分析

    • 在第一行Customer c = new Customer();中,创建了一个Customer对象,并将其赋值给变量c。
    • 在第二行System.out.println(c.id);中,输出了c的id字段。
    • 在第三行c = null;中,将c引用设置为null。
    • 在第四行System.out.println(c.id);中,尝试访问null引用,导致NullPointerException异常。

    解决方法

    • 在第三行后,可以使用System.gc()方法来触发垃圾回收器,将不再被引用访问的对象回收。
    • 或者在第三行后,可以使用System.out.println("c引用已经被设置为null了");来避免调用null引用。

    通过以上内容的学习和理解,你应该对面向对象编程有了更深入的理解。如果有任何疑问,欢迎在下文中提出!

    上一篇:10、集成开发环境IDE
    下一篇:8、JVM 三块内存

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月22日 21时27分06秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章