内部类的分类
内部类,顾名思义就是在一个类的内部声明一个类。内部类主要分为:
静态内部类
匿名内部类
成员内部类
局部内部类
内部类的特点:
内部类可以直接访问外部类的成员,包括private修饰的变量和方法
在编写swing程序时内部类出现的频率比较高,不过目前大部分软件公司基本都不会使用swing,所以本节内容简单了解即可。
静态内部类
1.静态内部类可以等同看做静态变量
2.静态内部类可以直接访问外部类的静态数据
public class OuterClass{
//静态变量 private static String s1 = "A";
//成员变量 private String s2 = "B";
//静态方法 privatestaticvoidm1(){
System.out.println("静态方法m1");
}
//成员方法 privatevoidm2(){
System.out.println("m2方法");
}
//静态内部类 //可以用访问控制权限的修饰符修饰。 //public,protected,private,缺省 static class InnerClass{
//静态方法 publicstaticvoidm3(){
System.out.println(s1);
m1();
}
//成员方法 publicvoidm4(){
System.out.println(s1);
m1();
}
}
publicstaticvoidmain(String[] args){
//执行m3 OuterClass.InnerClass.m3();
//执行m4 InnerClass inner = new OuterClass.InnerClass();
inner.m4();
}
}
成员内部类
1.成员内部类可以等同看做成员变量
2.成员内部类中不能有静态声明
3.成员内部类可以访问外部类所有的数据
public class OuterClass{
//静态变量 private static String s1 = "A";
//成员变量 private String s2 = "B";
//静态方法 privatestaticvoidm1(){
System.out.println("静态方法m1");
}
//成员方法 privatevoidm2(){
System.out.println("m2方法");
}
//成员内部类 //可以用访问控制权限的修饰符修饰。 //public,protected,private,缺省 class InnerClass{
//静态方法 //public static void m3(){} //成员方法 publicvoidm4(){
System.out.println(s1);
m1();
System.out.println(s2);
m2();
}
}
publicstaticvoidmain(String[] args){
//创建外部类对象 OuterClass oc = new OuterClass();
InnerClass inner = oc.new InnerClass();
inner.m4();
}
}
匿名内部类
一个没有名字的类就叫做匿名内部类
public class Test{
//静态方法 publicstaticvoidm1(Animal a){
a.eat();
}
//入口 publicstaticvoidmain(String[] args){
//使用匿名内部类的方式执行m1方法 //整个这个"new Animal(){}"就是个匿名内部类 m1(new Animal(){
publicvoideat(){
System.out.println("吃猫粮");
}
});
//匿名内部类的优点:少定义一个类. //缺点:无法重复使用! }
}//接口interface Animal{
voideat();
}
局部内部类
局部内部类在访问局部变量的时候,局部变量必须使用final修饰,在JDK8之后,这个限制被取消了
public class OuterClass{
//方法 publicvoidm1(){
//局部变量 final int i = 10;
//局部内部类 //局部内部类不能用访问控制权限修饰符修饰。 class InnerClass{
//内部类不能有静态声明 //public static void m1(){} //成员方法 publicvoidm2(){
System.out.println(i); // 10 }
}
//调用m2 InnerClass inner = new InnerClass();
inner.m2();
}
publicstaticvoidmain(String[] args){
OuterClass oc = new OuterClass();
oc.m1();
}
}