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