如何理解外部其他类访问静态内部类中的方法new outer.inner().function();

如下:外部其他类访问静态内部类中的方法
Outer.Inner in = new Outer.Inner();
in.function();
问题:
我不能理解的是,静态内部类中为什么还能有非静态方法?被static修饰的类(内部类)怎么还能new 对象?
为什么在没有外部类对象的情况下就能new内部类对象? 我能理解外部类访问静态内部类中的方法该是这样:
Out.Inner in = new Outer().new Inner();
in.function();
/*虽然我写的这种方法是错误的,但是我认为这样才能让人理解啊,(先创建外部类对象,然后通过外部类对象去new内部类对象,然后访问内部类中的方法)。
*/
问题:访问一个类中的方法应该这样 new 类().function(); 而题目中的new outer.inner().function();根本就没有外部类实例啊,这怎么能访问到定义在外部类中的内部类(那就更无法访问内部类中的方法啊)?

/*
       static关键字修饰内部类
*/
class Outer
{
       //定义一个外部类的成员变量
       private int num=10;
       //定义一个外部类的成员函数
       public void show()
       {
              Outer.Innerin=new Outer.Inner();
              //打印内部类的成员变量的值
              System.out.println("num1="+in.num1);
              in.method();
       }
       //书写在外部类成员位置上的内部类
       /*
              内部类被static修饰后,随着Outer类加载到内存,
              被static修饰的内部类也会加载到内存中,也就是说jvm会将硬盘上的Outer.class和
              Outer$Inner.class文件一起加载到内存中,这样可以把一个静态内部类理解为一个
              和外部类一样的类,不需要外部类的对象来调用。
              如果想要创建静态内部类的对象,因为已经被加载到内存中,随时可以创建静态内部类的对象
       */
       static class Inner
       {
              //定义一个内部类的成员变量
              intnum1=100;
              //定义一个内部类的成员函数
              publicvoid method()
              {
                     //打印内部类的成员变量的值
                     System.out.println("num1="+num1);
              }
       }
}
//定义一个测试类
classInnerClassDemo2
{
       public static void main(String[] args)
       {
              /*
                     想要使用内部类中的非静态方法,我们首先
                     要创建内部类的对象,那么怎么创建内部类的对象呢?
                     因为内部类是静态的,所以不需要创建Outer的对象,只需要根据内部类的名字
                     创建就可以
              */
              Outer.Inner in=new Outer.Inner();
              in.method();
       }
}
/*

总结:
如果我们想要在其他类中调用内部类中的一般函数(非静态函数),必须要使用内部类的对象来调用,所以我们要创建内部类的对象,创建方式:
new 内部类类名();--------->newOuter.Inner();
*/
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-10-30
1 静态内部类中为什么还能有非静态方法?被static修饰的类(内部类)怎么还能new 对象?

类是不是静态的和类中的方法是不是静态的没有绝对联系,类是静态的你可以这样用Outer.Inner,就好像使用Outer类的静态成员的方式一样
2 Out.Inner in = Outer.Inner in = new Outer.Inner();
你可以把Outer.Inne看作一个整体,就像C++的名称空间一样,现在要创建的是内部类的对象,它并不需要外部类的对象来创建,你可以把它们想象成两个完全不同的类,其中一个在另一个内部而已。
Out.Inner in = new Outer().new Inner();

这么写new Outer()是一个对象,对象.new是什么意思呢?
3访问一个类中的方法应该这样 new 类().function(); 而题目中的new outer.inner().function();根本就没有外部类实例

new outer.inner()已经创建了一个内部类的对象,然后调用内部类对象的function(),调用内部类的function(),并不需要外部类的对象追问

还有一点不太懂:
1.静态是共享数据,那么为什么静态内部类可以创建对象?这样做不就破坏了共享了么(比如new了多个对象,每个对象都不一样)。
ps:对此我有一种自己的理解不知道对不对?(创建静态类对象是因为静态类中有非静态方法)。
2.如果我的理解正确,那么是不是就是说如果静态类中的方法和属性全都是静态的,那么该静态类就不能创建对象?

追答

.静态是共享数据,对的
那么为什么静态内部类可以创建对象?这样做不就破坏了共享了么(比如new了多个对象,每个对象都不一样)。
是不是静态的和能不能创建对象没有多大关系,静态的方法是不依赖与类成员的方法,静态类也是类似,只是它的调用方式和普通类不一样而已,其它方法和属性等和外部类都一样。

本回答被提问者采纳
相似回答