JAVA- 内部类及匿名内部类
普通类,我们平时见到的那种类,就是一个后缀为.java的文件中,直接定义的类,比如
public Cat{ private String name; private int age; }
内部类,
内部类。顾名思义,就是包含在外部类中的类,就叫内部类。内部类有两种,一种是静态内部类,一种是非静态内部类。
静态内部类和非静态内部类的区别主要如下:
1、内部原理的区别:
静态内部类是属于外部类的成员, 是一种静态的成员,是属于类的,就有点类似于private static Singleton instance = null;
非静态内部类,是属于外部类的实例对象的一个实例成员,也就是说,每个非静态内部类, 不是属于外部类的,是属于外部类的第一个实例的,创建非静态内部类的实例以后,非静态内部类实例,是必须跟一个外部类的实例进行关联和有寄存关系的。
2、创建方式的区别
静态内部类
public class School { private static School instance = null; static class Teacher{} }
创建静态内部类的时候,只要直接使用"外部类.内部类()"的方式,就可以,比如new School.Teacher();
非静态内部类
public class School { private String name; class Teacher{} }
创建非静态内部类的时候,必须要先创建一个外部类的实例,然后通过外部类的实例,再来创建内部类的实例,new School().Teacher()
通常来说,我们一般都会为了方便,会选择使用静态内部类。
匿名内部类
接口只有方法,没有方法实现
public interface ISayHello { String sayhello(String name); }
接口实现类在另一个类的内部,甚至在一个方法里面。匿名内部类一定式继承某一个类或者实现接口,必须去实现抽象类的方法或者接口的方法。
匿名内部类的使用场景,通常来说,就是在一个内部类,只要创建一次,使用一次,以后就不再使用的情况下,就可以。那么,此时,通常不会选择在外部创建一个类,而是选择直接创建一个实现了某个接口、或者继承了某个父类的内部类,而且通常是在方法内部,创建一个匿名内部类。