静态 - 非静态交互

时间:2015-12-09 09:26:54

标签: java oop static

我有两个相互作用的类。第一个是中央的,如下:

public class Datenbank {
double winkelPanel = 0;
double groessePanel = 0;
double effizienzPanel = 0;
double maxProduktion = 0;

这里我初始化我的变量并给它们值。在同一个类的后面,有一个函数 addPanel

public void addPanel(double richtung, double winkel, double groesse, 
                                    double effizienz, double maxProd) {     
    groessePanel += groesse;                                                
    if (richtPanel == 0){ richtPanel += richtung/100; }                         
    else { richtPanel += richtung/100; richtPanel /= 2; }                        

    if (winkelPanel == 0){ winkelPanel = winkel; }
    else { winkelPanel += winkel; winkelPanel /= 2; }  

    if(effizienzPanel == 0) { effizienzPanel = effizienz/100; }
    else {effizienzPanel += effizienz/100; effizienzPanel /= 2; }

    if(maxProduktion == 0) { maxProduktion = maxProd; }
    else {maxProduktion += maxProd; maxProduktion /= 2;}

这本身就很好(据我所知)。现在有另一个类,来自与它交互的GUI。

if(menuItem == mPanelHinzufuegen) {
        double Flaeche = Double.parseDouble(showInput("Fläche des Panels in m^2:"));
        double Richtung = Double.parseDouble(showInput("Richtung des Panels(S = 0, W = 90, 0 = -90):"));
        double winkel = Double.parseDouble(showInput("Winkel des Panels in Grad, z.B. 23.5:"));
        double effizienz = Double.parseDouble(showInput("Effizienz des Panels, z.B. 23.5:"));
        double maxProd = Double.parseDouble(showInput("Max. Produktion des Panels in Watt:"));

        Datenbank.addPanel(Richtung, winkel, Flaeche, effizienz, maxProd);

    }

当我到达调用Datenbank.addPanel时,我收到编译器错误,因为GUI是静态的但是Datenbank不是。简单地将“static”添加到 addPanel 方法不起作用,因为变量(winkelPanel等)开始抛出那些非静态的错误,因此无法像这样使用。

5 个答案:

答案 0 :(得分:3)

为什么要让它静止?

Datenbank db = new Datenbank();
db.addPanel(Richtung, winkel, Flaeche, effizienz, maxProd);

答案 1 :(得分:1)

根据您的设置,我假设Datenbank(英文数据库)是单身,因此只应在您的应用程序中实例化一次。

因此,您可以将该类重写为单例:

public enum Datenbank {
  INSTANCE;
  double winkelPanel = 0;
  double groessePanel = 0;
  double effizienzPanel = 0;
  double maxProduktion = 0;
  public void addPanel(double richtung, double winkel, double groesse, 
                                double effizienz, double maxProd) {
  ...
}

此示例假定您的类Datenbank具有默认构造函数,否则您必须向INSTANCE提供适当的参数。

然后您可以在GUI中访问该实例:

Datenbank.INSTANCE.addPanel(Richtung, winkel, Flaeche, effizienz, maxProd);

答案 2 :(得分:0)

将“static”关键字添加到addPanel是不够的。您需要将'Datenbank'类的所有实例变量设为静态

public class Datenbank {
static double winkelPanel = 0;
static double groessePanel = 0;
static double effizienzPanel = 0;
static double maxProduktion = 0;

答案 3 :(得分:0)

Datenbank中的变量在静态上下文中没有意义,除非它们是静态的,这意味着你只有一个用于类。如果您在静态方法中使用它们,它们应该是静态的。 无论是创建Datenbank类型的对象来调用addPanel,还是将类变量声明为static(在此上下文中对我来说没有意义)。 将变量声明为私有:)

答案 4 :(得分:0)

你试图调用不存在的Datenbank的“静态”方法。

您想要将一个面板添加到Datenbank的特定实例,意味着一个由“new”实例化的Datenbank对象。

因此,您的GUI-Class必须有一个提供数据库对象的成员或方法,然后您可以调用addPanel。

这里的主要问题是:静态用于类,非静态部分用于实例。