码迷,mamicode.com
首页 > 其他好文 > 详细

内部类

时间:2016-08-12 01:23:28      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

内部类,顾名思义,就是放在一个类内部的类,一般情况下我们比较少用,但是内部类在实现逻辑的隐藏,多重继承方面有着不小的用途。内部类,主要区分如下

技术分享

 

1. 静态内部类

可以将该内部类看作静态方法,可以访问外部类静态变量和静态方法,但是不能访问外部类实例变量和实例方法

实例化方式:Out.In in = new Out.In();

public class Out {
    private int instance_id = 0;
    private static int static_id = 1;

    public static class In{
        public void m(){
            static_id = 4;   // 可以访问
            instance_id = 3;  // 无法访问
        }
    }
}

2. 实例内部类

和静态内部类相比,少了一个static修饰符,其他不变,理解方式相同,把该内部类看作一个实例方法,可以访问外部类实例变量和实例方法,静态变量和静态方法

实例化方式:Out.In in = new Out().new In();

public class Out {
    private int instance_id = 0;
    private static int static_id = 1;

    public class In{
        public void m(){
            static_id = 4;   // 可以访问
            instance_id = 5; // 可以访问
        }
    }
}

3. 局部内部类

看作一个局部变量,只不过变量类型是Class而已,既然是一个局部变量,那么只能在方法中使用。

public class Out {
    private int instance_id = 0;
    private static int static_id = 1;

    public void m(){
        int k = 0;
        class In{
            public void n(){
                static_id = 4;          // 可以访问
                instance_id = 5;      // 可以访问
                System.out.println(k); // 可以访问(JDK1.8以前变量k必须是final修饰才能访问)
                k = 1;           // 不能修改
            }
        }
    }
}

4. 匿名内部类

可以理解为一个逻辑代码块,一般用于只调用一次,就不会再调用的情况下。匿名内部类没有class,extends,implements等关键字,隐式地继承一个父类或实现一个接口,不能有构造方法。

直接实例化接口方式

public class Out {
    public void m(){
        new A(){
            public void a() {
                
            }
        }.a();// 实例化完直接调用实现的a方法
    }
}

interface A{
    void a();
}

如果内部类是已存在的类,则相当于继承该类,可以重写父类中的方法。

public class Out {
    public void m(){
        // 相当于继承HashMap
        new HashMap<String, String>(){
            private static final long serialVersionUID = 1L;
            @Override
            public String get(Object key) {
                return super.get(key);
            }
        };
    }
}

多重继承

如果一个类实现一个接口,同时还要继承一个抽象类,但这个接口和抽象类中都有一个同名的方法,那么就不能单纯的使用extends+implements了,这时内部类就发生作用了,如下代码,我们将继承的逻辑通过内部类来实现,这样就不会让接口的方法和抽象类的方法重叠了

interface A{
    void a();
}

abstract class B{
    abstract void a();
}

public class Out implements A{
    @Override
    public void a() {
        
    }
    
    class In extends B{
        @Override
        void a() {
            
        }
    }
}

总结

通过以上的介绍,可以对内部类有个简单的概念,实际开发中使用内部类相对较少,初学者可以不必深究,但是如果想要深入学习java的高级编程,还是需要花费点时间去摸索,通过内部类我们可以写出非常优雅的代码和设计出漂亮的程序结构。

 

内部类

标签:

原文地址:http://www.cnblogs.com/windyrain/p/5763052.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!