java 内部类
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。这样可以有更好的封装性及代码的简洁。但内类部对java虚拟机而言,虚拟机是不知道有内部类这一回事,因为内部类在jvm虚拟机编译后会生成一个独立的.class文件 。
java中根据内部类定义的位置与方式可以分四种内部类:
1:静态内部类
2:成员内部类
3:方法内部类
4:匿名内部类
--------------------------------------------------------------------------------------------------------------------------
静态内部类
第一:静态内部类是不依赖于外部类的,也就是可以不创建外部类对象的情况下创建内部类的对象,且静态内部类不持有指向外部类对象的引用的
第二:静态内部类可以直接访问外部类的静态变量及静态方法,不可以使用外部类的实例变量与实例方法(非static成员)。
成员内部类
成员内部类的常用应用场景:外部类的一些方法的返回值可能是某个接口,为了返回这个接口,外部类方法可以使用内部类实现这个接口,
第一: 成员内部类中不可以定义static静态变量与方法【方法内部类与匿名内部类也都是一样】
第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。
原因:由于内部类的实例化是由外部类实例化之后加载的,如果外部类还没有实例化,这时候调用内部类的静态成员,此时内部类还没有被加载,却要开始创建静态成员,这是矛盾的,所以java中不能存在内部有静态成员的非静态类。
静态变量在编译时,系统就会自动分配内存给他,而内部类(非静态成员)是在宿主类编译完编译的,也就是说,必须有宿主类存在后才能有内部类,这也就和编译时就为静态变量分配内存产生了冲突,因为系统执行:运行宿主类->静态变量内存分配->内部类,而此时内部类的静态变量先于内部类生成,这显然是不可能的,所以不能定义静态变量!
这些内部类是与外部实例相连的,不应独立使用,而静态变量和方法作为类型的属性和方法,一般是独立使用的,在内部类中意义不大,而如果内部类确实需要静态变量与方法,那么可以挪到外部类中
内部类可以无条件地访问外部类的成员,而外部类不是无条件的访问内部类的成员。在外部类中访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问。
方法内部类 也叫局部内部类,类定义在一个方法内部。
1>在方法内部类中调用外部方法中的参数与局部变量时,这些变量必须被声明为final类型。
2>局部内部类就像是方法里面的一个局部变量一样,因此局部内部类的修饰符,不能使用public、protected、private以及static的。而局部内部类中的成员(变量与方法)是没有修饰符限制。
匿名内部类
new 父类(参数列表){
//匿名内部类实现部分
}
new 父接口(){
//匿名部分类实现部分
}
匿名内部类只能被使用一次,用来创建一个对象,它没有名字,没有构造方法,但可以根据参数列表调用对应的父类构造方法
内部类的优势:
内部类可以解决多重继承的问题,如外部类需要多重继承时,而java中是单继承多实现,这时可以考虑使用内部类去实现继承的重载。
评论