0.Purpose
- 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
- 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
- 方便编写事件驱动程序
- 方便编写线程代码
1.Four Sorts of Inner Class
①成员内部类
内--》外:
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
*当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问
外部类.this.成员变量
外部类.this.成员方法
外--》内:
在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问:
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象
创建成员内部类对象的一般方式如下:
Outter.Inner inner = new Outter.new Inner(); //必须通过Outter对象来创建
访问权限修饰:
内部类:
private:只能外部类内部
public:任何地方可以访问
protected:同一个包下or继承外部类
默认:同一个包下
外部类:
public:任何地方可以访问
默认:同一个包下
②局部内部类
*定义在成员方法中
不能使用任何修饰符(像成员变量和方法)
只能访问方法中声明final的变量(访问权限仅限方法内)
③匿名内部类
*作为一个参数传入方法,需要实现其抽象父类或者接口中的抽象方法,没有实例名,不能被直接new出来
public abstract class Bird {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract int fly();
}
public class Test {
public void test(Bird bird){
System.out.println(bird.getName() + "能够飞 " + bird.fly() + "米");
}
public static void main(String[] args) {
Test test = new Test();
test.test(new Bird() {
public int fly() {
return 10000;
}
public String getName() {
return "大雁";
}
});
}
}
------------------
Output:
大雁能够飞 10000米
new出来的对象等同于
public class WildGoose extends Bird{
public int fly() {
return 10000;
}
public String getName() {
return "大雁";
}
}
④静态内部类
静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象
(Outter.Inner inner = new Outter.Inner();)
如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。

2.The Theory of Inner Class
内部类是如何访问外部类的变量的:
编译器会默认为成员内部类添加了一个指向外部类对象的引用,编译器会默认添加一个参数,该参数的类型为指向外部类对象的一个引用
本文详细解析了Java内部类的四种类型:成员内部类、局部内部类、匿名内部类和静态内部类,阐述了它们的特点、访问权限及应用场景,特别强调了内部类如何解决多继承问题,以及内部类与外部类成员的访问机制。
2243

被折叠的 条评论
为什么被折叠?



