浅谈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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Java 内部类 分四种:成员内部类、局部内部类、静态内部类和匿名内部类。 1、成员内部类: 即作为外部类的一个成...
    ikaroskun阅读 1,182评论 0 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,295评论 18 399
  • 局部内部类 局部内部类是内部类的第二种形式,它让内部类的“隐藏”得更深一层——写在外部类的方法内部,而不是处于和外...
    java部落阅读 384评论 0 2
  • 正文 前言说到java内部类,想必大家首先会想到比较常用的“匿名内部类”,但实际上,这只是内部类的其中一种使用方式...
    java部落阅读 465评论 0 6
  • 2017年2月6号,北京分院的郭安凤院长组织了北京加盟商伙伴的首次聚会,大家一起共享美味的午餐,畅想2017,一起...
    王小红_家庭教育阅读 627评论 0 1