A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿苏勒 中级黑马   /  2014-6-3 18:21  /  1203 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Outer{
  public class InnerTool
  {  
    public int add(int a,int b){
      return a+b;
       }
  }

  private InnerTool tool=new InnerTool();//建立内部类的对象,并把对象的引用私有化

  public void add(int a,int b,int c)
  {
    tool.add(tool.add(a,b),c);
  }
}
public class Tester
{
  public static void main(String args[]){
    Outer o=new Outer();
    o.add(1,2,3);
    Outer.InnerTool tool=new Outer().new InnerTool();
  }
}
通过这段代码可以得出:
1,可以在外部类的成员位置,建立内部类的对象。
2,内部类的完整类名是 :外部类名.内部类名,如果外部其他类如本例子(Tester),要访问内部类,则必须使用内部类的全名
如:Outer.InnerTool tool=new Outer().new InnerTool();
3,如果不想内部类被外部其他类访问,可以为内部类添加私有。
4,无论内部类定义在局部位置,还是成员位置,都不可以与外部类同名。


//当内部类出现在成员位置上,而且非静态时,我们称之为实例内部类
如:
class A
{
        class B
        {
                //B就是实例内部类
        }
}

实例内部类的特点:
1,在创建实例内部类的实例时,外部类的实例必须先存在。
如:  A.B ab=new A().new B();//A必须先有实例
等同于:
A a=new A();
A.B b=a.new B();

2,实例内部类的实例持有外部类实例的引用,在内部类中,可以访问外部类的所有成员。
为什么?因为当实例内部类建立的时候,外部类的实例必然已经有了,内部类实例自动的持有外部类的实例引用。

3,多重嵌套的内部类同样也可以访问外部类的所有成员。
如:
class A
{
        class B
        {
                class C
                {
                        //内部类C一样可以访问B和A的私有成员。
                }
        }
}

4,外部类和内部类实例是一对多的关系,一个内部类实例只会引用一个外部类实例,而一个外部类实例则引用多个内部类实例。
外部类中不可以直接访问内部类的成员,必须通过内部类的对象实例去访问。

5,在实例内部类中不可以定义静态成员,只能定义实例成员。

6,如果内部类和外部类包含相同名字的成员,那么在内部类中,该成员为this.成员,而外部成员为外部类名.this(或内部类名).成员。


静态内部类的特点:
1,静态内部类的实例不会自动持有外部类的特定实例的引用,所以在创建静态内部类的时候,不需要创建外部类的实例。
如:
class A
{
        static  class B
        {

        }
}
class Demo
{
        public static void main(String[]args)
        {
                //要创建静态内部类的实例,可以直接创建
                A.B b=new A.B();
        }
}

2,静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,则必须建立外部类的实例对象。

3,静态内部类可以定义静态成员和实例成员。

4,外部其他类可以通过完整的类名去访问内部类的静态成员,但却不能以这种方式访问内部类实例成员。
class A
{
        static  class B
        {
                static int a;
                int b;
        }
}
class Demo
{
        public static void main(String[]args)
        {
               
                A.B.a=2;//合法
                A.B.b=1;//不可以以类名的形式直接访问成员变量
        }
}


局部内部类的特点:
1,局部内部类只能在当前方法中使用。
class A
{
        public void show()
        {
                class B
                {
                        int v=1;
                        class C
                        {

                        }
                }
        
        }
}
//show()内可以访问类B和类C,show()方法之外就不可以访问了。

2,局部内部类和实例内部类一样,不能包含静态成员

3,局部内部类中定义的内部类不可以被访问控制修饰符修饰

4,局部内部类可以访问所有外部类的成员,此外,局部内部类还可以访问所在方法中final类型的参数和变量

class A
{
        public void show(final int p1,int p2)
        {
                int v1=1;
                final int v2=2;
                class B
                {
                        int a=p1;//ok
                        int b=p2;//no,没被final修饰的参数
                        int c=v1;//no
                }
        }
}

3 个回复

倒序浏览
真的好全,总结的很好
回复 使用道具 举报
谢谢!!!!!!!!!!!
回复 使用道具 举报
大赞,可以和自己做的笔记进行对比了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马