【问题标题】:Non-static variable this cannot be referenced from a static context when constructing an object构造对象时,不能从静态上下文中引用非静态变量 this
【发布时间】:2014-10-23 02:38:38
【问题描述】:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class n00686349
{
public static void main(String args [])throws FileNotFoundException
   {
        String control;


        FileInputStream fis = new FileInputStream("C:/Users/Steven Fowler/Desktop/data.txt");
        Scanner scanner = new Scanner(fis);

        vehicle one = new vehicle(); 

        while(scanner.hasNextLine())
        {
            control = scanner.nextLine();
            if (control.equals("vehicle") == true)
            {
               new vehicle();
               one.setOwner(control);
            }
            else if (control.equals("car") == true)
            {
               System.out.println("You doing alright");
            }
            else if (control.equals("truck") == true)
            {
               System.out.println("You doing alright");
            }
            else if (control.equals("bicycle") == true)
            {
               System.out.println("You doing alright");
            }
            else if (control.equals("american car") == true)
            {
               System.out.println("You doing alright");
            }
            else if (control.equals("foreign car") == true)
            {
            }

        }

        scanner.close();
    }   





public class vehicle
{
   private String ownersName;
   private String address; 
   private String phone;
   private String email;

   public vehicle()
   {
      this.ownersName = ("none");
      this.address = ("none");
      this.phone = ("none");
      this.email = ("none");
   }


   public void setOwner (String ownersName)
   {
      this.ownersName = ownersName;

   }

   public void setAddress (String address) 
   {
      this.address = address;

   }
   public void setPhone (String phone)
   {
      this.phone = phone;
   }
   public void setEmail (String email)
   {
      this.email = email;
   }  

   public String ownersName()
   {
      return ownersName;
   }

   public String address ()
   {
      return address;
   }

   public String phone ()
   {
      return phone;
   }

   public String email()
   {
      return email;
   }
}

class car extends vehicle
{
  private boolean convertible;
  private String color;

  public car()
  {
   convertible = false;
   color = ("none");

  }


   public void setConvertible (boolean convertible)
   {
      this.convertible = convertible;
   }

   public void setColor (String color)
   {
      this.color = color;
   }

   public boolean convertible ()
   {
      return convertible;
   }

   public String color ()
   {
      return color;
   }
}

上面是我的一个类的代码,它逐行从文件中读取输入并将信息处理成一个对象(尚未完成仍在构建)。我理解为什么您通常会收到此错误消息。如果不先创建对象,分配对对象的引用,然后调用对象方法,则无法访问实例方法。每当我尝试创建新对象时,都会在第 16 行和第 23 行弹出此错误。所以我一直在玩这个,如果我把类车改成静态的,它就可以工作。所以我的问题是:将类更改为静态更改所有变量静态,这就是它起作用的原因吗?这意味着什么?(使创建实例的类静态)并且我在我的车辆类中使用 this.variable 然后尝试扩展该类导致此问题?我对使用 this 关键字不是很熟悉。

谢谢

【问题讨论】:

  • 更新了此代码以使类取消嵌套。我们需要覆盖对象中的 tostring 方法,尝试执行此操作似乎非常麻烦,我不确定我的代码当前的方式是否可行。

标签: java static compiler-errors non-static


【解决方案1】:

像这样让你的车辆类静态:

public static class vehicle

【讨论】:

  • 是的,就编译器错误而言,静态可以工作,但为什么它希望该类是静态的?
  • 静态类只能访问外部类的静态成员,而非静态嵌套类可以与外部类的静态和非静态成员交互。此功能允许静态嵌套类与程序的其他部分交互并提供代码可重用性。 udemy.com/blog/java-static-class
【解决方案2】:

将 Vehicle 内部类设为静态并不是什么大问题。这只是意味着内部类没有任何方法可以引用外部类的内容,而无论如何您都不会这样做。

将 Vehicle 的所有成员设为静态意味着所有车辆共享这些属性的一份副本。例如,所有车辆都将拥有相同的所有者。

我可能会做的是将所有内容从 main 方法转移到新方法。 (称它为run 或类似名称。)

然后将 main 改为:

public static void main(String[] args) {
    n00686349 obj = new n00686349();
    obj.run();    
}

【讨论】:

  • 如果我将车辆类全部保留在 main 中,为什么编译器希望它是静态的?这是一项任务,他对我真正想了解的东西非常挑剔。
  • 基本上,如果您在静态方法中,编译器不知道要给您哪些非静态内容的“副本”——因为每个实例都有自己的。我不知道你的教授期望什么,但是在代码中抛出静态(尤其是为了让它编译)并不是一个好习惯。如果您从静态上下文中获取“主”代码,则不必担心。
  • 这正是我的想法。这是因为他通过某种或其他方式对他的程序进行评分,所以它需要采用他的格式。我个人喜欢你的想法,在可读性方面保持主要清洁。
【解决方案3】:

您没有将 new vehicle() 分配给您的 one 参考。改变这个

new vehicle();
one.setOwner(control);

one = new vehicle();
one.setOwner(control);

【讨论】:

  • 对不起,如果代码令人困惑,我正在测试很多不同的东西。如果您以正确的方式进行操作并不重要。在第 16 行中,您会得到相同的错误
  • 像我说的那样让你的车辆类静态
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2011-11-30
相关资源
最近更新 更多