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

 

posted @ 2017-09-24 10:15  ---江北  阅读(242)  评论(0编辑  收藏  举报
TOP