> 文章列表 > Java - 内部类

Java - 内部类

Java - 内部类

1、本地内部类
2、实例内部类
3、静态内部类
4、匿名内部类
首先,我要在这声明一下,内部类也是类,不管它是属于何种类型。

只要是类,就会有类的特性:继承 / 被继承,实现接口,套娃【内部类再套一个内部类】 都是可行的。

一、本地内部类

定义在方法里面的内部类,只能在方法中使用。

public void func(){class Age{public int num;public Age(){System.out.println("hehe");}}}

这基本上很少使用。了解一下就行了

二、实例内部类

定义一个普通类,将这个类放到另一个普通类里面,在类里面的类就叫做实例内部类,比如说:
Java - 内部类
在外面的类就可以叫做外部类,不管是实例内部类还是外部类,都可以有自己的方法和属性。

但是在实例内部类里面不能定义静态的方法和属性,因为静态的方法和属性是属于对象的。
Java - 内部类
如果一定要加上static,那就要加上final,这样的话这个属性就是常量
Java - 内部类

如何实例化内部类
我们知道普通类是可以实例化的,那内部类呢????
Java - 内部类
简单来说:想要获取实例内部类的类型,是需要借助外部类的类名。你可以这么理解:在获取实例内部类的类型时,需要标明它是那个类的实例内部类。

至于后面的实例化,就如前我们前面一直在说的:将实例内部类当做是外部类的成员变量。也就是说需要借助外部类的对象来调用的。事实上确实如此

2.1、内部类的使用

在我们模拟实现顺序表、链表、二叉树等等,我们是不是要定义的 节点类。
我们一般是放在 构建 这些数据结构类的外面,其实是可以放在放在里面的。
你可以这么去理解:就是一个类 需要有 几部分组成,而这几个可以抽象成几个类。那么这几个类就可以用到 实例内部类。

class MyLinkedList{//在创建链表的时候,就需要创造节点,这个节点可以在MyLinkedList里面创建class Node{public int val;Node prev;}
}

2.2、内部类的字节码文件

Java - 内部类

2.3、在实例内部类中 包含与 外部类 属性名字相同的属性。那么如何在 实例内部类中访问?

//普通类
class OuterClass{public int data1 = 1;private int data2 = 2;//实例内部类class InterClass{public int data3 = 3;private int data4 = 4;public int data1 = 999;public static final int data5 = 5;public void func1(){System.out.println(OuterClass.this.data1);System.out.println("实例内部类的func():::");}}public void func1(){System.out.println("普通类的func():::");}
}

Java - 内部类

2.4、实例内部类 - 重要的几个点

1、在实例内部类当中 不能定义一个静态的成员变量 和 方法。如果非要定义,只能定义一个静态常量(就是加上final)。
2、如何实例化 实例内部类的对象 : 外部类类名.实例内部类类名 引用变量 = 外部类的对象引用.new 内部类类名();
3、实例内部类当中 如果包含了和外部类同名的成员变量。
在实例内部类的内部,访问实例内部类的成员变量时,可以不用加修饰,直接输出。
但是!在实例内部类的内部,访问外部类的成员变量时,需要加上 外部类类名.this. 同名成员变量,才能访问。

三、静态内部类

静态内部类和实例内部类差不多,只是多了一个static修饰
Java - 内部类
跟 实例内部一样,静态内部类可以看作 外部类的一个 静态成员变量/方法。
因此,静态内部类 和 实例内部类,又会多出一个区别。
就是 静态内部类,可以定义 静态的成员和 方法。

3.1、如何访问外部类的普通的成员变量

Java - 内部类

匿名内部类以前讲过了,这里就不提了