JAVA内部类(随笔)

内部类(将一个类定义到另一个类中)

主类中创建内部类对象语法:外部类.内部类 变量名 = (new 外部类对象()).new 内部类对象();
.本类可以通过直接创建内部类对象访问内部类属性和方法
.内部类的方法可以访问外部类的属性和方法

  1. 实例内部类:定义在类的内部,方法或代码块外部,没有static修饰的类
    主类中创建内部类对象语法:外部类.内部类 变量名 = (new 外部类对象()).new 内部类对象();
    实例内部类就是定义在类的内部、方法或者代码块外部,没有static修饰的类。它作为外部类的一个成员存在,和其外部类的属性、方法并列。实例内部类必须依附外部类的
    实例而存在,即要获得内部类的实例,必须先获得外部类的实例。实例内部类能访问外部类的一切成员,包括private修饰的成员,但不能有静态属性。
    在内部类中访问与局部变量命名冲突的实例变量,使用this.属性,这和普通类相同。在内部类访问外部类中与内部类命名冲突的成员.使用外部类名.this.属性。在外部类的外部访问内部类,使用外部类名.内部类名。在外部类以外的地方构建实例内部类实例,使用外部类名实例(对象).new内部类名()。
  2. 静态内部类:定义在类的内部,方法或代码块外部,利用static修饰的类
    主类中创建内部类对象语法:外部类.内部类 变量名 = new 外部类对象.new 内部类对象();
    静态内部类就是定义在类的内部、方法或者代码块外部.利用static修饰的类。静态内部类只能访问外部类的静态成员.静态内部类实例化对象不需要构建外部类实例就可直接构建静态内部类的实例,这是它与实例内部类的区别。静态内部类的对象可以直接生成,而不需要通过生成外部类对象来生成。这样实际上静态内部类成了一个顶级类。静态内部类不能使用private来修饰.
    静态内部类不依赖外部类的实例,只是定义在一个类的内部而已,也可以说是隐藏在一个类的内部。它使用起来和普通类一样,通过外部类名.内部类名即可。
  3. 局部内部类:定义在方法或代码块内部的类
    范围:局部内部类与局部变量类似,不能使用访问控制修饰符public.protected.private和static,其范围为定义它的代码块。
    局部内部类可以访问外部类的一切成员,包括private修饰的成员,还可以访问局部内部类所在的方法或代码块中由final修饰的局部变屋(即常量)。
    局部内部类的可见范围在其所在方法或代码块的内部,在类外不可直接访问局部内部类(保证局部内部类对外是不可见的),只有其所在方法或代码块的内部才能调用其局部内部类。
    局部内部类最大的优点就是类名和成员名只是局部可见,最大限度地降低了命名冲突的风险。但是缺点同样突出,局部内部类不能被重用.局部内部类在实际开发中很少使用.
  4. 匿名内部类:定义在方法或代码块内部
    匿名内部类和局部内部类一样,但是该类没有名字,只能在其所在处使用一次。一个匿名内部类一定是在new的后面隐含着继承一个抽象父类或者实现一个接口,没有类名,根据多态特征,使用其抽象父类名或所实现接口的名字。
    利用抽象父类或所实现接口的名字代替new后面的名字来创建对象,利用抽象父类或所实现接口声明变量格式如下:
    抽象父类名|所实现接口名 引用名 = new抽象父类名|所实现接口名(){…}; //"{…}"是对抽象父类或所实现接口中抽象方法的实现代码。new是一个完整的语句,注意一定要在大括号后加分号.
    匿名内部类作为内部类的一种特殊形式,是局部内部类的一种简化。匿名内部类定义时只能实现一个接口或继承一个抽象父类,不能实现多个接口或继承抽象父类.匿名内部类继承的抽象父类或所实现接口中的抽象方法实现应比较简单,这样的代码比较简洁,层次比较清晰。如果继承的抽象父类或所实现接口中的抽象方法实现代码比较复杂,那么匿名内部类就比较混乱,此时应使用普通类来替代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值