面向对象编程中的主要职责是什么?


10

我是面向对象编程的新手,但我不明白主对象的目的是什么。

是的,我读到它是程序的“入口点”,但是我不明白的是程序的主要内容是什么?它的职责是什么?

可能会发生将主体编写的内容封装到另一个对象中的情况,但是您应该使用这种方法多少呢?

这是我用Java编写的第一个主语言,它很简单,但是可能会让您更好地理解我的疑问。我有一个抽象类Animal,它由“ Cat”和“ Dog”扩展。我使用main来创建一些对象,并使用它作为与用户的“接口”,确实如您所见,我使用了一些条件指令来“询问用户”他想做什么。

我的问题来自于这样一个事实,即接口可以封装在另一个对象中,而不是把责任交给主要对象。

    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    System.out.println("What type of animal do you want to create? \n dog cat");
    String type = input.nextLine();
    if ( Objects.equals(type, "dog")){
        System.out.println("Enter the animal's age: ");
        int age = input.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter the animal's name: ");
        String name = input.next();
        Dog first = new Dog(name, age);
    }
    else if ( Objects.equals(type, "cat")) {
        System.out.println("Enter the animal's age: ");
        int age = input.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter the animal's name: ");
        String name = input.next();
        Cat first = new Cat(name, age);
    }

    else{
        System.out.println("Error: the specified type does not exist.");
    }
    System.out.println("The number of animals is:" + numberOfAnimals);
}

2
main功能不是OOP的概念。
Andres F.

Answers:


10

首先,您的示例不是面向对象的程序。这是一个程序程序,恰好将数据存储在对象中,因为这是您的语言(Java?)提供的用于结构化数据的工具。

真正的面向对象程序由相互交互的对象组成-它是关于行为而不是数据的(我意识到这是一个有争议的声明,因此,在此链接中,您可以从具有更多凭据的人员那里看到多个面向对象的定义而不是我;请注意,其中大多数都出现了行为)。

在一个真正的面向对象的程序中,根据我使用的定义,您具有相互交互的独立对象。该main功能的作用是创建初始对象并将它们连接在一起。

举一个简单的例子,考虑一个基于数据库的Web应用程序。该应用程序可以通过多种方式分解为对象,但这是其中之一:一个Networking接受连接,解析HTTP请求并分派到适当Controller对象的对象,该Database对象与对象进行交互并产生响应(如果您愿意)将一个或多个View对象与每个控制器相关联,请随意这样做)。您还可以添加一个Threadpool对象以提供单独的执行流。

main在此应用程序中的角色可能是:

  1. 创建Database对象
  2. 创建所有Controller对象,并将它们与Database对象关联
  3. 创建Network对象,并将所有Controller对象与其关联。
  4. 开始Network运行对象(这可能还涉及创建Threadpool和将其连接到中Network)。

这些设置步骤可以在中明确指定main,也可以由其他对象处理。例如,在典型的Spring应用程序中,该main功能所要做的就是创建应用程序上下文(单个对象)。这将触发该应用程序上下文的配置中提到的所有对象的创建和连接。


1
请参阅Newspeak以获取一种语言,它非常重视OO,以至于main甚至没有方法之类的东西。
约尔格W¯¯米塔格

1
好的答案,但是如果我是你,我也会提到依赖注入。
Arseni Mourzenko '16

我明白了您对我的代码不是面向对象的意思。我没有注意到,但是实际上,我创建的对象没有任何行为。为了使它“更多面向对象”,可以创建一个其他对象来“使用”我已经拥有的对象,但是,最好不要在没有方法的情况下完全没有对象吗?
埃里亚

@Elia-不,不会更好。对结构化数据进行类型化和命名具有价值(相对于将数据转储到中Map)。但是Java只提供了一种方法来做到这一点(相对于C ++,后者区分结构和类)。因此,定义没有行为的类,因为这会使您的程序更易于理解,但要认识到这样做不会使您的程序“面向对象”。
kdgregory

1

这要看情况。将其带到两个极端:

  1. 将所有代码逐行放入main。这样可以编译并很好地运行。但是对于人类来说,代码将是不可消化的。
  2. 只需放置一个函数main并调用它doWhatNeedsToBeDone,最后以相同的方式继续执行此例程即可。现在您已经很整洁了,main但是当然,您没有得到需要做的事情。

因此,真相介于两者之间。尝试创建一个main适合一页的内容,以便某人可以了解需要执行的主要说明。获得正确的边界只是经验问题。

以上是一般规则,适用于OO以及功能编程。


1

静态主方法的存在是从非面向对象的世界到面向对象的世界的过渡。至少从80年代的C ++开始,就已经采用这种方式。

静态方法本质上是非面向对象的方法:它们可以是过程方法;它们可以是过程方法。它们可能是功能方法。静态方法的概念实质上是OOP向其他编程范例的转义。

Java,C#和C ++都使用静态主体作为从传统C样式主体到其各自编程语言的过渡,您现在可以从中选择是否使用对象(或不使用)。

这些语言可能需要原始实例对象而不是静态主体,但是却选择了静态主体方法。使用实例方法替代方法,main该类将是该类的子thread类,并且语言运行时将产生main该类的初始对象实例,然后调用其run实例方法,就像启动/创建其他线程一样。

但是从历史上看,它却是用另一种方式来完成的:在某种程度上,这些语言是紧随其后的;在某种程度上,由于当时线程技术并不是优先考虑的事情,因此他们使用了更简单的静态方法。

同样,静态的主要方法是“更简单”的,因为您不必使用子类化,因此琐碎的教程程序hello world在某种意义上更简单(但是它们使用的是相对莫名其妙的static,当您在学习时很难向某人解释尝试先教OOP。)


-1

Main()方法用于运行程序

责任-开始运行程序后,Main()方法将调用其他方法来开始运行程序。

这是一个简单的答案,可以帮助我理解Main()方法的职责。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.