类java里面的类?

时间:2014-03-06 03:47:11

标签: java class inner-classes

我正在做一个问题,要求你创建一个类客户,稍后将其添加到另一个类的方法中的数组列表中。但是我在标记为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;
        }
    }
}

6 个答案:

答案 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;
    }
} }