zoukankan      html  css  js  c++  java
  • 26-28 内部类

    http://baike.baidu.com/view/7942850.htm?fr=aladdin

    1、内部类就是在一个类的内部定义的类。
    2、内部类中不能定义静态成员(方法体外定义的static nested class可以定义静态成员)

    3、内部类可以直接访问外部类中的成员变量(static nested class不能访问外部类中的非static成员变量)

    4、内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中。

    (1)方法体外

      类前修饰可以public,protect,default,private(可以使用static,final,abstract),决定对其他类是否可见。

    (1-1)方法体外的内部类,类似成员变量。创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用它去创建内部类的实例对象。

    (1-2)方法体外的内部类加上static,成为static nested class,不再具有内部类特性。狭义上说,它不是内部类,与普通类在运行时的行为和功能无区别,只是编译引用时的语法有区别。

        可定义为4中访问权限类型,而普通类只有两种类型(public和默认)。
        引用static nested class的名称为“外部类.内部类”,不需创建外部类实例
        能直接访问外部类的static成员变量,不能直接访问外部类的非static成员变量。
         可以定义static成员变量。

        

    (2)方法体中

      类前修饰不能有4种访问类型修饰符(不可以使用static是因为方法体内局部变量也不可以是static的,可使用final或abstract),对其他类不可见。先定义后使用,只能在方法中实例化。

      可以访问方法体中的final修饰的局部变量。方法中的final局部变量放在堆中,而非栈中。

    (2-1)方法体中的内部类,类似局部变量。

    (2-2)static方法体中的内部类也是static nested class。这是不能在类前面加static,它与普通方法中的内部类应用相似。
        可以访问静态方法中final修饰的局部变量,还可以直接访问外部类中的static成员变量,不能直接访问外部类的非static成员变量

    (2-3)方法体中可以创建匿名内部类。即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称。匿名内部类必须继承其他类或实现其他接口。

    public class Outer {
        static int x = 0;
        int y = 0;
        public void fun1(){
            x=1;
            y=1;
            class C{//(2-1)方法体中的内部类,类似局部变量,前面不能有4种访问类型修饰符(可使用final或abstract),对其他类不可见。先定义后使用。
                //这种内部类可以访问方法体中的final修饰的局部变量。
                //static int i = 0;//static不行,static final可以
                public void cFun(){
                    x=4;
                    y=4;
                }
            }
            C c = new C();
          //(2-3)方法体中可以创建匿名内部类
            new Thread(new Runnable(){
                            public void run(){
                            }
                       }
                       ).start();
        }
        
        public static void fun2(){
            x=1;
            class D{//(2-2)static方法体中的内部类也是static nested class。这是不能在类前面加static
                //静态方法中的static nested class与普通方法中的内部类应用相似。
                //除了可以直接访问外部类中的static成员变量,还可以访问静态方法中final修饰的局部变量。
                //static int i = 0;//static不行,static final可以
                public void dFun(){
                    x=5;
                    //y=5;y不是static的,在static nested class中不可访问
                }
            }
            D d = new D();
        } 
        public class A{//(1-1)方法体外的内部类,类似成员变量,4种访问权限来修饰决定对其他类是否可见
            //static int i = 0;//static不行,static final可以
            public void aFun(){
                x=2;
                y=2;
            }
        }
        public static class B{//(1-2)方法体外的内部类加上static,成为static nested class,不再具有内部类特性。
            //狭义上说,它不是内部类,与普通类在运行时的行为和功能无区别,只是编译引用时的语法有区别。
            //可定义为4中访问权限类型,而普通类只有两种类型(public和默认)
            //引用static nested class的名称为“外部类.内部类”,不需创建外部类实例。
            //能访问外部类的static成员变量
            static int i = 0;//可以定义static成员。
            public void bFun(){
                x=3;
                //y=3;y不是static的,在static nested class中不可访问
            }
        }
        public static void main(String[] args){
            A a = new Outer().new A();
            Outer.B b1 = new Outer.B();
            B b2 = new B();//外部类中可以省略外部类名
        }
    }

     编译结果:

      

  • 相关阅读:
    Atitit. 真正的全中国文字attilax易语言的特点以及范例
    Atitit.nosql api 标准化 以及nosql数据库的实现模型分类差异
    Google"员工"曝内幕:Google员工的17个秘密
    WINDOWS 乱码解决
    计算机软件开发文档编写指南
    概要设计阶段概要设计说明书
    关于管理的经典故事(员工激励)
    概要设计阶段组装测试计划
    一个还不太老的程序员的体会
    程序员四大忌 你该如何避免呢?
  • 原文地址:https://www.cnblogs.com/seven7seven/p/3935172.html
Copyright © 2011-2022 走看看