内部类

一前言:

在开发中常常遇到内部类,但对一些概念不清晰.做下梳理,并添加一些实践心得.
其他很多场景都会使用内部类,我们在看到使用内部类或者想使用的时候要对其有很清晰的认识.编码清晰性很关键.

参考java提高篇(八)----详解内部类,在此基础上加自己的整理.

二基本概念:

在一个类(a)中定义一个类(b).a为外部类,b为内部类.
Java中类不支持多继承,支持多实现.利用内部类可以曲线多继承.
public class Father {}
public class Mother {}
public class Daughter {
class Mother_ extend Mother{}
class Father_ extend Father{}
}

使用内部类还能够为我们带来如下特性(摘自《Think in java》):
1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
2、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
3、创建内部类对象的时刻并不依赖于外围类对象的创建。
4、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。(不是很理解)
 is a ,是一个。 说明该类是某类的一个特殊例子,简单之为继承。
 has a,有一个。说明该类里含有某个类。简单之为包含,组合。
5、内部类提供了更好的封装,除了该外围类,其他类都不能访问。

内部类是个编译时的概念,一旦编译成功后,它就与外围类属于两个类(有时候是相互联系的)。编译后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。

实例化说明: 人是个类.头可以定义成 简单成员变量 private String xxx,就有局限性.头还有很多功能(方法),那么把头处理成一个类.同时头类不希望其他个体来操控,这个类要方便地使用人的一些对象.
内部类提高了更细微的访问控制.曲道Java多继承.

三.内部类的分类及特性

1.成员内部类
a.成员内部类是依附于外围类,先创建了外围类才能够创建内部类。有从属关系,成员内部类中不能static的变量和方法.
b.内部类作为内部类的一个成员,用外部类对象.new 内部部类()获得能获得(指访问限制private等)的外部类实例.
c.推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时

     return new InnerClass1();
 } ```
d.便捷访问外部类对象和方法,即使私有.内部类对象会持有一个指向外围类对象的引用,可以用这个引用来调用外围类的成员。这个引用明着写为外部类.this.编译就已确定,无运行时成本.
e.外部类要访问内部类的对象和方法则需要通过内部类实例来访问.
f.内部类有与外部类同名对象时,如果不指定为外部类.this,默认为内部类成员.

2.局部内部类
局部内部类是在方法或者作用域内定义,只能在此方法或者作用域被实例化与调用.
局部内部类中不能有访问限定修饰.类中的方法可以有访问限定修饰.但是并无意义,内部类能实例化,就能调用它的对象与方法,即使是私有的.
局部内部类能访问外部类的对象与方法,能访问方法内final成员变量与参数.
局部内部类中不能有static修饰的变量.
3.静态内部类
static修饰的内部类称之为静态内部类,非静态内部类在编译完成之后会隐含地保存着一个引用(外部类.this),该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:
   1. 创建是不依赖外部类。
   2.不能访问外部类的非static对象和方法;
Android中常用来静态内部继承Handle防止内存泄露,因为不会持有外部类(如:Activity)的引用.同时在内部类实例方法的时候将Activity实例传入,使用弱引用包装,就能访问外部类的所有对象与方法.
形似内部,神似外部。
它与定义在外部的静态类用法上相似,区别在于静态内部类与外部类有从属的强联系.这体现在设计与语义上.其他地方引用外部类.静态内部类.
4.匿名内部类
Android中事件接口回调会经常使用匿名内部类.
1.匿名内部类无名字,无构造方法.
2.匿名内部类对接口的实现.返回一个接口的实现实例.形式为new 接口名(){方法实现}
3.可以看做特殊的局部内部类.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  • Java 内部类 分四种:成员内部类、局部内部类、静态内部类和匿名内部类。 1、成员内部类: 即作为外部类的一个成...
    ikaroskun阅读 1,213评论 0 13
  • 今天整理一下内部类,其中包含了内部类的特殊形式,对比普通类有什么区别和作用,内部类和外围类之间的联系,内部类的扩展...
    _小二_阅读 596评论 0 3
  • 在写node.js代码时,我们经常需要自己写模块(module)。同时还需要在模块最后写好模块接口,声明这个模块对...
    DecadeHeart阅读 947评论 0 2
  • 今年九月,我拿上行李,离开了养育自己的故乡,一个人来到异地求学,来接受同义务教育和高中不一样的大学生活,我带着好奇...
    三月烟霞阅读 255评论 0 0
  • 西子的水, 白堤温柔地抚摸着你的衣角。 东赏断桥残雪, 西揽平湖秋月。 西子的水, 苏堤轻轻地拂拭着你的裙底。 南...
    阔步迎送清雅阅读 267评论 0 0