我正在学习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
)调用其他课程。
答案 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)