内部类简单来说就是把一个类的定义放到另一个类的定义内部
内部类分为:成员内部类、局部内部类、匿名内部类、静态内部类
成员内部类:最常见的内部类
public class Outter { private int i = 0; public static String name = "sam"; public Outter(int i) { this.i = i; } class Inner{ public Inner() { System.out.println("Inner Class"); } public void add() { System.out.println(i + " Name: " + name); System.out.println("add()"); } } }
测试类:
public static void main(String[] args) { Outter outter = new Outter(1); Outter.Inner inner = outter.new Inner(); inner.add(); }
结果:
Inner Class 1 Name: sam add()
成员内部类Inner看起来是外部类Outter的成员,所以以此命名
内部类可以访问外部类的所有属性和方法(包含private和static)
外部类访问内部类一般就是通过上述代码的方式
当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名
成员,需要以下面的形式进行访问:
外部类.this.成员变量 外部类.成员方法 原文: 外部类.this.成员变量 外部类.this.成员方法
这点和原文不一样,就是访问外部类的方法,没有this,实验了jdk1.7和jdk1.8,不知道原文是什么版本
public class Outter { private int i = 0; public static String name = "sam"; public Outter(int i) { this.i = i; } private static void del() { System.out.println("Outter del()"); } class Inner{ private int i = 2; public Inner() { System.out.println("Inner Class"); } private void del() { System.out.println("Inner del()"); } public void add() { del(); Outter.del(); System.out.println("Inner Class: " + i + " Name: " + name); System.out.println("Outter Class: " + Outter.this.i + " Name: " + name); System.out.println("add()"); } } }
内部类的修饰符可以是任意的,但是如果为private,只能在外部类的内部进行访问,其他地方不可以。这一点不同和外部类,外部类的修饰符
只能是public和默认,应该是因为此时的内部类相当于外部类的成员,而成员可以是任意的
局部内部类:
定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
为什么要使用局部内部类?
1、实现某个接口,可以创建并返回对其的作用
2、要解决一个复杂的问题,创建一个类来辅助解决,但又不希望这个类是公共可用的
还没写完。。。
本文参考:Java编程思想,Java内部类详解
很多内容来自海子的这篇博客,算是转载,也加了自己的理解