我正在做一个问题,要求你创建一个类客户,稍后将其添加到另一个类的方法中的数组列表中。但是我在标记为ERROR的行上收到错误,其中说: “无法访问Question3类型的封闭实例。必须使用Question3类型的封闭实例限定分配(例如x.new A(),其中x是Question3的实例)。”我不知道为什么。
public class Question3 {
static ArrayList<customers> a= new ArrayList<customers>();
private static Scanner kbd;
public static void main(String[] args)
{
String input="";
double price=1;
String name="";
while(price != 0)
{
System.out.println("Customer Name: ");
name= kbd.nextLine().trim();
System.out.println("Purchase Price: ");
price= Double.parseDouble(kbd.nextLine().trim());
addSale(name,price); //ERROR
}
}
public static void addSale(String name, double price)
{
customers c= new customers(name,price);
a.add(c);
}
public class customers
{
String name;
double price;
public customers(String name, double price)
{
this.name=name;
this.price=price;
}
}
}
答案 0 :(得分:1)
main方法是静态的,因此具有静态上下文。对于线程进入该代码块,不需要Question3.class的实例。您的班级客户在问题3中定义。因为它是一个内部类,所以它可以隐式访问Question3类中的字段和方法,但它需要一个Question3实例才能实现该行为。您需要将现在在main(String args [])中的代码移动到类Question3的构造函数中,并在main方法中创建一个Question3实例,如下所示:
public static void main(String args[]) {
Question3 myQuestion3 = new Question3();
}
或者如其他人所述,您可以使您的客户类保持静态。这将通过有效地使客户成为顶级类来解决问题,但是您将失去隐式访问其封闭类型的字段和方法的能力,即Question3类。
答案 1 :(得分:1)
您还必须将kbd变量初始化为:
kbd = new Scanner(System.in);
请使用此建议和上述其他内容审核您的代码。
答案 2 :(得分:1)
首先,到目前为止工作很棒。但是,我在代码中看到了一些错误。
首先,你的类应该是一个静态类。您正在尝试使用没有静态类的静态方法。
public static class Question3 {
static ArrayList<customers> a= new ArrayList<customers>();
private static Scanner kbd;
public static void main(String[] args)
{
此外,您需要为用户创建扫描仪以输入对象。
private static Scanner kbd = new Scanner(System.In);
执行这些操作,您的代码将完美运行!
答案 3 :(得分:0)
您应该更改类customers
的声明以解决此问题。
目前它是一个非静态的内部类。你应该把它改成静态的内部类。
public static class customers
非静态内部类隐式引用容器类的实例。在这里,您尝试在静态函数中创建customer
类的新实例,那里没有Question3
实例。
答案 4 :(得分:0)
只需将内部类更改为公共静态类:
public static class customers {
错误消失了:)
答案 5 :(得分:0)
您的代码中存在两个问题。 首先,您必须通过向其提供System.in参数来初始化扫描程序对象。 其次,在创建客户对象时,您必须遵循正确的语法。 这是工作代码:
public class Question3 {
static ArrayList<customers> a= new ArrayList<customers>();
private static Scanner kbd=new Scanner(System.in); // <---- Notice this
public static void main(String[] args)
{
String input="";
double price=1;
String name="";
while(price != 0)
{
System.out.println("Customer Name: ");
name= kbd.nextLine().trim();
System.out.println("Purchase Price: ");
price= Double.parseDouble(kbd.nextLine().trim());
addSale(name,price); //ERROR
}
System.out.println(a);
}
public static void addSale(String name, double price)
{
// customers c= new customers(name,price);
Question3.customers c = new Question3().new customers(name, price); // <---Notice this
a.add(c);
}
public class customers
{
String name;
double price;
public customers(String name, double price)
{
this.name=name;
this.price=price;
}
} }