java中内部类

为什么使用内部类?
每个内部类都能独立的继承一个接口的实现。无论外围类是否已经继承了该接口的实现,对内部类都没有影响,它能够很好的解决多重继承的问题。

内部类的特性:
1.内部类可以有多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
2.单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
3.创建内部类的时刻并不依赖于外围类对象的创建。
4.内部类没有继承关系,它是一个独立的实体。
5.内部类提供了更好的封装,除了该外部类,其他类都不能访问。

内部类的分类:
(一)成员内部类

  1. inner类相当于在Outer类的内部,相当于一个成员变量,inner类可以使用任意访问控制符。
  2. inner类中定义的show方法可以直接访问Outer类中的数据,不受访问控制符的影响。
  3. 定义了成员内部类,必须使用外部类对象创建内部类对象,而不能直接new一个内部类对象,即 内部类 对象名 = 外部类.new 内部类()
  4. 编译完成以后会产生两个.class文件:Outer.class,Outer$Inner.class{}
  5. 成员内部类不能存在任何static的变量和方法,可以定义常量。因为非静态内部类是要依赖于外部类的实例,而静态变量和方法是不依赖于对象的,仅与类有关。常量是在编译器就确定的,放到常量池。
    PS:1)外部类是不能直接使用内部类的成员和方法的,可先创建内部类的对象,然后通过内部类的对象来访问成员变量和方法。
    2)如果外部类和内部类具有相同的成员变量和方法。内部类默认访问自己的成员变量或方法。如需访问外部类的成员变量,可以使用 This关键字。

(二)静态内部类(static修饰的内部类)

1.静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员的方式访问。
2.如果外部类的静态成员于内部类的成员名称相同,可通过 “类名.静态成员” 访问外部类的静态成员,如果不相同,则可通过 “成员名” 直接调用外部类的静态成员。
3.创建静态内部类的对象时,不需要外部类的对象可以直接创建。 内部类 对象名 = new 内部类()

(三)方法内部类(访问仅限于方法内或者该作用域内)

1.方法内部类就像是方法里面的一个局部变量一样,不能有public、Protected、Private、以及 static 修饰。
2.只能访问方法中定义的 final 类型的局部变量。因为当方法被调用运行完毕之后,局部变量就已经消亡了,但内部类对象可能还存在,直到没有被引用才会消亡。此时就会出现一种情况,就是内部类要访问一个不存在的局部变量。使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期。局部内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部。自己的内部的方法调用的实际是自己的属性,而不是外部类方法的参数,为防止被篡改数据而导致内部类得到的值不一致,规定使用final来避免形参的不改变。

(四)匿名内部类

1.匿名累不累是直接使用new来生成一个对象的引用。
2.对于匿名内部类只能被使用一次,创建匿名内部类时,他会立即创建一个该类的实例,该类的定义会立即消失。所以匿名内部类是不能被重复使用。
3.使用匿名内部类时,我们必须是继承一个类或者是实现一个接口。但是两者不可兼得。同时只能继承一个类或者实现一个接口。
4.匿名内部类中不能定义构造函数,也不能存在任何的静态成员变量和静态方法。
5.匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
6.匿名内部类,使用构造代码块来进行初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值