Java内部类和静态内部类

1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
3.实例化一个非静态的内部类的方法:
  a.先生成一个外部类对象实例
     OutClassTest oc1 = new OutClassTest();
  b.通过外部类的对象实例生成内部类对象
     OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
4.实例化一个静态内部类的方法:
  a.不依赖于外部类的实例,直接实例化内部类对象
     OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
  b.调用内部静态类的方法或静态变量,通过类名直接调用
     OutClassTest.InnerStaticClass.static_value
     OutClassTest.InnerStaticClass.getMessage()

5.内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。

6.局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

   局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

  class People{

    public People() {   
    }
}
class Man{
    public Man(){
         
    }
     
    public People getWoman(){
        class Woman extends People{   //局部内部类
            int age =0;
        }
        return new Woman();
    }
}

7.匿名内部类是唯一一种没有构造器的类。大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

  scan_bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 
            }
        });
8.为什么成员内部类可以无条件访问外部类的成员?
  虽然我们在定义的内部类的构造器是无参构造器,编译器还是会默认添加一个参数,该参数的类型为指向外部类对象的一个引用,所以成员内部类中的Outter this&0 指针便指向了外部类对象,因此可以在成员内部类中随意访问外部类的成员。从这里也间接说明了成员内部类是依赖于外部类的,如果没有创建外部类的对象,则无法对Outter this&0引用进行初始化赋值,也就无法创建成员内部类的对象。
9.为什么局部内部类和匿名内部类只能访问局部final变量?http://www.cnblogs.com/dolphin0520/p/3811445.html

10.为什么在Java中需要内部类?总结一下主要有以下四点:

  1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,

  2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

  3.方便编写事件驱动程序

  4.方便编写线程代码

学习资源

https://www.cnblogs.com/aademeng/articles/6192954.html

http://www.cnblogs.com/dolphin0520/p/3811445.html

原文地址:https://www.cnblogs.com/Rage-Leila/p/8482629.html