块代码的定义:简单来说就是处于一对{}之间的代码。
内部类的定义:处于另外一个类中的具有类型名称定义块代码。
匿名类的定义:已知父类或者接口标准的内部类,且不具有具体的类型名称的块代码。匿名类的实例创建必须使用new 父类名|接口名 ()来创建。)
一、命名内部类——用于临时创建实例或者类型,且该类型或实例需要控制是否允许使用该类的人调用
1-1:命名局部内部类
public class OutClass{
public int f()
{
private class InnerClass
{
int i=10;
}
return new InnerClass().i;
}
public static void main(String[] args)
{
OutClass o=new OutClass();
System.out.println(o.f());
}
}
此例中对于使用OutClass的人来说,无需关注于InnerClass类的存在,只关注于f()函数具体的返回值;使用者无法访问InnerClass类的成员.
1-2:命名成员内部类
public class OutClass{
public class InnerClass{
int i=10;
}
public int f()
{
return new InnerClass().i;
}
public static void main(String[] args)
{
OutClass o=new OutClass();
System.out.println(o.f());
}
}
此例将简单内部类提升至成员等级,在此等级中,我们可以自由设定该内部类是允许OutClass使用者实例化InnerClass实例,如果为public 类型,则允许实例化,如果为private 类型,则不允许实例化(除开OutClass的成员方法将InnerClass类型的实例作为返回值返回)
内部类实例化的前提条件:内部类实例的存在,必须依赖于外部类实例的存在,也就是说,在没有实例化外部类的情况下,不允许产生内部类实例,同样的,由于静态方法及静态成员的存在必须依赖于包含该静态方法或该静态成员的类型的实例,所以内部类的实例不能存在于外部类的静态方法或静态成员中,同理,非静态的内部类也不能包含静态的成员。
二、匿名内部类——用于临时创建实例,且该实例不希望类的使用者关注
匿名内部类的存在前提有两种:1、已知该类型的父类 或者 2、已知该类型的接口标准
通常对于一个临时的实例,我们并不希望他被使用者关注,比如一个人类Person,我们在处理一些他的特例的时候——比如BlindMan类型的人,而这种类型并不常见,所以我们可以不需要实体创建BlindMan这个类型,而直接使用它的具体实例:
三、静态内部类
静态内部类的出现主要是为了解决内部类的重复实例化问题,对于一个经常调用的内部类,在我们不需要关注其具体内容的时候,重复的多次出现会消耗大量资源,因此利用了静态类的特性——只需要实例化一次,产生了静态内部类,静态内部类中可以声明静态成员也可以存在非静态成员,且静态内部类遵循静态规则既:静态的方法或者类型,不能直接调用其外部的非静态成员。
需要注意的是 静态内部类的存在并不依赖于其外部类的实例,原因是普通类的实例化顺序是先静态成员,再成员变量初始化,再构造;由于在外部类实例化之前就已经产生了静态内部类(将他作为静态成员),因此静态内部类并不具有对外部类的依赖性。
|
|