1. 基本概念
1.1 定义
定义在类内部的类称为内部类
1.2 优缺点
- 优点
- 内部类和外部类可以方便的访问彼此的私有方法和私有属性
- 内部类可以解决java的单继承局限。
- 内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外部对象的信息相互独立。
- 内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。
- 内部类提供了更好的封装,除了该外围类,其他类都不能访问。
- 缺点
- 结构复杂
1.3 内部类分类
-
成员内部类
- 成员内部类中不能够定义静态方法和成员
public class Out { private static String name; private Inner inner = new Inner(); public class Inner { public String getName() { return name; } } }
-
静态内部类
- 静态内部类不依赖于外部类,可以直接创建
- 静态内部类不可以访问外部类中非静态的成员属性和成员方法。
public class Out { public final private static String name; public static class Inner { public String getName() { return name; } } public static void main(String[] args) { Out.Inner inner =new Out.Inner(); inner.getName(); } }
-
匿名内部类
-
匿名内部类不能定义任何静态成员、方法。(但是可以使用static finnal:final类型在编译期间确定变量值,通过常量池会维护这些变量。)
-
匿名内部类中的方法不能是抽象的;
-
匿名内部类不能定义构造器;
-
匿名内部类必须实现接口或抽象父类的所有抽象方法。
-
匿名内部类访问的外部类成员变量或成员方法必须用static修饰;
-
匿名内部类是直接使用 new 来生成一个对象的引用;
-
匿名内部类是不能够被重复使用
public static void main(String[] args) { String address="aa"; new Thread(new Runnable() { private static final String name="aa"; public void test(){ } @Override public void run() { System.out.println(name); } }); }
-
-
方法内部类
- 方法内部类中不允许使用访问权限修饰符(public、private、protected)
- 在JDK8版本之中,方法内部类中调用方法中的局部变量,可以不需要修饰为 final,匿名内部类也是一样的,主要是JDK8之后增加了 Effectively final 功能
public class Out { public void testMethodClass() { String name="aa"; class MethodClass { public String getName() { return name; } } MethodClass methodClass = new MethodClass(); } }