您的位置:

Java内部类

一、Java内部类是什么

Java内部类是指定义在另一个类中的类。内部类可以访问包含它的外部类的所有变量和方法,包括私有变量和方法。内部类也可以用来实现一些设计模式,比如单例模式和工厂模式等。

二、Java内部类的分类

Java内部类可以分为四种类型:成员内部类、方法内部类、匿名内部类和静态内部类。

1. 成员内部类

成员内部类是最常用的一种内部类。它的定义方式如下:

public class Outer {
    private int x;

    public class Inner {
        public void print() {
            System.out.println("x = " + x);
        }
    }
}

通过编译器自动生成的类名可以看出,成员内部类是和外部类关联在一起的。这也就意味着,成员内部类可以用来访问外部类的所有成员变量和方法。

2. 方法内部类

方法内部类只能在定义该内部类的方法中使用,它的定义方式如下:

public class Outer {
    private int x;

    public void print() {
        class Inner {
            public void display() {
                System.out.println("x = " + x);
            }
        }

        Inner inner = new Inner();
        inner.display();
    }
}

方法内部类只能在定义它的方法中使用,也就是说,方法内部类的作用范围被限制在了方法内部。

3. 匿名内部类

匿名内部类是一种没有类名的内部类。它的定义方式比较特殊,通常用来实现接口或者抽象类中的方法,如下所示:

interface Person {
    void sayHello();
}

public class Outer {
    public void sayHello() {
        new Person() {
            public void sayHello() {
                System.out.println("Hello World!");
            }
        }.sayHello();
    }
}

匿名内部类的特点是没有类名,并且它是在声明时直接定义的。这也使得它只能在定义它的地方使用。

4. 静态内部类

静态内部类是定义在类内部的一个静态类。它的定义方式如下:

public class Outer {
    private static int x;

    public static class Inner {
        public void print() {
            System.out.println("x = " + x);
        }
    }
}

由于静态内部类是静态的,所以它可以直接访问外部类的静态变量和静态方法。

三、Java内部类的优缺点

Java内部类相比于普通类,有如下优缺点:

1. 优点

  1. 内部类可以访问外部类的私有变量和方法,这样可以保证程序的安全性。
  2. 内部类可以实现一些设计模式,比如单例模式和工厂模式等。
  3. 内部类可以提高代码的可读性和可维护性。

2. 缺点

  1. 内部类会增加程序的复杂度。
  2. 内部类会增加程序的运行时间和内存消耗。
  3. 内部类的作用域只限于包含它的类,这可能会导致代码复用性不高。

四、Java内部类的代码示例

1. 成员内部类示例

public class Outer {
    private int x;

    public class Inner {
        public void print() {
            System.out.println("x = " + x);
        }
    }

    public void execute() {
        Inner inner = new Inner();
        inner.print();
    }
}

2. 方法内部类示例

public class Outer {
    private int x;

    public void print() {
        class Inner {
            public void display() {
                System.out.println("x = " + x);
            }
        }

        Inner inner = new Inner();
        inner.display();
    }
}

3. 匿名内部类示例

interface Person {
    void sayHello();
}

public class Outer {
    public void sayHello() {
        new Person() {
            public void sayHello() {
                System.out.println("Hello World!");
            }
        }.sayHello();
    }
}

4. 静态内部类示例

public class Outer {
    private static int x;

    public static class Inner {
        public void print() {
            System.out.println("x = " + x);
        }
    }
}