深入理解类与对象

211 阅读5分钟

屏幕截图 2025-01-15 200117.png

前言

  • 学习之路需深耕细作,切勿轻视任一知识点,因其存在必蕴含深意

类与对象,面向对象编程的两大基石,它们不仅定义了程序的结构,还赋予代码生命与灵活性。从简单的数据封装到复杂的功能实现,类与对象无处不在。

  • 类是对象的抽象化,对象是类的实例化。
  • 类是由一组具有相同属性和方法的对象抽象来的

尝试理解下图示例

屏幕截图 2025-01-15 111127.png

我们将边牧、拉布拉多、柯基这三个“对象”具有的相同属性和方法都抽象出来给到一个类,取名为“”,这样我们就得了一个,类名为狗。

所以现在边牧、拉布拉多、柯基这三个都属于“”这个类,而边牧、拉布拉多、柯基分别都是“”这个类的实例化对象。需要有这样一个概念

  1. 定义 :类是对象的抽象,是创建对象的蓝图或模板。它定义了对象的属性(状态)方法(行为),描述了具有相同属性和方法的一组对象。

通俗理解:生活中能被称为“一类人”的群体,一定是具有一个或多个相同的特性的,在计算机世界中这个群体就被定义为类。其中,相同的特性就被定义为方法或属性,这个群体中具体的某一个人就被定义为对象

  1. 类的抽象性:类是对现实世界事物的抽象表示,隐藏了内部实现细节,只暴露必要的接口

通俗理解:我知道“狗”这个类中有“叫(woof)”这个方法,当我需要实现“叫”的方法时,只需要调用即可,不用关心“叫”这个方法是如何实现的。

  1. 类的分类
  • 实体类:用于映射需求中的每个实体,保存需要存储在永久存储体中的信息。实体类的属性和关系通常是永久性的,甚至在系统的整个生存周期中都需要。例如,在学校教学系统中,有学生类、教师类和课程类等。

  • 边界类:用于描述系统与外部实体之间的交互,例如用户界面、外部接口等。边界类负责接收外部输入并将其转换为系统内部可以处理的数据格式,同时向外部实体提供系统输出。

  • 控制类:负责协调系统中各个实体类之间的交互,以及管理系统的流程控制。控制类通常不包含业务逻辑,而是将用户请求传递给相应的实体类进行处理,并返回处理结果。

对象

  1. 定义:对象是数据作用于数据上的操作封装体。是类的实例化结果,它具有属性(状态)和方法(行为),并可以与其他对象进行交互。
  2. 对象的特性
  • 属性:是对象的静态特征,是用来描述对象的数据或状态。

  • 方法:是对象的动态特征,是用来描述对象的行为或操作。

  • 唯一性:每个对象都是独一无二的,具有自己的属性和状态。(就算两个对象具有相同的属性与方法,他们的内存地址还是不一样的)

类与对象的关系

  1. 类是对象的蓝图:类定义了对象的结构和行为,是创建对象的依据。
  2. 对象是类的实例化:通过类的定义,可以创建出具有特定属性和行为的对象实例。
  3. 相互依赖:类和对象相互依存,没有类就没有对象,没有对象类也就失去了存在的意义。

直接上图

屏幕截图 2025-01-15 113553.png

方法与方法调用

//在Dog类中声明一个Woof方法
class Dog { 
    void Woof([Type param1, Type param2, ...]) {
    // 方法体 
    } 
}
  • Dog是类名
  • WoofDog类中的一个方法
  • void表示方法的返回类型是 void,即不返回任何值。你也可以指定其他返回类型,如 intString、自定义类等。
  • param1, param2, ... 是方法的参数,括号内可以省略参数表示方法不接受任何参数。

举个例子:

// 定义第一个类:Person 
class Person { 
    String name; 
    int age; 
    // 构造函数 
    Person(this.name, this.age); 
    // 实例方法:介绍自己 
    void introduce() {
        print("Hello, my name is $name and I am $age years old.");
    }
    // 实例方法:与另一个Person对象打招呼 
    void greet(Person other) { 
        print("$name says hello to ${other.name}!");
    } 
} 
// 定义第二个类:
Greeter class Greeter { 
    // 静态方法:打招呼并介绍Person对象 
    static void greetAndIntroduce(Person person) { 
        print("Greeter says hello!"); 
        person.introduce();
    } 
    // 实例方法:让两个Person对象相互打招呼 
    void letPersonsGreetEachOther(Person person1, Person person2) { 
        person1.greet(person2); 
        person2.greet(person1); 
    } 
} 
// 主函数
void main() { 
    // 创建两个Person对象
    Person alice = Person("Alice", 30);
    Person bob = Person("Bob", 25);
    // 使用Greeter的静态方法 
    Greeter.greetAndIntroduce(alice); 
    // 创建Greeter对象 
    Greeter greeter = Greeter(); 
    // 使用Greeter的实例方法
    greeter.letPersonsGreetEachOther(alice, bob); 
}

//输出:
//Greeter says hello!
//Hello, my name is Alice and I am 30 years old. 
//Alice says hello to Bob!
//Bob says hello to Alice!

Person类

  • 包含两个属性:nameage
  • 包含一个构造函数,用于初始化这两个属性。
  • 包含两个方法:introduce(介绍自己)和greet(与另一个Person对象打招呼)。

Greeter类

  • 包含一个静态方法:greetAndIntroduce,该方法首先打印一条问候信息,然后调用传入的Person对象的introduce方法。
  • 包含一个实例方法:letPersonsGreetEachOther,该方法让两个Person对象相互调用greet方法。

主函数

  • 创建了两个Person对象:alicebob
  • 调用了Greeter类的静态方法greetAndIntroduce,传入alice对象。
  • 创建了一个Greeter对象greeter
  • 调用了greeter的实例方法letPersonsGreetEachOther,传入alicebob对象。