1、本地内部类
2、实例内部类
3、静态内部类
4、匿名内部类
首先,我要在这声明一下,内部类也是类,不管它是属于何种类型。
只要是类,就会有类的特性:继承 / 被继承,实现接口,套娃【内部类再套一个内部类】 都是可行的。
一、本地内部类
定义在方法里面的内部类,只能在方法中使用。
public void func(){
class Age{
public int num;
public Age(){
System.out.println("hehe");
}
}
}
这基本上很少使用。了解一下就行了
二、实例内部类
定义一个普通类,将这个类放到另一个普通类里面,在类里面的类就叫做实例内部类,比如说:
在外面的类就可以叫做外部类,不管是实例内部类还是外部类,都可以有自己的方法和属性。
但是在实例内部类里面不能定义静态的方法和属性,因为静态的方法和属性是属于对象的。
如果一定要加上static,那就要加上final,这样的话这个属性就是常量
如何实例化内部类
我们知道普通类是可以实例化的,那内部类呢????
简单来说:想要获取实例内部类的类型,是需要借助外部类的类名。你可以这么理解:在获取实例内部类的类型时,需要标明它是那个类的实例内部类。
至于后面的实例化,就如前我们前面一直在说的:将实例内部类当做是外部类的成员变量。也就是说需要借助外部类的对象来调用的。事实上确实如此
2.1、内部类的使用
在我们模拟实现顺序表、链表、二叉树等等,我们是不是要定义的 节点类。
我们一般是放在 构建 这些数据结构类的外面,其实是可以放在放在里面的。
你可以这么去理解:就是一个类 需要有 几部分组成,而这几个可以抽象成几个类。那么这几个类就可以用到 实例内部类。
class MyLinkedList{
//在创建链表的时候,就需要创造节点,这个节点可以在MyLinkedList里面创建
class Node{
public int val;
Node prev;
}
}
2.2、内部类的字节码文件
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():::");
}
}
2.4、实例内部类 - 重要的几个点
1、在实例内部类当中 不能定义一个静态的成员变量 和 方法。如果非要定义,只能定义一个静态常量(就是加上final)。
2、如何实例化 实例内部类的对象 : 外部类类名.实例内部类类名 引用变量 = 外部类的对象引用.new 内部类类名();
3、实例内部类当中 如果包含了和外部类同名的成员变量。
在实例内部类的内部,访问实例内部类的成员变量时,可以不用加修饰,直接输出。
但是!在实例内部类的内部,访问外部类的成员变量时,需要加上 外部类类名.this. 同名成员变量,才能访问。
三、静态内部类
静态内部类和实例内部类差不多,只是多了一个static修饰
跟 实例内部一样,静态内部类可以看作 外部类的一个 静态成员变量/方法。
因此,静态内部类 和 实例内部类,又会多出一个区别。
就是 静态内部类,可以定义 静态的成员和 方法。
3.1、如何访问外部类的普通的成员变量
匿名内部类以前讲过了,这里就不提了