public class A {
    public static class B {
        public void fun() {
            System.out.println("OK");
        }
    }    public static void main(String[] args) {
        A a = new A();
        A.B ab = new A.B();
        //A.B b = a.new B();//为什么这样不行
         //A.B b = new A().new B();//为什么这样不行
    }
}

解决方案 »

  1.   

    首先你要知道什么是对象。对象里面的什么是方法,调用是怎么样进行的。a.new B();这句叫什么啊,可以说,在java里面你都找不到这个方法。A.B b = new A().new B();这句呢,在A类对象中,根本就没有new B()这个东西。
      

  2.   

    其实跟static方法和普通方法的区别一样啊
    static方法是类级别的方法
    所以调用时要类名.方法名
    而普通方法调用的时候,只要对象.方法名
      

  3.   

    public class A {
        public static class B {
            public void fun() {
                System.out.println("OK");
            }
        }
        public class C {
            public void fun() {
                System.out.println("OK");
            }
        }
        public static void main(String[] args) {
            A a = new A();
            A.B ab = new A.B();
            A.C b = a.new C();//成功
            A.C c = new A().new C();//成功
        }
      

  4.   

    new B()是产生B这个类的对象!而你用a.new B();在A类中根本就没有这个方法,当然会出错!
      

  5.   

    其实楼主的后两种方法也是可以的,只是因为你的内部类是STATIC的,所以下面两种不对,如果把Static去掉那么后两种方法也是通过的。
      

  6.   

    static的方法不也可以用对象.方法名来调用吗
    为什么static的内部类就不行了呢?
    换成非static的内部类是可以A.B b = new A().new B();的
      

  7.   

    先理解static的基本意思
    再看内部类,其实和static修饰的其他东西思想是一致的.
      

  8.   

    3楼的朋友举的例子很好,不用多说就能把区别显现出来。
    楼主注意类B和C的区别,就在一个static 上,
    对于static,你要访问内部类或方法,必须是通过外部类以:外部类.内部类(方法)
      

  9.   

    编译器会自动给内部类加上一个reference,指向产生它的那个外部类的对象,如果不想要或者说不需要这个reference,那么我们就可以把这个内部类声明为static,禁止这个reference的产生 
    在别的地方看到的
    感觉比较合理
      

  10.   

    你要知道new前面的是对象的实例,也就是说是代表,自己的实例是能引用本对象的构造方法,不可能以用别的类的构造方法。