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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马晓平 中级黑马   /  2013-10-21 23:20  /  1130 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马晓平 于 2013-10-27 11:26 编辑

内部类的访问规则是什么?

6 个回复

倒序浏览
本帖最后由 wenbaoxing 于 2013-10-22 08:53 编辑

内部类 在类中直接定义的内部类  

  • 在一个类内部定义类这就是嵌套类,也叫内部类、内置类。
  • 嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是嵌套类的成员却不能被嵌套它的类直接访问。
  • 在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。
  1. package com.itheima;

  2. class Outer {
  3.         int outer_i = 100;

  4.         void test() {
  5.                 Inner in = new Inner();
  6.                 in.display();
  7.         }

  8.         class Inner {
  9.                 void display() {
  10.                         System.out.println("display: outer_i = " + outer_i);
  11.                 }
  12.         }
  13. }

  14. class InnerClassDemo {
  15.         public static void main(String[] args) {
  16.                 Outer outer = new Outer();
  17.                 outer.test();
  18.         }
  19. }

  20. //打印结果:display: outer_i = 100
复制代码
在程序中,内部类Inner定义在Outer类的范围之内。因此,在Inner类之内的display()方法可以直接访问Outer类的变量outer_i。其实,在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用,通过那个外部类对象的引用去调用这个变量,在内部类中调用外部类的方法也是一样的道理。上面程序代码在内存布局如图:







评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
        内部类使程序代码代码更加紧凑、程序更具模块化。如果我们将上面的Inner类改写成Outer类的外部去实现,会非常棘手。这样我们就明白了这个结论:当一个类的代码要用到另外一个类的实例对象,而另外一个类中的代码要访问第一个类中的成员,将另一个类(第二个类)写成第一个类的内部类,程序代码就要容易编写的多,这样的情况在实际应用中非常之多!!
回复 使用道具 举报
    一个内部类可以访问他的外部类的成员,但是反过来是不成立的。内部类的成员只有在内部类的范围之内是可知的,并不能被外部类使用。    如果用static修饰一个内部类,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员,但是,static的内部类中的成员是不能声明为static的。static的内部类不能再使用外层封装类的非static的成员变量,这个道理不难想象!所以static嵌套类很少使用。
如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要访问的变量。
  1. public class Outer
  2. { private int size; public class Inner
  3.         {              private int size;              public void doStuff( int size)
  4.                 {                       size++; // 引用的是doStuff函数的形参
  5.                             this.size++; //引用的是Inner类中的成员变量
  6.                             Outer.this.size++; // 引用的Outer类中的成员变量
  7.                   }
  8.         }
  9. }
复制代码
回复 使用道具 举报
1,内部类的定义位置,分为成员位置和局部位置。
     在外部类成员位置上叫做一般内部类,这种情况下外部类访问内部类需要创建内部类对象,内部类可以直接访问外部类的成员变量,包括私有,形如 外部类.this.成员属性。
     在外部类局部位置上叫做局部内部类,这种情况下内部类可以直接访问外部类中的成员变量和被final修饰的局部变量。
2,静态内部类。定义在外部类成员变量位置上,被static修饰,这种情况下内部类只能访问外部类的静态成员变量。
3,匿名内部类。这是内部类的简写形式,需要有父类和接口,局部内部类作用限制 对他有效。建议定义较少的方法。

纯手打,希望对你有帮助!与你一同进步!{:soso_e141:}

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报

  • 嵌套类并非只能在类里定义,也可以在几个程序块的范围之内定义内部类。例如,在方法中,或甚至在for循环体内部,都可以定义嵌套类
  • 在方法中定义的内部类只能访问方法中的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。




回复 使用道具 举报
这里我要说一点就是局部内部类的访问局部变量,该局部变量必须用final修饰符所修饰,
原因: 内部类的生命周期比局部变量长,局部变量加final之后,将变量设置为最终的值主要是将所有的局部内部类对象要访问的final型局部变量,变成该内部类对象中的一个数据成员。这样,即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变, 因而局部内部类对象在变量死亡后,照样可以访问final型局部变量。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马