一、什么是内部类
一个类在另一个类的内部,这个就叫内部类。
如下图,InnerClass 类就是内部类,而 OuterClass 类就叫外部类
二、内部类简单介绍
在Java中,可以将一个类定义在另一个类或者一个方法的内部,前者为内部类,后者为外部类。
内部类是封装的一种体现
创建内部类时,我们要明确两点:
1.定义在class 类名{} 花括号外部的,即使是在一个文件夹里,都不能称为内部类!!
class OuterClass{ class InnerClass{ } } public class Demo3 {
OuterClass 和 Demo3 彼此互相独立,不能为对方的内部类
2.内部类和外部类共用一个java 源文件,但是经过编译之后,内部类会形成单独的字节码文件。
内部类生成的字节码文件名:外部类$内部类.class
同时,内部类类型可以分为四种,分别为 实例内部类、静态内部类、本地内部类 (了解)、匿名内部类 ,下面我将依依为大家介绍。
三、实例内部类
实例内部类是内部类中比较普通的,如下类型就是实例内部类
class Out{ //实例内部类 class Inner{ }
(1)实例内部类的成员变量和方法的构建
跟普通类的一样,实例内部类也能构建自己的成员变量和方法(包括构造方法)
class Out{ class Inner{ public int data2 = 3; private int data3 = 4; public void Inner(){ System.out.println("实例内部类的构造方法"); } public void InnerFunc(){ System.out.println("实例内部类的普通方法"); } }
需要注意:
① 在实例内部类中,不能构建静态的成员变量,要想构建静态的成员变量,必须加 final
② 在实例内部类中,不能构建静态的成员方法,就算加 final 也不行!!
(2)实例内部类在类外创建
由于内部类的特殊性,不能用类名实例化对象!!必须要借助外部类的实例化对象辅助,如下
外部类.内部类 变量名 = 外部类实例.new 内部类;
class Out{ class Inner{ public int data2 = 3; public void Inner(){ System.out.println("实例内部类的构造方法"); } public void InnerFunc(){ System.out.println("实例内部类的普通方法"); } } } public class Demo2 { public static void main(String[] args) { Out out = new Out(); Out.Inner inner = out.new Inner(); //也可以写为 Out.Inner inner = new Out().new Inner(); inner.InnerFunc(); System.out.println(inner.data2); } }
为什么要借助外部类对象才能实例化内部类?
我们可以把内部类Inner 当成外部类 Out 的一个实例成员,实例成员的调用都是依赖对象的。这也就是为啥要有 外部类对象才能获取 实例内部类的原因。
注意:
在外部类的方法中,能直接用内部类实例化成员变量,不必再借用外部类的实例化对象
class Out{ class Inner{ public void Inner(){ System.out.println("实例内部类的构造方法"); } public void InnerFunc(){ System.out.println("实例内部类的普通成员方法"); } } // 外部类 的成员方法 public void Func(){ Inner inner = new Inner(); inner.InnerFunc(); } }
(3)在内部类访问外部类的成员变量
在内部类中可以访问外部类的成员变量
例如:
class Out{ public int data1 = 1; private int data2 = 2; class Inner{ public int data3 = 3; private int data4 = 4; public void InnerFunc(){ System.out.println(data1); System.out.println(data2); System.out.println(data3); System.out.println(data4); } } }
在内部类中访问外部类的成员变量都几条规则需要大家掌握:
① 当实例内部类的成员变量跟外部类的成员变量同名时,按就近原则访问
class Out{ public int data1 = 1; class Inner{ public int data1 = 11; public void InnerFunc(){ System.out.println(data1); } } }
② 访问同名的外部类成员变量 需要外部类名+this才能访问 Out.this.data1
class Out{ public int data1 = 1; class Inner{ public int data1 = 11; public void InnerFunc(){ System.out.println(data1); System.out.println("外部类的data1:"+Out.this.data1); } } }
③ 访问静态同名的外部类成员变量 需要外部类 才能访问 Out.data2
class Out{ public int data1 = 1; public static int data2 = 2; class Inner{ public int data1 = 11; public static final int data2 = 22; public void InnerFunc(){ System.out.println(data2); System.out.println("外部类的data2:"+Out.data2); } } }