主要参考了这篇文章。
所谓内部类,即是说,定义在一个类内部的类。
内部类能够访问到外部类的所有数据。
那么内部类是如何做到能够访问外部类的数据的呢?
是这样的,用外围类创建内部类对象时,此内部类对象会秘密的捕获一个指向外围类的引用,于是,可以通过这个引用来访问外围类的成员。
通常,这些都是编译器来处理,我们看不到,也不用关心这个。
正是因为如此,我们创建内部类对象时,必须与外围类对象相关联。
注意:嵌套类(后面会讲到)除外。
----------------------------------------------
在内部类中想要得到外部类的引用,可以使用 外部类名.this 方法来做到。
比如:
private class Inner{ public Test2 getTest2(){ return Test2.this; } public Test2 newTest2(){ return new Test2(); } }
上面的内部类中,getTest2方法返回了当前外部类的引用。而newTest2则方法返回了一个新的Test2对象。
------------------
.new关键字
如果想直接创建一个内部类对象,而不是通过外围类对象的方法来得到,可以使用.new关键字
形式是这样的:
OutClass.InnerClass obj = outClassInstance.new InnerClass();
---------------------------------
方法内部类
在方法中定义一个类,称作方法内部类。
void func() { class Stu { } }
在方法中创建的类,不能加public、private等修饰符。
另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被编译了【后面会有讲解】
------------------------------------
匿名内部类
package comz; public class Main { public static void main(String[] args) { } Stu func() { return new Stu() { @Override public void showme() { // TODO Auto-generated method stub } }; } } interface Stu { public void showme(); }
上面就是一个匿名内部类的例子。
------------------------------------------
嵌套类
static的内部类就叫做嵌套类
前面提到了很多次,嵌套类是个例外
使用嵌套类时有两点需要注意:
a、创建嵌套类对象时,不需要外围类。这与普通的内部类很不同。想创建普通内部类的对象的时候,必须有一个外部类的实例,然后才能 实例.new 内部类()。
b、在嵌套类中,不能像普通内部类一样访问外围类的非static成员
public class StaticClass { private int num; private static int sum = 2; private static class StaticInnerClass{ public int getNum(){ //只能访问sum,不能访问num return sum; } } } public class Test { public static void main(String [] args){ //可以直接通过new来创建嵌套类对象 StaticClass.StaticInnerClass inner = new StaticClass.StaticInnerClass(); inner.getNum(); } }
----------------------------
为何要内部类?
a、内部类提供了某种进入外围类的窗户。
b、也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外围类是否已经继承了某个接口。
因此,内部类使多重继承的解决方案变得更加完整。
在项目中,需要多重继承,如果是两个接口,那么好办,接口支持多重继承。
如果是两个类呢?这时只有使用内部类了。
------------------------------------------------
另外,内部类还可以隐藏一些方法的实现细节。