内部类

内部类可以是静态,可以用protected和private修饰。
外部类只能使用public和default修饰。

 

内部类分类:
成员内部类
作为外部类的一个成员存在,与外部类的属性,方法并列。
内部类和外部类的实例变量可以共存。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性
创建外部类对象:
在外部类的内部创建 Inner in = new Inner();
在外部类的外部创建 Outer.Inner in = Outer.new.Inner();

问题:成员内部类为什么不可以有静态属性和静态方法?
1)非静态内部类不能有静态成员!
2)成员内部类必须先实例化外部类对象然后再实例化成员内部类!
当获取static的引用时,必须是在jvm加载了这个类后,然后内部类的加载必须是以外部类的初始化为前提的(非静态内部类作为外部类的成员存在)。
所以当static被引用的时候,就会发生,内部类初始化了,但是外部类还没有初始化这样一个错误。

 

局部内部类
在方法中定义的内部类成为局部内部类。
和局部变量类似,局部内部类前不加修饰符public和private。
在类外不可直接省局局部内部类(保证局部内部类对外是不可见的)
要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。
内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法的执行完毕而销毁。
局部内部类不仅可以访问外部类的实例变量,还可以访问外部类的局部变量(但是要求外部类的局部变量为final)
原因:如果不是声明成final,会报错Cannot refer to a non-final variable x inside an inner class defined in a different method;
其根本原因,是局部内部类对象的生命周期比局部变量的生命周期长。

 

静态内部类
静态内部类定义在类中,任何方法之外,用static定义。
静态内部类只能访问外部类的静态成员。
生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。
静态内部类的对象可以直接生成:
Outer.Inner in = new Outer.Inner();
而不需要通过生成外部类对象来生成。
问题:当类与接口(或者接口与接口)发送方法命名冲突的时候如何处理?


匿名内部类
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
IA被定义为接口。
IA i = new IA(){};
注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或者实现一个类,
没有类名,根据多态,我们使用其父类名。
匿名内部类是唯一一种无构造方法类。
匿名内部类在编译的时候由系统自动起名Out$1.class。

转载于:https://www.cnblogs.com/chaguo/p/10208606.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值