内部类的概念、四种内部类之一的成员内部类
11.内部类与常用类
11.1 内部类
11.1.1 内部类的分类
- 内部类分为四种:
成员内部类
静态内部类
局部内部类
匿名内部类
11.1.2 什么是内部类
- 概念:在一个类的内部再定义一个完整的类
- 特点:
编译之后可生成独立的字节码文件;
内部类可直接访问外部类的私有成员,而不破坏封装;
可为外部类提供必要的内部功能组件;
11.1.3 成员内部类
- 在类的内部定义,与实例变量、实例方法同级别的类;
- 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象;
Outer out = new Outer();
Inter in = out.new Inner(); - 当外部类、内部类存在重名属性时,会优先访问内部类属性;
- 成员内部类不能定义静态成员;
public class TestInstanceInnerClass {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();//特殊的创建方法,不具普适性
in.m2();
}
}
//类级别、对象级别
class Outer{
private int a = 10;//外部类实例变量
//实例方法
public void m1() {}
class Inner{//成员内部类
public void m2() {
}
}
}
因为成员内部类的依赖于外部类的特殊性,如果没有外部类,那么就成员内部类就是“不可见”的,当你希望某部分方法只在一个特殊功能的类中被使用,那么就可以使用成员内部类进行定义,那么外界就无法使用这些方法。
成员内部类其实和正常的声明一个类并无多大差别,使用到的情况也很少,只要注意成员内部类不能定义静态成员,以及成员内部类依赖于外部类对象的特殊创建方法即可。
11.1.4 静态内部类
- 不依赖外部类对象、可直接创建或通过类名访问、可声明静态成员;
- 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
Outer.Inner inner = new Outer.Inner();
Outer.Inner.show();
public class TestStaticInnerClass {
public static void main(String[] args) {
System.out.println(Outer.Inner.b);//静态成员类的静态属性,可以通过类名.当方法访问
Outer.Inner in = new Outer.Inner();//成员类的特殊new语法
in.m2();
}
}
class Outer{
static int a = 10;
//静态成员类
static class Inner{
static int b = 20;
public void m2() {
System.out.println(Outer.a);
System.out.println("Inner m2()");
}
}
}
静态内部类就是用static修饰的成员内部类,通过static修饰为静态,该类的访问范围被扩大了,不再依赖于外部类对象。同样,这样静态内部类和普通的类的差别就更小了。所以一般很难有场景会使用到静态内部类。