为什么我不能访问Java中的内部类?

时间:2014-10-20 19:49:13

标签: java inner-classes

我在使用Java中的嵌套类时遇到了麻烦,有谁知道为什么Java不允许我这样做?

public class A{
    private class B{
        public B(){
            System.out.println("class B");
        }
    }

    public static void main(String[] args){
         A a = new A();
         B b = new B();
    }
} 

4 个答案:

答案 0 :(得分:8)

因为您试图从静态方法访问非静态内部类。

第一个解决方案是将您的内部班级B更改为static

public class A{
    private static class B {
        public B() {
            System.out.println("class B");
        }
    }

    public static void main(String[] args){
         A a = new A();
         B b = new B();
    }
}

可以从任何地方访问static内部类,但非静态内部类需要容器类的实例。

另一种解决方案是:

A a = new A();
B b = a.new B();

这将使您更好地理解内部类在Java中的工作方式:http://www.javaworld.com/article/2077411/core-java/inner-classes.html

答案 1 :(得分:7)

A a = new A();
B b = a.new B();

可以解决您的问题

您使用了私有内部类。如何在A类之外获取实例?

public class JustForShow {
    public class JustTry{

        public JustTry() {
            System.out.println("Initialized");
        }
    }
    public static void main(String[] args) {
        JustForShow jfs = new JustForShow();
        JustTry jt = jfs.new JustTry();
    }
}

答案 2 :(得分:4)

您正尝试从静态方法访问非静态元素。要解决这个问题,您有两种选择:

  1. 将您的班级B更改为静态,因此请在班级定义中添加static关键字,如下所示:

    public static class B { // ...
    
  2. 更改主要方法,并使用创建的实例a创建B,如下所示:

    B b = a.new B();
    
  3. 如果B不使用类A的任何非静态资源,我建议使用第一种方法。

答案 3 :(得分:1)

public static void main(String[] args){
     A a = new A();
     A.B b = a.new B();
}