一、定义
在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
Inner class的名字不能与包含它的类名相同;
Inner class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而
外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.成员。
二、共性
1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的
类名和$符号 。
2.内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成
员变量,无论是否是private的 。
3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成
员变量 。
三、分类
1.成员内部类
2.局部内部类
3.匿名内部类
4.静态内部类
四、举例说明
1.成员内部类
- public class Test {
- public static void main(String[] args) {
- //第一种方式:
- Outter outter = new Outter();
- Outter.Inner inner = outter.new Inner(); //必须通过Outter对象来创建
- //第二种方式:
- Outter.Inner inner1 = outter.getInnerInstance();
- }
- }
- class Outter {
- private Inner inner = null;
- public Outter() {
- }
- public Inner getInnerInstance() {
- if(inner == null)
- inner = new Inner();
- return inner;
- }
- class Inner {
- public Inner() {
- }
- }
- }
2.局部内部类
- class People{
- public People() {
- }
- }
- class Man{
- public Man(){
- }
- public People getWoman(){
- class Woman extends People{ //局部内部类
- int age =0;
- }
- return new Woman();
- }
- }
3.匿名内部类
- //A、继承式的匿名内部类
- public class Car {
- public void drive(){
- System.out.println("Driving a car!");
- }
- public static void main(String[] args) {
- Car car = new Car(){
- public void drive() {
- System.out.println("Driving another car!");
- }
- };
- car.drive();
- }
- }
- //B、接口式的匿名内部类。
- interface Vehicle {
- public void drive();
- }
- class Test{
- public static void main(String[] args) {
- Vehicle v = new Vehicle(){
- public void drive(){
- System.out.println("Driving a car!");
- }
- };
- v.drive();
- }
- }
- //C、参数式的匿名内部类。
- class Bar{
- void doStuff(Foo f){
- f.foo();
- }
- }
- interface Foo{
- void foo();
- }
- class Test{
- static void go(){
- Bar b = new Bar();
- b.doStuff(new Foo(){
- public void foo(){
- System.out.println("foofy");
- }
- });
- }
- }
4.静态内部类
- public class Test {
- public static void main(String[] args) {
- Outter.Inner inner = new Outter.Inner();
- }
- }
- class Outter {
- public Outter() {
- }
- static class Inner {
- public Inner() {
- }
- }
- }
五、关于内部类,大家掌握三点:
①如何创建成员内部类的对象
②如何区分调用外部类、内部类的变量(尤其是变量重名时)
③局部内部类的使用

我的微信
有问题微信找我