黑马程序员技术交流社区

标题: 内部类是如何被外部类访问的? [打印本页]

作者: 李光耀    时间: 2013-3-21 18:42
标题: 内部类是如何被外部类访问的?
本帖最后由 李光耀 于 2013-3-22 12:34 编辑

内容同标题。。 有时间的劳烦过来瞄一眼,最好举个例子{:soso_e134:}

作者: 于腾飛    时间: 2013-3-21 18:46
1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。
格式:
         外部类名.内部类名变量名 =外部类对象.内部类对象;
         Outer.Inner in = newOuter().new Inner();
        2.当内部类在成员位置上时,就可以被成员修饰符所修饰。
         比如,private:将内部类在外部类中进行封装。
           static:内部类就局部static的属性。
         当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
        3.当内部类定义在局部时,不可以被成员修饰符修饰,可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问所在局部中的变量,只能访问被final修饰的局部变量。
作者: 黄玉昆    时间: 2013-3-21 19:26
多看看老师的视频,视频中讲解的很清楚的。加油
作者: 李阳阳    时间: 2013-3-21 20:16
内部类访问规则:
1.内部类可以直接访问外部类成员,包括私有的;
     之所以能访问是因为省略了 “外部类名.this”
2.外部类访问内部类需建立内部类对象
这是我之前的练习,你看下,有的地方我没注释、
class Outer
{
         int x=5;
          void show()
         {
                  int x=8;
                  Inter in = new Inter();//外部类访问内部类需建立内部类对象
                 //System.out.println("out"+x);//相当于Outer.this.x
                 System.out.println("in"+in.x);
         }
         class Inter
         {
                 int x=3;
                 void show()
                 {
                         //int x=11;
                         System.out.println("inter"+x);
                 }
         }
}
class OutClassDemo1
{
         public static void main(String[] args)
         {
                 Outer.Inter in = new Outer().new Inter();//外部类访问内部类的格式
                 in.show();
                 Outer out = new Outer();
                 out.show();
         }
}
作者: 小路飞    时间: 2013-3-21 22:52
内部类的访问规则:(内部类与外部类的互访)
  1,内部类可以直接访问外部类中的成员,包括私有。
        这是因为内部类中持有一个外部类的引用,格式:外部类名.this
  2,外部类要访问内部类,必须建立内部类对象。
day09天有讲过,很详细的!
作者: kingsummerlucky    时间: 2013-3-22 02:28
这个小程序演示了如何在内部类中访问外部类的同名属性或方法。
    如果内部类中没有与外部类同名的属性或方法,那么直接引用外部类的属性或方法即可,见Inner类的定义。
    但如果存在同名的属性或方法,就要在内部类中先取得外部类的引用,通过这个引用来访问外部类的同名属性或方法。有两个方法来取得外部类的引用:
    一种方法是,通过外部类的类名来取得外部类当前的引用,见Inner1类的定义;
    另一种方法是,把外部类的引用显式传给内部类的构造方法,见Inner2类的定义。
    可见,第一种方法简单一些。
    注意:[类名.this]的用法只能在内部类中使用。
public class Test1 {

    private int a = 5;

    public Test1() {

        new Inner().print();
        new Inner1().print();
        new Inner2(this).print();

    }

  public static void main(String[] args) {

        new Test1();
    }

     private class Inner {

        private void print() {

            System.out.println("Inner直接取得外部的属性a=" + a);
            System.out.println();

        }

    }

  private class Inner1 {

        private int a = 10;

        private void print() {

            System.out.println("Inner1的属性a=" + this.a);
            System.out.println("Inner1通过第一种方法取得外部的属性a=" + Test1.this.a);
            System.out.println();

        }

    }

  private class Inner2 {

        private int a = 20;

        private Test1 t;

        private Inner2(Test1 t) {
            this.t = t;
        }
     private void print() {

            System.out.println("Inner2的属性a=" + this.a);
            System.out.println("Inner2通过第二种方法取得外部的属性a=" + this.t.a);
            System.out.println();

        }

    }

作者: 可见    时间: 2013-3-22 17:19
顶 一个 好好学习~~
作者: 黄玉昆    时间: 2013-3-23 08:18
请不要越版块发相同的帖子,请看滔哥关于黑马论坛2013年加分及其惩罚规则的帖子:http://bbs.itheima.com/thread-40602-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2