---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、定义:
一个类的定义放在另一个类的内部,这个类就称作内部类。
二、内部类的特性:
1. 它了解外围类,并能与之通信。
2. 当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。
3. 内部类自动拥有对其外围类所有成员的访问权。
三、内部类的种类:
(1)局部内部类
在一个方法的作用域内创建一个完整的类,这个类成为局部内部类。
例如:
publicclassA{
publicvoid showA(){
class B{}
}
}
说明:外围类A中有个方法showA(),在showA()方法的作用域内定义了一个B类。
(2)匿名内部类
例如:
两种描述方法:
(1) 如果返回的对象是一个接口,那么该语法指的是创建一个实现自接口TestAInter的匿名类的对象。
例如:
//接口
publicinterfaceTestAInter{}
//类
publicclass TestA {
private Stringa;
public TestAInter getTestAInter(){
returnnew TestAInter(){};
}
}
(2)如果返回的对象是一个接口,那么该语法指的是创建一个实现自TestAInter的匿名类的对象。
例如:
//类
publicclass TestB {}
//类
publicclass TestA {
private Stringa;
public TestB getTestAInter(){
returnnew TestB(){};
}
}
匿名内部类创建构造器的方法
(3)嵌套类
一个内部类被声明为static,这个类通常称为嵌套类。
和普通内部类的区别:
(1) 要创建嵌套类的对象,并不需要其外围类的对象。
(2) 不能从嵌套类的对象中访问非静态的外围类对象。
(3) 普通内部类的字段和方法只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类。但是嵌套类可以包含所有这些东西。
(4)接口内部类(放在接口中的类)
如果你想要创建某些公共代码,使得它们可以被某个接口的所有不同实现所共用,那么使用接口内部的嵌套类会显得很方便。
注意:放到接口中的任何类都自动地是public和static的。
四、为什么需要内部类?
每个内部类都能独立的继承自一个(接口的)实现,所有无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多重继承的解决方案变得完整。也就是说内部类允许继承多个非接口类型(类或抽象类)。
内部类会被覆盖吗?
在没有明确两个内部类是继承关系时,答案是不能覆盖的,因为每一个内部类是完全独立的实体。
局部内部类
局部内部类不能有访问说明符,因为它不是外围类的一部分;但是它可以访问当前代码块内的常量,以及此外围类的所有成员。
五、内部类标示符
内部类编译成class文件后的命名规则:
外围类的名字,加上“$”,再加上内部类的名字。如果内部类是匿名的,编译器会简单地产生一个数字作为其标示符。如果内部类是嵌套在别的内部类之中,只需直接将它们的名字加载其外围类标示符与“$”的后面。
例如:
Counter.class,无内部类。
LocalInnerClass$1.class,类LocalInnerClass中有一个匿名内部类。
LocalInnerClass$LocalCounter.class,类LocalInnerClass中有一个内部类LocalCounter
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>