Java基础之内部类(InnerClass)

一、内部类介绍

内部类:将一个类的定义放在另一个类的定义内部。

内部类是个编译时的概念,一旦编译成功后,它就与外围类属于两个完全不同的类(当然他们之间还是有联系的)。对于一个名为OuterClass的外围类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。

内部类的作用

1.内部类可以很好的实现隐藏,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以。

2.内部类拥有外围类的所有元素的访问权限。

3.每个内部类都能独立继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。也就是实现多重继承。

4.可以避免修改接口而实现同一个类中两种同名方法的调用。

二、四大内部类详解

1、成员内部类

定义:定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类。
案例如下:

public class MembersOuter {

    private int count;
    
    private Inner inner;
    
    public MembersOuter() {
        this.inner = new Inner();
    }

    /**
     * 计数
     */
    public int count(){
        count = inner.num;
        return count;
    }
    
    public void culcater(){
        count ++;
    }
        
    public class Inner{
        public int num = 2;
        
        public int innerCount(){
            culcater();
            return count++;
        }
        
        public int innerCount2(){
            return ++count;
        }
    }
    
    public static void main(String[] args) {
        MembersOuter out = new MembersOuter();  
        MembersOuter.Inner inner1 = new MembersOuter().new Inner();//创建内部类实例
        MembersOuter.Inner inner2 = out.new Inner();              //创建内部类实例
        System.out.println(out.count());
        System.out.println(out.inner.innerCount());
        System.out.println(out.inner.innerCount2());
    }
}

案例输出结果:

2
2
4

要点:

  1. 成员内部类中不能存在static关键字,即,不能声明静态属性、静态方法、静态代码块等。
    【非静态内部类也可以定义静态成员同时需要有final关键词修饰,静态方法鉴于无法用final修饰,仍必须是在静态内部类 或者非内部类中定义。】
  2. 创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)。
    可以理解为隐式地保存了一个引用,指向创建它的外部类对象。
  3. 在成员内部类中访问外部类的成员方法和属性时使用:外部类名.this.成员方法/属性。也可直接调用。
  4. 内部类在编译之后生成一个单独的class文件,里面包含该类的定义,所以内部类中定义的方法和变量可以跟父类的方法和变量相同。
    例如上面定义的三个类的class文件分别是:MembersOuterClass .classs和MembersOuterClass $InnerClass.class三个文件。
  5. 外部类无法直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问。
  6. 与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)”。

2、静态内部类

定义:使用static修饰的成员内部类叫静态内部类。
案例如下:


案例输出结果:


要点
1、静态内部类可以有静态成员和静态方法。
2、静态内部类不可以访问外部类非静态的属性和方法。
3、外部类访问静态内部类需要通过内部类的一个实例来访问。
4、实例创建不需要通过外部类引用。

3、局部内部类

定义:定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。
要点
1. 局部内部类只能在代码代码块、方法体内和作用域中使用(如创建对象和使用类对象等)
2. 局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰。
3. 可以使用abstract修饰,声明为抽象类。

4、匿名内部类

定义:匿名内部类没有名字,而且只能使用一次,创建实例后,类定义会立即消失。

要点
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

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

推荐阅读更多精彩内容

  • Java 内部类 分四种:成员内部类、局部内部类、静态内部类和匿名内部类。 1、成员内部类: 即作为外部类的一个成...
    ikaroskun阅读 1,219评论 0 13
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,627评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 一、继承 当两个事物之间存在一定的所属关系,即就像孩子从父母那里得到遗传基因一样,当然,java要遗传的更完美,这...
    玉圣阅读 1,045评论 0 2
  • 坐磁悬浮列车去东京机场,在等候区的地面上有两种颜色标注排队,蓝色是马上就到的车次,红色是下一趟到达的列车,这样可以...
    明哲道阅读 348评论 0 0