我正在开展一个项目,但我遇到了一些我还不完全了解的事情。
每当我想从另一个类调用一个方法,或者使用jform中的一个变量时,我的netbeans就说我需要做一个"静态"。现在我理解静态意味着什么,并且我已经从使用方法的类中创建了对象,但即便如此,netbeans也说我需要先使对象静态,然后才能在MAIN()方法中使用它。甚至像组合框这样的jform变量。
有人可以解释一下吗?
提前谢谢!编辑:
这是我项目中的一些代码。它非常小但它应该澄清问题:
主要类:
public class SpeeloTheek {
/**
* @param args the command line arguments
*/
public static Controller MainController = new Controller();
public static SummaryScreen MainSummaryScreen = new SummaryScreen();
public static void main(String[] args) {
// TODO code application logic here
MainSummaryScreen.setVisible(true);
MainController.SetFullScreen(MainSummaryScreen);
MainController.ComboBoxItemSelected(SummaryScreen.choiceBox);
}
控制器类:
package speelotheek;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class Controller {
//Method to make JFrame fullscreen//
public void SetFullScreen(JFrame frameToUse) {
frameToUse.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
public void ComboBoxItemSelected(final JComboBox comboBoxToUse) {
comboBoxToUse.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
WhichSummary(comboBoxToUse);
}
}
});
}
public void WhichSummary(JComboBox comboBoxToUse) {
System.out.println(comboBoxToUse.getSelectedItem());
}
}
EDIT2:
全部谢谢:)我发现了问题。我在main方法中实例化了类,而不是在main方法之上,它起作用了:)
答案 0 :(得分:2)
为了调用类的非静态成员,您需要实例化一个对象。
示例:
Foo myObject = new Foo(); // myObject is an object of class Foo
Foo.callToStaticMember(); // static members can be called using the class name
myObject.callToNonStaticMember(); // non-static members require an object of the class
答案 1 :(得分:2)
这是因为你的main方法是静态方法。
从静态方法中,您无法调用非静态方法或变量。 您需要将main方法更改为构造函数。 然后,当您创建此类的新实例时,将执行此代码。
答案 2 :(得分:1)
如果您尝试从main方法访问非静态方法。它不会起作用。原因是,静态方法/变量不属于类的实例。
如果确实需要在另一个类的main方法中访问非静态方法。唯一的方法是通过类的实例。
所以,你需要说
MyClass object = new MyClass();
object.aMethod();
修改强>
您希望您的应用程序全部是静态的吗?基本上,静态意味着它只有一个内存位置。因此,例如:如果用户在一个屏幕上选择单选按钮。它修改了代码中的值,而另一个用户选择了另一个单选按钮,它将覆盖以前用户的值。
你需要做的就是这样。
public static void main(String[] args) {
// TODO code application logic here
Application appObject = new Application();
appObject.setController(new Controller());
appObject.setSummaryScreen(new SummaryScreen()); // Or pass these values through a constructor. Setters are just one way to do it. Or better yet, use Spring DI.
appObject.performAction();
}
public Class Application {
public Controller MainController ;
public SummaryScreen MainSummaryScreen ;
.... getters and setters of these instance variables.
public performAction(){
MainSummaryScreen.setVisible(true);
MainController.SetFullScreen(MainSummaryScreen);
MainController.ComboBoxItemSelected(SummaryScreen.choiceBox);
}
}
答案 3 :(得分:1)
如果您正在使用Netbeans GUI Builder,那么您要做的是使用构造函数而不是main
方法
public NewJFrame() {
initComponent();
jComboBox1.addItem("Hello");
// do everything with your components here
}
GUI Builder声明的所有对象都是非静态的。它们不是要从main
访问它们。
答案 4 :(得分:0)
当你在main方法中工作时,这是静态的
public static void main(String[] args){
}
你只能调用静态元素,例如类,枚举或静态方法。
如果要从main方法调用类的方法成员,则有两个选项
使方法成为静态
class ClassA{
public static void methodOne(){
}
}
public static void main(String[] args){
ClassA.methodOne();
}
在main中实例化该类并调用非静态方法。
class ClassA{
public void methodOne(){
}
}
public static void main(String[] args){
ClassA classA = new ClassA();
classA.methodOne();
}
<强>建议强> 使用静态方法时必须小心,因为它们共享内存。
当你创建一个新类ClassA classA = new ClassA();
时,对于你创建的每个新类,它会存储自己的非共享内存变量,但是当你使用静态方法时,它们会共享可能很危险的内存。