把一个类放在另一个类内部定义,这个定义在其他类内部的类就被称为内部类,包含外部类的类被称为外部类。内部类主要有以下作用:
1内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中其他类访问。
2内部类可以直接访问外部类的私有数据,因为内部类被当成外部类的成员。
3匿名内部类适合用于创建那些仅需要一次使用的类。
内部类比外部类多三个使用的修饰符:private、protected、static,非静态内部类不能拥有静态成员。
1非静态内部类
定义内部类,只需要将一个类放在另一个类内部定义即可,此处的类内部包括类中任何地方。格式:public class OuterClass{//内部类定义}
调用:在外部类里调用非静态内部类跟使用普通类没有太大区别,eg:
var c1=new CowOne();//内部类
c1.info()//内部类函数
注:若外部类、内部类成员变量与内部类方法里的局部变量同名,调用它们的方法如下:
(1)在非静态内部类的方法中面调用外部类变量方法:OuterclassName. this. varName;
(2)调用内部类的实例变量方法:this. varName;
(3)方法里变量跟普通变量一样使用。varName;
2静态内部类
使用static修饰的内部类,则这个内部类就属于外部类本身,不属于外部类的某个对象。静态内部类里面可以包含静态成员,也可以包括非静态成员。静态内部类不能访问外部类的实例变量,只能访问外部类成员。定义格式:public class OuterClass{
static class staticInnerClass{
//静态内部类里面定义}
}
调用:使用静态内部类的类名作为调用者(SStaticClass.varName)或者使用静态内部类对象调用(new StaticClass().varName)。
在外部类
以外调用静态内部类和非静态内部类方法:OuterClass. InnerClass varName。
eg:OutClass. InnerClass in =new Out().new InnerClass();//在外部类以外调用内部类。
3局部内部类
把一个内部类放在方法里定义,则这个内部类就是局部内部类,局部内部类在方法内才有效,不能在外部类方法以外使用,所以局部内部类不能使用访问控制符和static修饰符修饰。实际开发中很少使用。
4匿名内部类
匿名内部类适合于创建那种只需一次使用的类,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。格式:new 实现接口() | 父类构造器(实参列表){//匿名内部类的类体部分}
注意:匿名内部类不能是抽象类,所以匿名内部类必须实现它的抽象父类或者接口里包含的所有抽象方法。匿名内部类不能定义构造器。