📜  Java中的对象模型

📅  最后修改于: 2022-05-13 01:54:36.149000             🧑  作者: Mango

Java中的对象模型

对象模型是一个系统或接口,基本上用于在软件应用程序中根据对象可视化元素。它使用面向对象技术建模,在完成任何编程或开发之前,对象模型用于创建系统模型或体系结构。它定义了系统的面向对象特性,如继承、封装和许多其他面向对象的接口。让我们深入学习一些面向对象的术语:

对象和类

这些构成了Java或任何其他面向对象编程语言中的面向对象范式的基础。它们在这里详细解释:

目的

在面向对象的环境中,对象是物理或概念上的现实世界元素。

特征:

  1. 独特且有别于系统中的其他对象。
  2. 指示属于特定对象的某些属性和值的状态。
  3. 表示其与其他对象或其外部可见活动的交互的行为。

物理对象的示例是狗或人,而概念对象的示例是过程或产品。

班级

一个类是一个对象的蓝图或原型,代表了一组由相同对象创建的对象。对象基本上是这些类的实例。一个类包括 -

  • 同一类的对象可以在属性值方面彼此不同。这些属性称为类数据。
  • 识别和显示这些对象行为的操作称为函数和方法。

例子:

假设有一个名为 Student 的类。这个类的属性可以是——

  • 学生成绩
  • 学生就读的部门
  • 一学年的学习
  • 个人身份,即姓名、卷号、出生日期等。

可以使用以下功能指示要执行的一些操作 -

  • averageMarks() – 计算学生的平均分数。
  • totalMarks() – 计算学生的总分。
  • libraryFine() - 计算学生迟到图书馆需要支付的罚款。

这在下面的代码中得到了证明:

Java
// package whatever
 
import java.io.*;
 
public class Student {
     
  public static void main (String[] args) {
        // passing parameters to functions
        int tot = total_marks(93,99);
        double avg = avg_marks(tot, 2);
     
        // printing the output
        System.out.println("The total marks is = "+tot+". Th average is = "+avg+".");
    }
   
  // function to calculate total
  public static int total_marks(int math, int science) {
    int total = math + science;
    return total;
  }
 
  // function to calculate average marks
  public static double avg_marks(int total, int num_subs) {
   double avg = total/num_subs;
   return avg;
  }
}


Java
// package whatever
 
import java.io.*;
 
public class Student {
 
   private int rollNo;
   private String name;
   private String dep;
 
    // default constructor
    public Student() {}
 
    public Student(int rollNo, String name, String dep)
    {
        this.rollNo = rollNo;
        this.name = name;
        this.dep = dep;
    }
 
    // Methods to get and set the student properties
    public int getRollNo() { return rollNo; }
 
    public void setRollNo(int rollNo)
    {
        this.rollNo = rollNo;
    }
 
    public String getName() { return name; }
 
    public void setName(String name) { this.name = name; }
 
    public String getDep() { return dep; }
 
    public void setDep(String dep) { this.dep = dep; }
 
    // function to calculate total
    public static int totalMarks(int math, int science)
    {
        int total = math + science;
        return total;
    }
 
    // function to calculate average marks
    public static double avgMarks(int total, int num_subs)
    {
        double avg = total / num_subs;
        return avg;
    }
 
    public static void main(String[] args)
    {
        // setting student attributes
        Student s1 = new Student(23, "Deepthi", "CSE");
        // setRollNo(23);
        // setName("Deepthi");
        // setDep("CSE");
         
        // printing student attributes
        System.out.println(
            "Roll number of student : " + s1.getRollNo()
            + ". The name of student : " + s1.getName()
            + ". Department of the student : " + s1.getDep() + ".");
       
        // passing parameters to functions
        int tot = totalMarks(93, 99);
        double avg = avgMarks(tot, 2);
       
        // printing the output
        System.out.println("The total marks is = " + tot
                           + ". The average is = " + avg
                           + ".");
    }
}


Java
class Vehicle {
    String belongsTo = "automobiles";
}
public class Car extends Vehicle {
    int wheels = 4;
    public static void main(String args[])
    {
        Car c = new Car();
        System.out.println("Car belongs to- "
                           + c.belongsTo);
        System.out.println("Car has " + c.wheels
                           + " wheels.");
    }
}


输出:

The total marks is = 192. Th average is = 96.0.

封装和数据隐藏

为了保护我们的数据不被外部使用访问和利用,我们需要执行封装。这在下面详细解释 -

封装

在一个类中将方法和属性绑定在一起的过程称为封装。如果接口由类提供,则只有封装允许外部访问内部细节或类属性。

数据隐藏

保护对象免受外部方法直接访问的过程称为数据隐藏。

例子:

  • setStudentValues() – 为学生的部门、学术和所有个人身份分配值。
  • getStudentValues() – 获取存储在各自属性中的这些值。

消息传递

使应用程序具有交互性需要许多对象。消息使用以下功能在对象之间传递 -

  • 在消息传递中,可以涉及来自不同进程的对象。
  • 类方法需要在消息传递中调用。
  • 在两个对象之间,消息传递通常是单向的。
  • 在消息传递中启用两个对象之间的交互。

