【问题标题】:Class method vs main methods类方法与主要方法
【发布时间】:2011-07-21 20:55:15
【问题描述】:

我对用方法创建一个类和在下面有一个主方法和方法的概念感到困惑。

这里到底有什么不同?一种方式比另一种方式更好吗?什么情况下需要main下的方法而不是类?

这将有助于我理解一个项目——一个基本的掷骰子游戏,它将包含一个射手类、骰子类和一个掷骰子类(显然包含主类)。

【问题讨论】:

    标签: java methods


    【解决方案1】:

    您没有“主要”方法。所有方法都是类方法,唯一的区别是“静态”方法(例如 main)不需要您实例化一个新对象(通过“new”语句)来使用它们。

    换句话说:

    public class MyClass {
      public static void myStaticMethod() {
      }
    
      public void myInstanceMethod() {
      }
    }
    

    你可以的

    MyClass.myStaticMethod()
    

    但要使用 myInstanceMethod,您必须创建一个对象

    (new MyClass).myInstanceMethod;
    

    通常你做的最后一件事是

    MyClass myObject = new MyClass();
    myObject.myInstanceMethod();
    

    注意,你也可以这样做

    myObject.myStaticMethod();
    

    但和做的完全一样

    myClass.myStaticMethod();
    

    第一种方式被认为是糟糕的风格,通常会导致编译器警告。


    @Miranda 因为只使用静态方法,您就失去了所有面向对象的部分,并且您最终会像使用普通 C 一样使用 Java。

    在对象中,您同时拥有状态和方法。在类中,您存储对象状态和方法。例如,通常您可以创建一个“Card”类,创建一个卡片“new Card('K', "Leaf")”,并拥有操作它的方法(“uncoverCard()”)。

    一旦你获得了你想要的对象的引用,你就可以使用它的方法,并且你知道你只是在影响这个对象,并且你正在使用正确版本的方法(因为你正在使用为就是这个类)。

    从过程式编程切换到面向对象编程一开始可能看起来很困难。继续尝试,查看教程代码并在需要时寻求建议,您很快就会理解它。

    【讨论】:

    • 那么我为什么不希望一切都是静态的呢?必须创建一个对象而不是仅仅说“你的静态,足够好”的目的是什么? (也许这个问题太新手了,我应该稍后在课堂上看看)
    • static 意味着它的值对于同一类的不同对象保持不变。每个对象代表一个类的一个版本,并且每个版本都彼此不同。在这些版本中的每一个中,您可能对 CitizensOfAmerica 类都有一个不变的发言权,它将有一个可变的静态 String nationality = "American",对于每个 CitizenOfAmerica 来说都将保持不变
    【解决方案2】:

    基本上这是一个分离的问题。您为可重用性创建类。如果一切都在主类中,那么您的代码将无法维护。主类用作应用程序的起点。如果您在主类中做了所有事情,您将无法利用面向对象编程提供给您的所有优势。当您进入课程时,您将了解更多有关它的信息。但基本上,您将创建的每个类都有单一的职责。甚至是负责运行程序的主类。

    顺便说一句,祝你的课好运。也许它会给你在赌场的优势。

    【讨论】:

      【解决方案3】:

      Java 应用程序的入口点是它的主方法:

      public static void main(String[] args){
        // Do stuff here
      }
      

      此方法与其他方法的不同之处在于:

      1. 应用程序的入口点,因此它将是第一个 调用方法和基本初始化的事情应该在这里完成。
      2. 这是一个static-方法,无需创建 持有它的类的实例。

      这个static-thing 最好如下说明:

      public class Test{
      
          public int addOne(int number){
              return number++;
          }
      
          public static int drawOne(int number){
              return number--;
          }
      
      }
      
      // Create our Int:
      int value = 12;
      
      // This will work because the method
      // is a static one:
      System.out.println( Test.drawOne(value) ); // Outputs 11
      
      // This won't work because it's a non-
      // static method:
      System.out.println( Test.addOne(value) ); // Error
      
      // But this will work:
      Test ourTest = new Test();
      System.out.println( ourTest.addOne(value) ); // Outputs 13
      

      用 Java 编写的应用程序通常只有一个 main-Method,它声明了应用程序第一次启动的点。

      如果你想用变量、对象等做一些事情,你会想创建自己的方法/类,但它们不会是 main-Methods。

      【讨论】:

        【解决方案4】:

        首先,方法中不能有其他方法。每个方法都必须是类的一部分。 main方法(其实就是你说的main方法)和其他方法的区别在于程序的执行是从main方法开始的。

        方法表示已组合在一起的功能或一组指令。而类是一组定义实体(如 Shooter、Die)的方法和变量。

        因此,您将有一个 Die 类,其中包含仅包含特定于 die 的方法的方法,一个带有特定于 Shooter 的方法的 Shooter 类和一个 Craps 类,游戏将从那里开始,它利用 Die 的方法和射击类来完成游戏。

        【讨论】:

          【解决方案5】:

          我相信这里的其他一些人能够比我更好地解释这一点,但我会试一试。

          所以,如您所知,您的 main 方法是程序的入口点。这是执行的第一件事。您可以在同一个类中添加其他方法,但这些方法是静态方法,因为您无法实例化包含 main 的类(至少我认为您不能;我从未真正尝试过)。

          创建类和定义方法的目的是让您可以从该类中创建对象。例如,在您的情况下,您创建了一个 Die 类。然后,您可以从该类创建 Die 对象。将一个类视为一种模型或模具,您可以从中创建对象。创建这些对象后,它们每个都有自己的数据成员(在类中定义的变量)。假设在您的 Die 类中定义了两个变量 die1 和 die2,您创建的每个 Die 对象都将有一个 die1 和 die2 变量,但是每个 Die 对象可以为这些变量保存不同的值。

          现在,假设您在 die 类中创建一个修改这些变量的方法(一个 setter 方法)并调用它public void setDie1(int value) 然后您可以通过在 Die 对象上调用该方法来修改 die1 变量的值类似于myDieObject.setDie1(3)

          总而言之,如果您只是将方法与主方法放在同一个类中,那么您将无法从同一个类创建多个对象。

          起初这可能是一个难以理解的概念,但随着您了解更多,它会很快弄清楚。我希望这会有所帮助!

          【讨论】:

            【解决方案6】:

            主要方法

            这是运行 Java 应用程序所需的唯一方法。该方法必须有一个非常具体的签名public static void main(String[] args)。它需要这个特定签名的原因是因为 Java 虚拟机 (JVM) 需要找到它才能执行您的程序。 JVM 是您安装在计算机上以运行程序的 Java 运行时“东西”。更准确地说,Java 运行时环境 (JRE) 包含 JVM。 String[] args 是该方法在执行程序时从命令提示符接受的 0 个或多个参数。简单的程序通常不需要从命令提示符传递任何参数。

            Java 初学者可能会感到困惑的是,似乎许多项目在每个.java 文件中都有主要方法。这不是必需的。这样做是为了使每个类都可以与其依赖项隔离运行。在一个项目(应用程序)中,只需要一个类有一个 main 方法。

            其他方法

            ma​​in 方法以外的方法是可选的。如果你愿意,你可以将 100% 的程序逻辑放在 main.js 中。但是,你可以理解这个问题。如果您这样做,您的代码将只能执行非常特定的步骤序列。回到模块化编程之前的日子,这就是它的完成方式。因此,如果您需要编写一个功能稍有不同的程序,则需要编写一个新程序。它不是很有效,但它仍然有效。在“模块化编程”成为一件事之后几年快进,现在你必须编写必须对事件做出反应的程序。例如,用户将鼠标悬停在按钮上。事件的问题在于事件是不可预测的。您不仅不知道事件何时发生,而且您也无法预测它们将发生的顺序。因此,将所有逻辑包含在单个函数(即 main)中将不起作用,并且在 main 中编译“不同”的步骤序列也可能不起作用,因为您无法预测 WHEN 和 HOW。

            方法允许您按照规定的顺序封装非常小的执行单元。假设是,只要情况需要,就必须执行相同的步骤序列。因此,您将代码模块化并提取那些您知道将始终按该顺序执行的小序列,并将其放入某个“方法”中,以便您可以在我需要时调用该步骤序列。

            示例

            没有命令行参数的简单程序

            public class MyProgram {
                public static void main(String[] args) {
                   System.out.println("Hello World!");
                }
            }
            

            当您从命令提示符执行编译单元时,您将输入java MyProgram,然后在控制台中您将看到“Hello World!”

            public class MyProgram {
                public static void main(String[] args) {
                   System.out.println("Hello " + args[0]);
                }
            }
            

            但是,在上面的程序中,如果不提供参数,执行时会抛出异常。但是,如果您传递至少一个参数,它将显示第一个参数并忽略其余参数。例如,java MyProgram Hector Fontanez 将显示“Hello Hector”

            在这两个示例中,JVM 调用了main 方法来执行。

            public class MyProgram {
                public static void main(String[] args) {
                   showGreeting("Hello " + args[0]);
                }
                public static void showGreeting(String greeting) {
                    System.out.println(greeting);
                }
            }
            

            在最后一个示例中,我创建了一个名为 showGreeting 的函数。与main 方法相反,我作为程序员决定何时何地调用这个函数,而不是JVM。在函数中,我提取了我认为该方法需要执行以“显示问候语”的功能。我知道我的例子只有一行。但你明白了。随着程序的增长,我可以多次从程序的其他部分调用showGreeting,作为一名程序员,我认为这是我的应用程序完成所需工作所必需的。不仅如此,在 main 方法中,传递的参数不一定与可以从程序其他部分传递的参数相同。

            最后,您需要了解什么是静态方法和非静态方法,还要了解publicprotectedprivate 和默认(无关键字)访问修饰符的作用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-01-14
              • 1970-01-01
              • 2018-02-20
              • 1970-01-01
              • 2017-06-17
              • 2015-10-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多