一、什么是内部类
内部类:就是在一个类内部进行其他类结构的嵌套操作。
二、内部类的分类
在Java中内部类主要分为成员内部类类、方法内部类、匿名内部类、静态内部。
(1)成员内部类
public class Out {private String name;public void showName(){System.out.println("my name is : "+name);}public class In{public void sayHello(){System.out.println(name);Out.this.showName();}}
}
我们的成员内部类可以直接访问外部类的成员字段和成员方法,因为它是关联着一个外部类实例的。
(2)方法内部类
1、局部内类不允许使用访问权限修饰符 public private protected 均不允许
2、局部内部类对外完全隐藏,除了创建这个类的方法可以访问它其他的地方是不允许访问的
3、局部内部类与成员内部类不同之处是他可以引用成员变量,但该成员必须声明为 final,并内部不允许修改该变量的值。
public class Out {private String name;public void sayHello(){class In{public void showName(){System.out.println("my name is : "+name);}}In in = new In();in.showName();}
}
方法内部类的生命周期不超过包含它的方法的生命周期,也就是说,方法内部类只能在方法中使用。所以在声明的时候,任何的访问修饰符都是没有意义的,于是Java干脆不允许使用任何的访问修饰符修饰方法内部类。
(3)匿名内部类
1、匿名内部类是没有访问修饰符的。
2、匿名内部类必须继承一个抽象类或者实现一个接口
3、匿名内部类中不能存在任何静态成员或方法
4、匿名内部类没有明面上的构造方法,编译器会自动生成一个引用外部类的构造方法。
5、与局部内部相同匿名内部类也可以引用局部变量。此变量也必须声明为 final。
//首先定义一个普通类
public class Out {private String name;private void sayHello(){System.out.println("my name is :" + name);}
}//定义和使用一个匿名内部类
public static void main(String [] args){Out out = new Out(){@Overridepublic void sayHello(){System.out.println("my name is cyy");}public void showName(){System.out.println("hello single");}};out.sayHello();
}
(4)静态内部类
1、静态内部类可以有静态成员
2、静态内部类可以访问外部类的静态变量,而不可访问外部类的非静态变量;
3、静态内部类的创建不依赖于外部
public class Out {private static String name;private int age;public static class In{private int age;public void sayHello(){System.out.println("my name is : "+name);//--编译报错---//System.out.println("my age is :"+ age);}}
}
三、内部类的创建
(1) 在外部类外部 创建非静态内部类
语法: 外部类.内部类 内部类对象 = new 外部类().new 内部类();
举例: Outer.Inner in = new Outer().new Inner();
(2)在外部类外部 创建静态内部类
语法: 外部类.内部类 内部类对象 = new 外部类.内部类();
举例: Outer.Inner in = new Outer.Inner();
(3)在外部类内部创建内部类语法
在外部类内部创建内部类,就像普通对象一样直接创建:Inner in = new Inner();