【问题标题】:Java: How To Call Non Static Method From Main Method?Java:如何从主方法调用非静态方法?
【发布时间】:2011-11-14 20:19:34
【问题描述】:

我正在学习 java,现在我遇到了以下问题:我将 main 方法声明为

public static void main(String[] args) {

..... }

在我的 main 方法中,因为它是 静态,我只能调用其他静态方法!!!为什么?

例如:我有另一个班级

 public class ReportHandler {       
     private Connection conn;   
     private PreparedStatement prep;
     public void executeBatchInsert() { ....
 } }

所以在我的主课中我声明了一个private ReportHandler rh = new ReportHandler();

但是如果它们不是静态的,我就不能调用任何方法。

这哪里出错了?

编辑:抱歉,我的问题是:如何“设计”应用程序以允许我从“起点”(static void main)调用其他类。

【问题讨论】:

    标签: java


    【解决方案1】:

    您只需要创建一个 ReportHandler 的实例:

    ReportHandler rh = new ReportHandler(/* constructor args here */);
    rh.executeBatchInsert(); // Having fixed name to follow conventions
    

    实例方法的重点在于它们是特定于类的特定实例的......所以您需要首先创建一个实例。这样,实例将可以在您的情况下访问正确的连接和准备好的语句。只是调用ReportHandler.executeBatchInsert,没有足够的上下文

    理解这一点非常重要:

    • 实例方法(和字段等)与特定实例相关
    • 静态方法和字段与类型本身有关,不是特定实例

    一旦你理解了根本的区别,你就不能在不创建实例的情况下调用实例方法......例如,问“的高度是多少 em> 人?” (对于特定的人)但问“人的身高是多少?”是没有意义的。 (不指定人)。

    假设您从一本书或教程中学习 Java,您应该阅读更多关于静态和非静态方法等的示例 - 这是理解的一个重要区别,您将拥有各种问题,直到你弄明白为止。

    【讨论】:

    • 我对静态(类)方法和非静态(实例)方法的区别有了基本的了解。我不明白的是,类方法创建自己类型的实例有什么意义。
    • @flies:为什么创建该类型的实例比任何其他方法更有意义?事实上,对于工厂方法(例如Integer.valueOf),这就是方法的全部point
    • 如果class {...} 定义了一个类,那么定义实例化正在定义的东西有什么意义呢?它还没有被定义,对吧?
    • @flies:它没有......不清楚你为什么认为它有......这是静态方法(例如 Integer.valueOf() 创建实例。
    • 静态方法是类定义的一部分,对吧?所以定义实例化了定义的东西?
    【解决方案2】:

    请找到答案:

    public class Customer {
    
        public static void main(String[] args) {
            Customer customer=new Customer();
            customer.business();
        }
    
        public void business(){
            System.out.println("Hi Harry");
        }
    }
    

    【讨论】:

      【解决方案3】:

      Java 是一种面向对象的编程,而不是过程编程。所以你的代码中的每一件事都应该是在操作一个对象。

      public static void main 只是您程序的入口。后面不涉及任何物体。

      那么什么是对象编码?很简单,你需要创建一个特定的对象/实例,调用它们的方法来改变它们的状态,或者在那个对象中执行其他特定的功能。

      例如就像

      private ReportHandler rh = new ReportHandler();
      rh.<function declare in your Report Handler class>
      

      因此,当您声明 静态 方法时,它不会与您的对象/对象实例相关联。这也违反了您的 O-O 编程。

      静态方法通常在该函数与后面的任何对象无关时被调用。

      【讨论】:

        【解决方案4】:

        您不能从静态方法调用非静态方法,因为“非静态”的定义意味着与类的实例相关联的东西。您在静态上下文中没有该类的实例。

        【讨论】:

          【解决方案5】:

          静态方法意味着您不需要在实例上调用该方法。非静态(实例)方法要求您在实例上调用它。所以想一想:如果我有一个方法 changeThisItemToTheColorBlue() 并且我尝试从 main 方法运行它,它会改变什么实例?它不知道。您可以一个实例上运行实例方法,例如someItem.changeThisItemToTheColorBlue()

          更多信息请访问http://en.wikipedia.org/wiki/Method_(computer_programming)#Static_methods

          【讨论】:

            【解决方案6】:

            您可以将静态成员函数视为无需对象存在即可存在的成员函数。例如,来自 Integer 类的 Integer.parseInt() 方法是静态的。当你需要使用它时,你不需要创建一个新的 Integer 对象,你只需调用它。 main() 也一样。如果您需要从中调用非静态成员,只需将您的主代码放入一个类中,然后从 main 中为您新创建的类创建一个新对象。

            【讨论】:

              【解决方案7】:

              您不能在没有实例创建的情况下从 main 调用非静态方法,而您可以简单地调用静态方法。 这背后的主要逻辑是,每当您执行 .class 文件时,所有静态数据都会存储在 RAM 中,但是,JVM(java 虚拟机)将创建上述类的上下文,其中包含该类的所有静态数据. 因此,无需创建实例就可以轻松地从类中访问静态数据。对象包含非静态数据 上下文只创建一次,而对象可以创建任意次数。 上下文包含方法、变量等。而对象仅包含数据。 因此,一个对象可以从类的上下文中访问静态和非静态数据

              【讨论】:

                【解决方案8】:

                既然你想从main调用一个非静态方法,你只需要创建一个包含非静态方法的类的对象,然后你就可以使用objectname调用该方法。方法名(); 但是如果你把方法写成静态的,那么你就不需要创建对象,你就可以使用 methodname(); 从 main 调用方法。而且这会更有效,因为它比没有静态方法创建的对象占用更少的内存。

                【讨论】:

                  【解决方案9】:

                  了解静态关键字的有用链接 https://www.codeguru.com/java/tij/tij0037.shtml#Heading79

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-26
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-08-25
                    相关资源
                    最近更新 更多