内部类分为:静态成员内部类,非静态成员内部类,局部内部类,匿名内部类。非静态成员内部类和静态成员内部类属于类的成员,而匿名内部类属于局部内部类,存在于类的某个方法中。他们的作用就在于可以非常方便的使用外部类的成员。
非静态成员内部类
1.非静态成员内部类作为类的成员可以使用4种权限修饰符来进行修饰,相比于外部类,外部类只能使用两个权限修饰符(public和默认)来修饰。
2.非静态成员内部类可以有自己的成员变量,构造方法,成员函数。但不能有静态的方法,从时间角度上理解,静态方法创建是内部类还没有被初始化。
3.在非静态成员内部类的方法中可以直接访问外部类的成员:成员变量,成员方法,构造方法。
public void insideMethod(){
//内部类可以直接访问外部类的成员:成员变量,成员方法,构造方法
System.out.println(name);//成员变量
outsideClassMethod();//成员方法
OutsideClass outsideClass=new OutsideClass("锅盖",19);//构造方法
}
4.外部类不可以直接访问内部类的成员,必须先创建一个内部类对象,使用对象名来访问内部类成员。
public void outsideClassMethod(){
InsideClass insideClass=new InsideClass();
insideClass.show();
System.out.println(insideClass.age);
System.out.println(insideClass.color);
}
5.同名属性的访问方式:(该show方法是内部类的方法)
public void show(){
int age=30;
System.out.println(age);//局部变量
System.out.println(this.age);//内部类的变量
System.out.println(OutsideClass.this.age);//外部类的变量
}
6.测试类中如何创建内部类对象:
创建内部类对象的前提是,先创建外部类的对象。具体代码:OutsideClass.InsideClass oc2=new OutsideClass().new InsideClass();
7.外部类的静态方法不可以访问非静态内部类,包括不能创建内部类的实例,也就不能访问内部类的成员方法,成员变量。
静态成员内部类
1.静态成员内部类像其他的静态成员一样,是属于类的。
static class InsideClass
2.静态成员内部类可以有静态方法。
3.静态成员内部类(静态方法和非静态方法)只能访问外部类静态的成员。
public void insideMethod2(){
System.out.println(name);
}
4.静态成员内部类的方法中可以通过外部类的类名直接调用外部类的静态成员,也可通过对象名来调用。
public static void insideMethod(){
//内部类可以直接访问外部类的成员:成员变量,成员方法,构造方法
System.out.println(name);
outsideClassMethod();
OutsideClass outsideClass=new OutsideClass("锅盖",19);
}
5.在Test类中可以通过类名直接创建内部类对象。
OutsideClass.InsideClass oc= new OutsideClass.InsideClass();
局部内部类
1.写在方法内的,作用范围只是当前的方法。出了当前方法创建局部内部类的对象就是错的。
2.局部内部类和其他局部成员一样,不用权限修饰符修饰
3.局部内部类中访问当前方法的成员时,当前方法的成员是用final修饰的。
4.相同类名的访问方式:
public void OusideMethod(){
int age1=30;
//局部内部类和其他局部成员一样,不用权限修饰符修饰
//局部内部类的作用范围就只有当前方法。
class InsideClass{
int age=20;
public void LocalMathod(){
int age=30;
System.out.println(age);
System.out.println(this.age);
System.out.println(OutsideClass.this.age);
System.out.println(age1);
}
}
InsideClass insideClass=new InsideClass();
}
匿名内部类
1.匿名内部类是一种特殊的局部内部类。
Comparator comparator=new Comparator()
2.不可以使用权限修饰符。
3.匿名内部类可以实现一个接口,也可以继承一个类(包括抽象类)。
4.匿名内部类只能实现一个接口。并且实现接口中所有的方法。匿名内部类不能是抽象类。
5.匿名内部类没有构造方法,应为他压根就没有名字。
6.想要进行初始化操作可以使用代码块。
7.可以直接用接口名来调用匿名内部类中实现的方法。
int result3= comparator.compare(people1,people2);
8.匿名内部类中访问当前方法的成员时,当前方法的成员是用final修饰的。
总结:内部类的作用和使用场合
1.非静态成员内部类,可以使用权限修饰符进行修饰,如果用private
修饰,这样内部类的属性,只有在当前的外部类中使用,提供了更小的封装性。
2.内部类可以直接访问外部类的成员,但外部类需要先创建对象才可以访问内部类的成员。
3.内部类更好的解决了多重继承的问题。因为外部类可以继承父类,内部类同样可以。而且内部类可以访问外部类父类的属性。
4.用匿名内部类可以可以实现Java中回调的功能。
5.如果一个类B只为一个类A服务的话,可以优先考虑把类B、作为类A的内部类。
6.外部类是否已经继承了父类或实现了接口,对内部类没有任何影响。内部类是不需要在实现接口的抽象方法的。因为外部类已经实现了。