Chinaunix首页 | 论坛 | 博客
  • 博客访问: 715244
  • 博文数量: 147
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 10:36
文章分类

全部博文(147)

文章存档

2011年(1)

2010年(1)

2009年(35)

2008年(110)

我的朋友

分类: Java

2008-11-09 19:46:49

内部类可以直接访问其外部类的所有变量和方法,内部类和外部类的区别是:外部类只可以声明为pulibc和空,而内部类可以声明为private,protected,及static属性.
内部类的方法可以直接访问外部类的变量.其实,在内部类中保存了一个对外部类对象的引用;当内部类的成员方法中访问某一个变量时,首先在该方法及内部类中查找该变量;如果没有定义过这个变量,访问就会被传递给内部类中保存的那个外部类对象的引用,通过那个外部类对象的引用去访问外部类类中的这个变量,在内部类中调用方法也是一样的道理.
内部类的种类:
一.在一个类中直接定义的内部类
class TheOuter{
...
 classInner{
 .....
 }
....
}
二.在一个方法中定义个内部类
class TheOuter{
...
public void method(){
...
class Inner{
....
}
...
}
.....
}
三.匿名内部类(定义在方法的参数内)
public class AnonymousInnerClass{
...
method(
new InnerClass(){
...
}
)
...
}
例子:
public class A{
public void init(){
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
showStatis("oh,MousePressed!");
}
});
}
}
内部类和外部类访问关系
例一.
public class Outer3{
        int outer_x=100;
        class InnerOne{
                public int y=10;
                private int z=9;
                int m=5;
                public void display2(){
                        System.out.println("displayouter_x:"+outer_x);
                }
                private void display(){
                        System.out.println("displayouter_x:"+outer_x);
                }
        }
        class InnerTwo{
                InnerOne innerx=new InnerOne();
                public void show(){
                        //不可直接访问Inner的y成员
                        //System.out.println(y);
                        //不可直接访问Inner的任何成员和方法
                        //System.out.println(InnerOne.y);display();
                        innerx.display();
                        innerx.display2();
                        System.out.println(innerx.y);
                }
        }
        void test(){
                InnerOne inner=new InnerOne();
                inner.display();
                inner.dispaly2();
                System.out.println(inner.y);
                InnerTwo innerTwo=new InnerTwo();
                innerTwo.show();
        }
        public static void main(String args[]){
                Outer3 outer=new Outer3();
                outer.test();
        }
}
例二.
 public class OuterReference{
        public static void main(String args[]){
                OuterY outer=new OuterY();
                OuterY.Inner inner=outer.getInner();
                inner.print();
        }
}
class OuterY{
        private int index=100;
        class Inner{
                private int index=50;
                public void print(){
                        int index=30;
                        System.out.pritnln(index);//30
                        System.out.pritnln(this.index);//50
                        System.out.pritnln(OuterY.this.index);//100

                }
        }
        Inner getInner(){
                return new Inner();
        }
}
例三.
public class Outer4{
        public static void main(String args[]){
                Outerclass outer=new Iuterclass();
                Outclass.innerclass inner=outer.new innerclass();
                inner.print();
        }
}
class Outerclass{
        int x;
        int y;
        class innerclass{
                public void print(){
                        x=10;
                        System.out.print("x="+x);
                }
        }
}
内部类可以被声明为static属性,该内部列即为静态内部类,普通类是不允许被声明为static的,其实,静态内部类相当于外部类的一个静态成员,,static的内部类不能使用外部类的非static成员.
public class StaticInnerClass{
        public static void main(String args[]){
                Outer1.Inner1 inner=new Outer1.Inner1();
                inner.m3();
        }
}
class Outer1{
        private int a1=5;
        private static int a2=10;
        private void m1(){
                System.out.println("m1() method!");
        }
        private static void m2(){
                System.out.println("m2() method!");
        }
        static class Inner1{
                public void m3(){
                        System.out.println(a2);
                        m2();
                }
        }
}

阅读(767) | 评论(0) | 转发(0) |
0

上一篇:java.net.concurrent

下一篇:jdk1.5增强的for循环

给主人留下些什么吧!~~