Java中的内部类

内部类,外部类访问特点:

内部类访问外部类的内容 直接可以访问的,包括私有的。
外部类要想访问内部类的内容, 必须创建内部类的对象 对象调用。

内部类的分类:

成员内部类:在外部类的成员位置定义的内部类

1:内部类创建对象的格式理解

2:静态的成员内部类



Inner 是属于 Outer的静态内容,静态的随着类的存在而存在的, 所以可以用类名调用

3: 成员内部类访问当前外部类对象的内容



成员内部类如何创建对象使用?
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
Outer.Inner oi = new Outer().new Inner();//仅仅对public的内部类有效(我们通常使用private的内部类)

成员内部类为什么创建对象的格式是这样的?
直接写Inner找不到Inner在哪,这样写是用Outer限定一下,为什么可以这样限定呢?
因为此时还没有在内存开辟空间,属于字节码级别,类似static
告诉JVM Inner在Outer里面
new Outer.new Inner()
非静态的成员是随着对象的存在而存在的,
没有Outer对象,Outer类里的成员是不能用的
所以要想有Inner的对象,必须现有Outer的对象
Outer o = new Outer();
Outer.Inner oi = o.new Inner();
修改而来的。

4: 私有成员内部类




局部内部类:

public class Outer{
public void show{
局部内部类{}
}
}

访问特点: 内部类访问外部类内容直接访问,外部类访问内部类的内容需创建对象访问

局部内部类的运用:


想办法让外界去使用Inner对象,也就是想办法把Inner对象扔出方法去,怎么从方法扔出去呢?
方法的返回值就可以做到。
把 Inner 对象扔出去,返回值类型 定义为 Inner类型就可以了。
但是 Inner 是局部的东西,不能直接在外面写。
这时候我们只能改变策略。返回值类型 是Inner类型的时候我们返回一个Inner对象,
返回值类型是Inner的父类或者父接口类型的时候,我们依然也可以返回一个Inner对象。

局部内部类可以访问局部变量,但是此时的局部变量视为前面有一个隐藏的final


我们手动加final,则两次修改Outer_Method_num值的行为报错。

我们不手动加final,且在Outer方法内修改Outer_Method_num的值(他此时对Inner类不是最终态了)则两次在局部内部类Inner中的Outer_Method_num调用都报错。

我们不手动加final,也不在Outer方法内修改Outer_Method_num的值(他此时对Inner类是最终态度)则可以在局部内部类Inner中调用Outer_Method_num

局部内部类中的匿名内部类

我们想直接重写并且实现接口里的方法,但是想跳过新建一个类implements这个接口等等麻烦的步骤的时候,我们使用匿名内部类。
我们想调用一下Face_Show方法



因为之前太麻烦了,因此我们直接在Main函数里使用匿名内部类实现Face_Show方法。

posted @ 2019-11-13 21:35  卯毛  阅读(766)  评论(0编辑  收藏  举报