浅谈Java内部类

如果文章对你有所帮助,请点喜欢并关注,这将是我最大的动力,谢谢

  • 为什么要有内部类

1.内部类是为了更好的封装,把内部类封装在外部类里,不允许同包其他类访问
2.内部类中的属性和方法即使是外部类也不能直接访问
3.相反内部类可以直接访问外部类的属性和方法,即使private
4.利于回调函数的编写。 PS:回调函数是函数的迭代
5.当描述事物,如身体里的大脑时,大脑在身体内部,可以通过内部类直观描述

  • 内部类特点

1.内部类对象不仅指向该内部类,还指向实例化该内部类的外部类对象的内存。

zz.png

2.内部类和普通类一样可以重写Object类的方法,如toString方法;并且有构造函数,执行顺序依旧是先初始化属性,再执行构造函数
3.在编译完之后,会出现(外部类.class)和(外部类﹩内部类.class)两个类文件名。
4.内部类可以被修饰为private,只能被外部类所访问。事实上一般也都是如此书写。
5.内部类可以被写在外部类的任意位置,如成员位置,方法内。

  • 内部类对象的建立

1在同包其他类 以及main方法中(前提要内部类没有被修饰成private,所以一般不采用)

1)先创建外部类对象,再通过外部类对象创建内部类
Out outer = new Out();
Out.In inner = outer.new In(); //第一个Out是为了说明该内部类到底属于哪个外部类
2)通过匿名外部类创建内部类
Out.In inner = new Out().new In();

2在外部类里

可直接创建对象,如 In inner = new In(); 或者直接new In();

  • 内部类的访问

1.静态时,静态内部类只能访问外部类静态成员;非静态内部类都可以直接访问。(原因是:内部类有一个外部类名.this的指引)当访问外部类静态成员出现重名时,通过(外部类名.静态成员变量名)访问。如,Out.show();
2.重名情况下,非静态时,内部类访问自己内部类通过this.变量名。访问外部类通过(外部类名.this.变量名)访问 。如Out.this.show();
3.在没有重名的情况下,无论静态非静态,内部类直接通过变量名访问外部成员变量。

  • 外部类的访问

1.内部类为非静态时,外部类访问内部类,必须建立内部类对象。建立对象方法,如前所述。
2.1 内部类为静态时,** 外部类访问非静态成员,通过(外部类对象名.内部类名.方法名)访问,如new Out().In.function();
2.2 内部类为静态时,
外部类访问静态成员时,直接通过(外部类名.内部类名.方法名)**
,如 Out.In.funchtion();
PS:当内部类中定义了静态成员时,内部类必须是静态的;当外部静态方法访问内部类时,内部类也必须是静态的才能访问。

  • 内部类分类

  • 1成员内部类

也是最常规的内部类。该内部类相当于位于外部类的成员的位置。该内部类可以访问外部类的所有成员和方法,即使是private.

  • 2静态内部类

1)该类被修饰为static。同时作为静态内部类,他不能访问外部类非静态的成员或方法。
2)访问方式如上所述。
3)一般书写静态类时,不涉及成员变量。

  • 3方法内部类

类被创建在外部类方法中
1)可以访问外部类中的成员
2)不能被static private 修饰,因为他不再是成员位置,只有成员才能被修饰为static...
3)因此内部类不能有静态成员
4)内部类要访问外部方法中的局部变量时,该局部变量需要被修饰成final。

  • 4匿名内部类

1)就是一个内部类的简化版
2)定义匿名内部类的前提是,该类必须继承一个外部类或者实现接口。
具体实现如下图
这是一个继承类的正常版,一共分为这几步


1.png

通过匿名内部类将一步到位实现该操作

2.png

PS:因为内部类是匿名的,也就是没有名字,所以该类一次只能调用一个方法,通常在写程序时也是如此,这也正是他优点,在只写一个内部类调用方法时,他可以使整个代码看上去很简洁。
2015.8.26更新
匿名内部类在Swing的消息机制中广泛使用,具体看例子
Swing

推荐阅读更多精彩内容

  • Java 内部类 分四种:成员内部类、局部内部类、静态内部类和匿名内部类。 1、成员内部类: 即作为外部类的一个成...
    ikaroskun阅读 997评论 0 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 29,862评论 18 399
  • 局部内部类 局部内部类是内部类的第二种形式,它让内部类的“隐藏”得更深一层——写在外部类的方法内部,而不是处于和外...
    java部落阅读 278评论 0 2
  • 正文 前言说到java内部类,想必大家首先会想到比较常用的“匿名内部类”,但实际上,这只是内部类的其中一种使用方式...
    java部落阅读 354评论 0 6
  • 2017年2月6号,北京分院的郭安凤院长组织了北京加盟商伙伴的首次聚会,大家一起共享美味的午餐,畅想2017,一起...
    王小红_家庭教育阅读 418评论 0 1
  • 文:丑石 日子 平静无波 一缕阳光 裹挟缘分 扑个满怀 叫醒沉睡的梦 那干涸多年的情感 泛起绿意 拥抱 这段温暖时...
    丑石123阅读 145评论 0 0
  • 1. Tomcat下载 下载地址:http://tomcat.apache.org/,这里我们下载的版本是6.0....
    kylelin阅读 620评论 0 3
  • 如梦令 长雨云天如洗,误入桃源深坻。 落花走枝头,鼓瑟扬风四起。 寻觅,寻觅,今已沉沉醉矣。
    槚生阅读 186评论 3 2