一、
放在一个类的内部的类我们就叫内部类。
根据定义分为如下四类:
1.静态内部类:它相当于外部类的静态成员一样,由static修饰,隶属于外部类,使用起来相当于一个独立的外部类。
2.成员内部类:它相当于外部类普通的成员一样,隶属于外部类的具体对象,在定义它的时候,需要先创建外部类对象,再创建它的实例。
3.局部内部类:它定义在一个方法的方法体中,它往往仅作为方法短暂的使用,只能访问final修饰的局部变量。
4.匿名内部类:它也定义在方法体中,但是它没有一个具体的名字,具有非常大的灵活性,工作本质与局部内部类相似。
二、作用
1.内部类可以很好的实现隐藏一般的非内部类,是不允许有 private 与protected权限的,但内部类可以。
2.内部类拥有外围类的所有元素的访问权限。
3.可以实现多重继承。
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
三、例子
1.实现隐藏
接口
package insidecategory;
public interface Incrementable
{
}
具体类
package insidecategory;
public class Example {
}
上面加粗的部分是内部类,访问修饰符是private
客户端程序
package insidecategory;
public class TestExample {
}
加粗的那部分就是客户端调用的代码,从这段代码里面我只知道Example的getIn()方法能返回一个InterfaceTest 实例但我并不知道这个实例是这么实现的。而且由于InsideClass 是private的,所以我们如果不看代码的话根本看不到这个具体类的名字,所以说它可以很好的实现隐藏。
2.可以无条件地访问外围类的所有元素
package insidecategory;
public class TagBean {
}
看上面加粗部分,name这个变量是在TagBean里面定义的私有变量。这个变量在内部类中可以无条件地访问System.out.println(name);
类一
public class Example1 {
}
类二
package insidecategory;
public class Example2 {
}
类三
public class MainExample
{
}
大 家注意看类三,里面分别实现了两个内部类 test1,和test2 ,test1类又继承了Example1,test2继承了Example2,这样我们的类三MainExample就拥有了Example1和 Example2的方法和属性,也就间接地实现了多继承。
四、
接口
public interface Incrementable
{
}
类
public class MyIncrement {
}
大家看上面加黑的部分,两个方法都是一样的。在看下面这个类要继承这两个类
如果不用内部类
package insidecategory;
public class Callee2 extends MyIncrement implements Incrementable
{
public void increment()
}
想问一下大家increment()这个方法是属于覆盖MyIncrement这里的方法呢?还是Incrementable这里的方法。我怎么能调到MyIncrement这里的方法?显然这是不好区分的。而我们如果用内部类就很好解决这一问题了。看下面代码
package insidecategory;
public class Callee2 extends MyIncrement
{
}
我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了。