zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ural(Timus) 1019 Line Painting
    ACMICPC Live Archive 2031 Dance Dance Revolution
    poj 3321 Apple Tree
    其他OJ 树型DP 选课
    poj 3548 Restoring the digits
    ACMICPC Live Archive 3031 Cable TV Network
    递归循环获取指定节点下面的所有子节点
    手动触发asp.net页面验证控件事件
    子级Repeater获取父级Repeater绑定项的值
    没有列名的数据绑定
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7586453.html
Copyright © 2011-2022 走看看