上面的示例在下面的代码中演示 -

Java

// package whatever
 
import java.io.*;
 
public class Student {
 
   private int rollNo;
   private String name;
   private String dep;
 
    // default constructor
    public Student() {}
 
    public Student(int rollNo, String name, String dep)
    {
        this.rollNo = rollNo;
        this.name = name;
        this.dep = dep;
    }
 
    // Methods to get and set the student properties
    public int getRollNo() { return rollNo; }
 
    public void setRollNo(int rollNo)
    {
        this.rollNo = rollNo;
    }
 
    public String getName() { return name; }
 
    public void setName(String name) { this.name = name; }
 
    public String getDep() { return dep; }
 
    public void setDep(String dep) { this.dep = dep; }
 
    // function to calculate total
    public static int totalMarks(int math, int science)
    {
        int total = math + science;
        return total;
    }
 
    // function to calculate average marks
    public static double avgMarks(int total, int num_subs)
    {
        double avg = total / num_subs;
        return avg;
    }
 
    public static void main(String[] args)
    {
        // setting student attributes
        Student s1 = new Student(23, "Deepthi", "CSE");
        // setRollNo(23);
        // setName("Deepthi");
        // setDep("CSE");
         
        // printing student attributes
        System.out.println(
            "Roll number of student : " + s1.getRollNo()
            + ". The name of student : " + s1.getName()
            + ". Department of the student : " + s1.getDep() + ".");
       
        // passing parameters to functions
        int tot = totalMarks(93, 99);
        double avg = avgMarks(tot, 2);
       
        // printing the output
        System.out.println("The total marks is = " + tot
                           + ". The average is = " + avg
                           + ".");
    }
}

输出:

Roll number of student : 23. The name of student : Deepthi. Department of the student : CSE.
The total marks is = 192. The average is = 96.0.

遗产

通过维护其部分或全部属性从现有类生成新类的过程称为继承。可以生成其他类的原始类是分类父类或超类或基类,而生成的类称为派生类或子类。

例子:

对于 Vehicle 类,派生类可以是 Car、Bike、Bus 等。在此示例中,这些派生类传递其父类 Vehicle 的属性以及它们自己的属性,如车轮数、座位数等。上面的示例在以下代码中演示 -

Java

class Vehicle {
    String belongsTo = "automobiles";
}
public class Car extends Vehicle {
    int wheels = 4;
    public static void main(String args[])
    {
        Car c = new Car();
        System.out.println("Car belongs to- "
                           + c.belongsTo);
        System.out.println("Car has " + c.wheels
                           + " wheels.");
    }
}

输出:

Car belongs to- automobiles
Car has 4 wheels.

继承类型

  1. 单一继承——从单一基类生成的一个派生类。
  2. 多重继承——从两个或多个基类生成的一个派生类。
  3. 多级继承——一个派生类是从一个基类生成的,该基类也是从另一个基类生成的。
  4. 层次继承——从基类生成的一组派生类,而基类又可能有自己的派生类。
  5. 混合继承——由多级和多重继承组合而成的格结构。

多态性

对象可以具有具有不同内部结构的公共外部接口的能力。在实现继承的同时,多态性特别有效。在多态中,函数可以具有相同的名称但可以具有不同的参数列表。

示例: Car 和 Bus 类都可以有 wheel() 方法,但是两者的轮子数量不同,因此由于内部实现不同,因此不会出现冲突。

泛化和专业化

派生类从基类生成的不同类层次结构的表示 -

概括

来自派生类的共同特征的组合,以形成一个通用的基类。示例——“牛是陆地动物”。

专业化

对象从现有类到专门组的区别是专门化。这几乎就像泛化的逆过程。

下图展示了泛化与专业化——

链接和关联

链接:对象与其他对象协作的连接表示,即对象之间的关系称为链接。

关联:识别和展示对象之间行为的一组链接称为关联。关联的实例称为链接。

关联度

协会分为三种类型:

  • 一元关系:同一类的对象得到连接。
  • 二元关系:连接两个类的对象。
  • 三元关系:连接三个或更多类的对象。

二元关联的基数

  • 一对一:A 类的一个对象与 B 的一个对象相关联。
  • 一对多:A 类的一个对象与 B 类的多个对象关联。
  • 多对多:A 类的多个对象与 B 类的多个对象相关联。

组合或聚合

一个类通常可以使用其他类和对象的组合来创建。这是类组合或聚合。关系的“有”或“部分”通常是总和。如果一个对象由其他对象组成,则该对象称为聚合对象。

例子:

在学生与书籍的关系中,学生“拥有”书籍,而书籍是学生课程的“一部分”。在这里,学生是完整的对象。一个集合包括——

  • 物理遏制——例如,一个袋子由拉链和一个瓶架组成。
  • 概念遏制——例如,学生有分数。

对象模型的优点

  • 启用 DRY(不要重复自己)编写代码的方式。
  • 在集成复杂系统的同时,降低开发风险。
  • 实现快速的软件开发。
  • 很容易实现升级。
  • 使软件更易于维护。