Java的内部类主要分为四种,分别是:静态内部类、成员内部类、局部内部类、匿名内部类。
静态内部类
定义在类内部的静态类被称为静态内部类。静态内部类可以访问外部类的静态变量和方法;在静态内部类中可以定义静态变量、方法、构造函数等;静态内部类通过【外部类.静态内部类】的方式来调用。
代码案例如下:
package com;
public class OuterClass {
private static String className = "staticInnerClass";
//定义一个静态内部类
public static class StaticInnerClass{
public void getClassName(){
System.out.println("className:"+className);
}
}
public static void main(String[] args) {
//外部类.静态内部类访问
OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass();
staticInnerClass.getClassName();
}
}
成员内部类
定义在类内部的非静态类叫作成员内部类,成员内部类不能定义静态方法和变量(final修饰的除外),因为成员内部类是非静态的,而Java的非静态代码块中不能定义静态方法和变量。
代码案例如下:
package com;
public class OutClass {
private static int a;
private int b;
public class MemberInnerClass{
public void print(){
System.out.println(a);
System.out.println(b);
}
}
}
局部内部类
定义在方法中的类叫作局部内部类。当一个类只需要在某个方法中使用某个特定的类时,可以通过局部类来优雅地实现。
代码案例如下:
package com;
public class OutClass {
private static int a;
private int b;
public void partClassTest(final int c){
final int d = 1;
//在partClassTest方法中定义一个局部内部类PastClass
class PastClass{
public void print(){
System.out.println(c);
}
}
}
}
匿名内部类
匿名内部类指通过继承一个父类或者实现一个接口的方式直接定义并使用的类。匿名内部类没有class关键字,这是因为匿名内部类直接使用new生成一个对象的引用。
代码案例如下:
package com;
public abstract class Work {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract int workTime();
}
package com;
public class WorkTest {
public static void main(String[] args) {
WorkTest workTest = new WorkTest();
workTest.test(new Work() {
@Override
public int workTime() {
return 8;
}
@Override
public String getName() {
return "alex";
}
});
}
public void test(Work work){
System.out.println(work.getName()+"工作时间:"+work.workTime());
}
}