内部类

内部类

基本概念:

  1. 一个事物内部包含另一个事物,那么这就是一个类包含另一个类,例如:身体和心脏。
  2. 分类:
    1. 成员内部类
    2. 局部内部类(包括匿名内部类)

成员内部类:


格式:

修饰符 class 外部类名称{

​ 修饰符 class 内部类名称{

​ }

}


注意:内用外 ,随意访问,外用内,需要内部类对象。

这样编译之后的.class文件,外部类仍为 外部类名称.class,而内部类则为 外部类名称$内部类名称.class(所以不推荐类名中带有 ‘$’符号,因为容易被误以为是个内部类)。


使用:

两种方式:

  1. 间接方式:在外部类方法中,使用内部类,然后main调用外部类方法
  2. 直接方法:使用公式,【外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();】(注意:有 '.')

在内部类中访问重名外部类成员变量:

​ 外部类名称.this.变量名;



局部内部类


定义:一个类在一个方法内部定义,就是局部内部类。

“局部”:只有当前所属的方法可以使用它,出了方法就不可以了。

定义格式:

修饰符 class 外部类名称{

​ 修饰符 返回值类型 外部类方法名称(参数列表){

​ class 局部内部类名称{

​ //...

​ }

​ }

}

如果希望访问所在方法的局部变量,那么 这个局部变量必须是【有效final】的。

从java8开始,只要局部变量事实不变,那么final关键字可以省略。


原因:

  1. new出来的对象在堆内存中。
  2. 局部变量跟方法走,在占内存中。
  3. 方法运行结束之后,立刻出栈,局部变量会立刻消失。
  4. 但是new出来的对象会在堆中持续储存在,直到垃圾回收消失。

匿名内部类(重要)



如果接口实现类(或父类的子类)只需要使用唯一的一次,这种情况可以使用【匿名内部类】。


格式:

接口名称 对象名 = new 接口名称(){

​ //覆盖重写所有抽象方法

};


注意事项:

  1. 匿名内部类,在【创建对象】时,只能使用一次,如果希望多次调用对象,且类内容一致,必须单独定义实现类。
  2. 匿名对象,在【调用方法】时,只能调用一次。(匿名对象省去了格式第一行等号及等号之前的内容)
  3. 匿名内部类是省略了【实现类/子类名称】,但是匿名对象省略了【对象名称】
  4. 强调 匿名内部类和匿名对象不是一回事!!!

联系权限修饰符

public > proteced > (default) > private


定义类时,修饰符规则:

  1. 外部类:public/(default)---------(类修饰符使用private无意义,使用protected时,不同包类访问时会有矛盾)
  2. 成员内部类:都可以
  3. 局部内部类:什么都不能写

你可能感兴趣的:(内部类)