Java:如何从main方法调用非静态方法?

时间:2011-09-11 17:16:09

标签: java

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

public static void main(String[] args) {

..... }

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

例如:我有另一个班级

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

所以在我的主要班级中我宣布一个private ReportHandler rh = new ReportHandler();

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

哪里出错了?

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

9 个答案:

答案 0 :(得分:59)

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

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

实例方法的重点在于它们特定于特定于类的特定实例...因此您需要首先创建实例。这样,实例将在您的情况下访问正确的连接和准备好的语句。只需拨打ReportHandler.executeBatchInsert,就没有足够的上下文

了解这一点非常重要:

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

一旦你理解了这个根本区别,你就不能在不创建实例的情况下调用实例方法......例如,有必要问一下,“的高度是什么

假设您从书籍或教程中学习Java,您应该阅读更多静态和非静态方法的示例等 - 这是至关重要的区分,您将拥有各种各样的问题,直到你明白它为止。

答案 1 :(得分:19)

请找回答:

{{1}}

答案 2 :(得分:6)

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

public static void main 只是您计划的条目。它不涉及任何对象。

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

e.g。就像

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

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

当该函数与后面的任何对象无关时,通常会调用 static 方法。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

http://en.wikipedia.org/wiki/Method_(computer_programming)#Static_methods的更多信息。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果没有创建实例,则无法从main调用非静态方法,而只需调用静态方法即可。 这背后的主要逻辑是,无论何时执行.class文件,所有静态数据都存储在RAM中,然而,JVM(java虚拟机)将创建上述类的上下文,该类包含该类的所有静态数据。 因此,在没有实例创建的情况下很容易从类中访问静态数据。对象包含非静态数据 上下文只创建一次,而对象可以创建任意次。 context包含方法,变量等。而object只包含数据。 因此,一个对象可以从类的上下文访问静态和非静态数据

答案 7 :(得分:0)

由于要从main调用非静态方法,因此只需创建一个由非静态方法组成的类的对象,然后便可以使用 objectname调用该方法。 methodname(); 但是,如果您将方法编写为静态方法,则无需创建对象,并且可以使用main中的 methodname(); 来调用该方法。与不使用静态方法创建的对象相比,此方法将占用更少的内存,因此效率更高。

答案 8 :(得分:0)

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