在实例化对象时出错“无法从静态上下文引用非静态变量”

时间:2015-10-18 05:26:48

标签: java

当我尝试从'Boat'类实例化一个对象时,我得到错误“非静态变量,这不能从静态上下文引用”。任何帮助将不胜感激!

package simpleboatapp;

/**
 *
 * @author ragarwala
 */
public class SimpleBoatApp {

    public class Boat {

        private float speed;
        final private float topSpeed = 90;
        private boolean sailPosition;

        public Boat()
        {
            speed = 0;
            sailPosition = false;
        }
        public void goFast (String boatName)
        {

            if (speed < topSpeed)
            {
                speed = speed + 10;
                sailPosition = true;
                System.out.println (boatName + "is raising the sail at speed of" + speed + "mph");
            }
            else
            {
                sailPosition = true; 
                System.out.println (boatName + "is raising the sail at maximum speed of" + speed + "mph");
            }
        }

    }

  /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Boat simpleboat = new Boat(); <--- Error occurs for this line
        simpleboat.goFast("Destiny"); 
    }

}

4 个答案:

答案 0 :(得分:1)

有一些解决方案:

  • Boat类放入另一个类文件中。如果Boat将是一个非静态类,并且您想在静态类中实例化它,它应该在自己的文件中。
  • 使Boat类保持静态。如果使Boat类保持静态,您将能够在Main函数内实例化它并且该程序将运行。
  • 更改实例化Boat类的方式。您可以按如下方式对其进行实例化:

    Boat simpleboat = new Main().new Boat();

    这将解决静态/非静态冲突。

答案 1 :(得分:1)

Boat类不需要包含类BoatApp中的任何内容。

在这种情况下,您可以使用static关键字声明它是static成员类,并且您将能够从静态上下文中实例化它。

public static class Boat {

当您在另一个类中声明一个类时,默认的假设是内部类可以访问外部类中的数据。这意味着它总是需要在范围内拥有外部类的实例。

如果您想了解更多信息,可以搜索“内部课程”。

但是在这种情况下,您的BoatApp显然不是您想要在您的成员类Boat中访问的内容(它只是main方法的持有者)所以您只是需要将Boat声明为static,或者将其移动到自己的文件中。

答案 2 :(得分:0)

问题是你将Boat类包含在另一个类SimpleBoatApp中,同时尝试静态实例化一个新的Boat而没有包含它的类。

相反,请考虑将Boat课程移到SimpleBoatApp课程之外,同时将main方法留在SimpleBoatApp内:

public class SimpleBoatApp {
    public static void main(String[] args) {
        Boat simpleboat = new Boat();
        simpleboat.goFast("Destiny"); 
    }
}

答案 3 :(得分:0)

它可以启动非静态(内部)类,如下所示

   Boat simpleboat = new SimpleBoatApp().new Boat();

如果它有静态类,你可以启动如下

   Boat simpleboat = new SimpleBoatApp().Boat();