• Java基础——内部类


    一、什么是内部类

      将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类

      内部类所在的类在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。

      内部类主要分为四种:

        成员内部类、局部内部类、匿名内部类、静态内部类

    二、成员内部类

      成员内部类,顾名思义它的身份是作为一个类的成员,我们来看它是怎么定义的

    package com.jiangbei.test.innerclass;
    
    /**
     * 外部类
     * 作者: Administrator
     * 日期: 2017/9/24
     **/
    public class OutterClass {
        private String name;
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        // 内部类
        public class InnerClass{
            public InnerClass(){
                name = "张三";
                age = 18;
            }
            public void show(){
                System.out.println("i am InnerClass");
            }
            public void display(){
                System.out.println("name:"+getName()+" age:"+getAge());
            }
        }
        // 推荐使用getInnerClass()获取内部类
        public InnerClass getInnerClass(){
            // 当然也可以在外部类创建内部类引用,当内部类为空时新建,不为空时返回,实现单例的效果
            return new InnerClass();
        }
    
        public static void main(String[] args) {
            OutterClass outter = new OutterClass();
            // InnerClass inner = new InnerClass(); 无法直接创建内部类
            // OutterClass.InnerClass inner = outter.new InnerClass(); 不推荐
            OutterClass.InnerClass inner = outter.getInnerClass();
            inner.show();
            inner.display();
        }
    }

      结果:

      

      由此我们可以知道:

        1.成员内部类依靠外部类,只有创建了外部类实例才能创建成员内部类

         2..成员内部类可以无限制访问外部类成员,即使它是private的

         3.外部类想访问成员内部类的方法和变量,必须通过内部类的实例

     三、局部内部类

      嵌套在方法和作用域的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。

      引用海子(http://www.cnblogs.com/dolphin0520/)的实例:

    class People{
        public People() {
             
        }
    }
     
    class Man{
        public Man(){
             
        }
         
        public People getWoman(){
            class Woman extends People{   //局部内部类
                int age =0;
            }
            return new Woman();
        }
    }

       这里需要注意的是:

        1.局部内部类类似一个局部变量,无法拥有访问修饰符!

    四、匿名内部类

      一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

    new 父类构造器(形参列表) | 实现接口(){

      // 重写方法或实现方法
    }

      比较典型的就是swing中的事件绑定了:

    button1.addActionListener(  
                    new ActionListener(){  
                        public void actionPerformed(ActionEvent e) {  
                            System.out.println("你按了按钮二");  
                        }  
                    });

       注意点:

        1.匿名内部类必须是实现一个接口或者继承一个父类的方式

          2.匿名内部类没有构造函数

          3.匿名内部类不能存在静态变量静态方法

          4.匿名内部类不能是抽象的(继承抽象类、实现接口必须重写、实现所有方法)

          5.Java为了避免数据不同步的问题,做出了匿名内部类只可以访问final的局部变量的限制。

          关于这点通俗的解释,请参见:http://www.jianshu.com/p/609ca1c584ac

       更多匿名内部类的详解,参见:http://www.cnblogs.com/chenssy/p/3390871.html

    五、静态内部类

      和成员变量类似,不过它是静态的,不再需要依靠外部类

      /**
         *静态内部类
         */
        static class InnerClass1{
            /* 在静态内部类中可以存在静态成员 */
            public static String _name1 = "chenssy_static";
            
            public void display(){
                /* 
                 * 静态内部类只能访问外围类的静态成员变量和方法
                 * 不能访问外围类的非静态成员变量和方法
                 */
                System.out.println("OutClass name :" + name);
            }
        }

      更多有关内部类的讲解与深入,请参见http://www.cnblogs.com/dolphin0520/p/3811445.html

                        http://www.cnblogs.com/chenssy/p/3388487.html

  • 相关阅读:
    [转]WM_COMMAND消息
    [转]DELPHI之关于String的内存分配
    [转]我们永远优雅,但绝不炫耀:合并BPL包图文教程!
    [转]AS400
    [转]Delphi中变体记录及存储方式
    [转]WaitForMultipleObject与MsgWaitForMultipleObjects用法
    [转]delphi中的HWnd,THandle,HDC有什么区别
    [转]Delphi使用FireBird嵌入式版本发布方法
    [转]如何使用Delphi设计强大的服务器程序
    Oracle递归查询
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7586453.html
Copyright © 2020-2023  润新知